You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7646 lines
1.2 MiB

  1. <!doctype html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
  5. <meta http-equiv='X-UA-Compatible' content='IE=emulateIE7' />
  6. <title>Coverage for youtube_dl.InfoExtractors: 44%</title>
  7. <link rel='stylesheet' href='style.css' type='text/css'>
  8. <script type='text/javascript' src='jquery-1.4.3.min.js'></script>
  9. <script type='text/javascript' src='jquery.hotkeys.js'></script>
  10. <script type='text/javascript' src='jquery.isonscreen.js'></script>
  11. <script type='text/javascript' src='coverage_html.js'></script>
  12. <script type='text/javascript' charset='utf-8'>
  13. jQuery(document).ready(coverage.pyfile_ready);
  14. </script>
  15. </head>
  16. <body id='pyfile'>
  17. <div id='header'>
  18. <div class='content'>
  19. <h1>Coverage for <b>youtube_dl.InfoExtractors</b> :
  20. <span class='pc_cov'>44%</span>
  21. </h1>
  22. <img id='keyboard_icon' src='keybd_closed.png'>
  23. <h2 class='stats'>
  24. 2275 statements &nbsp;
  25. <span class='run hide_run shortkey_r button_toggle_run'>1002 run</span>
  26. <span class='mis shortkey_m button_toggle_mis'>1273 missing</span>
  27. <span class='exc shortkey_x button_toggle_exc'>0 excluded</span>
  28. </h2>
  29. </div>
  30. </div>
  31. <div class='help_panel'>
  32. <img id='panel_icon' src='keybd_open.png'>
  33. <p class='legend'>Hot-keys on this page</p>
  34. <div>
  35. <p class='keyhelp'>
  36. <span class='key'>r</span>
  37. <span class='key'>m</span>
  38. <span class='key'>x</span>
  39. <span class='key'>p</span> &nbsp; toggle line displays
  40. </p>
  41. <p class='keyhelp'>
  42. <span class='key'>j</span>
  43. <span class='key'>k</span> &nbsp; next/prev highlighted chunk
  44. </p>
  45. <p class='keyhelp'>
  46. <span class='key'>0</span> &nbsp; (zero) top of page
  47. </p>
  48. <p class='keyhelp'>
  49. <span class='key'>1</span> &nbsp; (one) first highlighted chunk
  50. </p>
  51. </div>
  52. </div>
  53. <div id='source'>
  54. <table cellspacing='0' cellpadding='0'>
  55. <tr>
  56. <td class='linenos' valign='top'>
  57. <p id='n1' class='pln'><a href='#n1'>1</a></p>
  58. <p id='n2' class='pln'><a href='#n2'>2</a></p>
  59. <p id='n3' class='pln'><a href='#n3'>3</a></p>
  60. <p id='n4' class='stm run hide_run'><a href='#n4'>4</a></p>
  61. <p id='n5' class='pln'><a href='#n5'>5</a></p>
  62. <p id='n6' class='stm run hide_run'><a href='#n6'>6</a></p>
  63. <p id='n7' class='stm run hide_run'><a href='#n7'>7</a></p>
  64. <p id='n8' class='stm run hide_run'><a href='#n8'>8</a></p>
  65. <p id='n9' class='stm run hide_run'><a href='#n9'>9</a></p>
  66. <p id='n10' class='stm run hide_run'><a href='#n10'>10</a></p>
  67. <p id='n11' class='stm run hide_run'><a href='#n11'>11</a></p>
  68. <p id='n12' class='stm run hide_run'><a href='#n12'>12</a></p>
  69. <p id='n13' class='stm run hide_run'><a href='#n13'>13</a></p>
  70. <p id='n14' class='stm run hide_run'><a href='#n14'>14</a></p>
  71. <p id='n15' class='stm run hide_run'><a href='#n15'>15</a></p>
  72. <p id='n16' class='stm run hide_run'><a href='#n16'>16</a></p>
  73. <p id='n17' class='pln'><a href='#n17'>17</a></p>
  74. <p id='n18' class='stm run hide_run'><a href='#n18'>18</a></p>
  75. <p id='n19' class='pln'><a href='#n19'>19</a></p>
  76. <p id='n20' class='pln'><a href='#n20'>20</a></p>
  77. <p id='n21' class='stm run hide_run'><a href='#n21'>21</a></p>
  78. <p id='n22' class='pln'><a href='#n22'>22</a></p>
  79. <p id='n23' class='pln'><a href='#n23'>23</a></p>
  80. <p id='n24' class='pln'><a href='#n24'>24</a></p>
  81. <p id='n25' class='pln'><a href='#n25'>25</a></p>
  82. <p id='n26' class='pln'><a href='#n26'>26</a></p>
  83. <p id='n27' class='pln'><a href='#n27'>27</a></p>
  84. <p id='n28' class='pln'><a href='#n28'>28</a></p>
  85. <p id='n29' class='pln'><a href='#n29'>29</a></p>
  86. <p id='n30' class='pln'><a href='#n30'>30</a></p>
  87. <p id='n31' class='pln'><a href='#n31'>31</a></p>
  88. <p id='n32' class='pln'><a href='#n32'>32</a></p>
  89. <p id='n33' class='pln'><a href='#n33'>33</a></p>
  90. <p id='n34' class='pln'><a href='#n34'>34</a></p>
  91. <p id='n35' class='pln'><a href='#n35'>35</a></p>
  92. <p id='n36' class='pln'><a href='#n36'>36</a></p>
  93. <p id='n37' class='pln'><a href='#n37'>37</a></p>
  94. <p id='n38' class='pln'><a href='#n38'>38</a></p>
  95. <p id='n39' class='pln'><a href='#n39'>39</a></p>
  96. <p id='n40' class='pln'><a href='#n40'>40</a></p>
  97. <p id='n41' class='pln'><a href='#n41'>41</a></p>
  98. <p id='n42' class='pln'><a href='#n42'>42</a></p>
  99. <p id='n43' class='pln'><a href='#n43'>43</a></p>
  100. <p id='n44' class='pln'><a href='#n44'>44</a></p>
  101. <p id='n45' class='pln'><a href='#n45'>45</a></p>
  102. <p id='n46' class='pln'><a href='#n46'>46</a></p>
  103. <p id='n47' class='pln'><a href='#n47'>47</a></p>
  104. <p id='n48' class='pln'><a href='#n48'>48</a></p>
  105. <p id='n49' class='pln'><a href='#n49'>49</a></p>
  106. <p id='n50' class='pln'><a href='#n50'>50</a></p>
  107. <p id='n51' class='pln'><a href='#n51'>51</a></p>
  108. <p id='n52' class='pln'><a href='#n52'>52</a></p>
  109. <p id='n53' class='pln'><a href='#n53'>53</a></p>
  110. <p id='n54' class='pln'><a href='#n54'>54</a></p>
  111. <p id='n55' class='pln'><a href='#n55'>55</a></p>
  112. <p id='n56' class='pln'><a href='#n56'>56</a></p>
  113. <p id='n57' class='pln'><a href='#n57'>57</a></p>
  114. <p id='n58' class='pln'><a href='#n58'>58</a></p>
  115. <p id='n59' class='pln'><a href='#n59'>59</a></p>
  116. <p id='n60' class='pln'><a href='#n60'>60</a></p>
  117. <p id='n61' class='pln'><a href='#n61'>61</a></p>
  118. <p id='n62' class='pln'><a href='#n62'>62</a></p>
  119. <p id='n63' class='pln'><a href='#n63'>63</a></p>
  120. <p id='n64' class='pln'><a href='#n64'>64</a></p>
  121. <p id='n65' class='stm run hide_run'><a href='#n65'>65</a></p>
  122. <p id='n66' class='stm run hide_run'><a href='#n66'>66</a></p>
  123. <p id='n67' class='stm run hide_run'><a href='#n67'>67</a></p>
  124. <p id='n68' class='pln'><a href='#n68'>68</a></p>
  125. <p id='n69' class='stm run hide_run'><a href='#n69'>69</a></p>
  126. <p id='n70' class='pln'><a href='#n70'>70</a></p>
  127. <p id='n71' class='stm run hide_run'><a href='#n71'>71</a></p>
  128. <p id='n72' class='stm run hide_run'><a href='#n72'>72</a></p>
  129. <p id='n73' class='pln'><a href='#n73'>73</a></p>
  130. <p id='n74' class='stm run hide_run'><a href='#n74'>74</a></p>
  131. <p id='n75' class='pln'><a href='#n75'>75</a></p>
  132. <p id='n76' class='stm run hide_run'><a href='#n76'>76</a></p>
  133. <p id='n77' class='pln'><a href='#n77'>77</a></p>
  134. <p id='n78' class='stm run hide_run'><a href='#n78'>78</a></p>
  135. <p id='n79' class='pln'><a href='#n79'>79</a></p>
  136. <p id='n80' class='stm run hide_run'><a href='#n80'>80</a></p>
  137. <p id='n81' class='pln'><a href='#n81'>81</a></p>
  138. <p id='n82' class='stm run hide_run'><a href='#n82'>82</a></p>
  139. <p id='n83' class='pln'><a href='#n83'>83</a></p>
  140. <p id='n84' class='stm run hide_run'><a href='#n84'>84</a></p>
  141. <p id='n85' class='stm run hide_run'><a href='#n85'>85</a></p>
  142. <p id='n86' class='stm run hide_run'><a href='#n86'>86</a></p>
  143. <p id='n87' class='pln'><a href='#n87'>87</a></p>
  144. <p id='n88' class='stm run hide_run'><a href='#n88'>88</a></p>
  145. <p id='n89' class='pln'><a href='#n89'>89</a></p>
  146. <p id='n90' class='stm run hide_run'><a href='#n90'>90</a></p>
  147. <p id='n91' class='stm run hide_run'><a href='#n91'>91</a></p>
  148. <p id='n92' class='pln'><a href='#n92'>92</a></p>
  149. <p id='n93' class='stm run hide_run'><a href='#n93'>93</a></p>
  150. <p id='n94' class='pln'><a href='#n94'>94</a></p>
  151. <p id='n95' class='stm run hide_run'><a href='#n95'>95</a></p>
  152. <p id='n96' class='pln'><a href='#n96'>96</a></p>
  153. <p id='n97' class='stm run hide_run'><a href='#n97'>97</a></p>
  154. <p id='n98' class='pln'><a href='#n98'>98</a></p>
  155. <p id='n99' class='stm run hide_run'><a href='#n99'>99</a></p>
  156. <p id='n100' class='pln'><a href='#n100'>100</a></p>
  157. <p id='n101' class='stm run hide_run'><a href='#n101'>101</a></p>
  158. <p id='n102' class='pln'><a href='#n102'>102</a></p>
  159. <p id='n103' class='stm mis'><a href='#n103'>103</a></p>
  160. <p id='n104' class='pln'><a href='#n104'>104</a></p>
  161. <p id='n105' class='stm run hide_run'><a href='#n105'>105</a></p>
  162. <p id='n106' class='pln'><a href='#n106'>106</a></p>
  163. <p id='n107' class='stm run hide_run'><a href='#n107'>107</a></p>
  164. <p id='n108' class='pln'><a href='#n108'>108</a></p>
  165. <p id='n109' class='stm run hide_run'><a href='#n109'>109</a></p>
  166. <p id='n110' class='stm run hide_run'><a href='#n110'>110</a></p>
  167. <p id='n111' class='stm run hide_run'><a href='#n111'>111</a></p>
  168. <p id='n112' class='stm run hide_run'><a href='#n112'>112</a></p>
  169. <p id='n113' class='stm run hide_run'><a href='#n113'>113</a></p>
  170. <p id='n114' class='stm run hide_run'><a href='#n114'>114</a></p>
  171. <p id='n115' class='stm run hide_run'><a href='#n115'>115</a></p>
  172. <p id='n116' class='stm run hide_run'><a href='#n116'>116</a></p>
  173. <p id='n117' class='stm mis'><a href='#n117'>117</a></p>
  174. <p id='n118' class='stm mis'><a href='#n118'>118</a></p>
  175. <p id='n119' class='stm mis'><a href='#n119'>119</a></p>
  176. <p id='n120' class='stm mis'><a href='#n120'>120</a></p>
  177. <p id='n121' class='pln'><a href='#n121'>121</a></p>
  178. <p id='n122' class='pln'><a href='#n122'>122</a></p>
  179. <p id='n123' class='stm run hide_run'><a href='#n123'>123</a></p>
  180. <p id='n124' class='pln'><a href='#n124'>124</a></p>
  181. <p id='n125' class='pln'><a href='#n125'>125</a></p>
  182. <p id='n126' class='stm run hide_run'><a href='#n126'>126</a></p>
  183. <p id='n127' class='pln'><a href='#n127'>127</a></p>
  184. <p id='n128' class='pln'><a href='#n128'>128</a></p>
  185. <p id='n129' class='pln'><a href='#n129'>129</a></p>
  186. <p id='n130' class='pln'><a href='#n130'>130</a></p>
  187. <p id='n131' class='pln'><a href='#n131'>131</a></p>
  188. <p id='n132' class='pln'><a href='#n132'>132</a></p>
  189. <p id='n133' class='pln'><a href='#n133'>133</a></p>
  190. <p id='n134' class='pln'><a href='#n134'>134</a></p>
  191. <p id='n135' class='pln'><a href='#n135'>135</a></p>
  192. <p id='n136' class='pln'><a href='#n136'>136</a></p>
  193. <p id='n137' class='pln'><a href='#n137'>137</a></p>
  194. <p id='n138' class='pln'><a href='#n138'>138</a></p>
  195. <p id='n139' class='pln'><a href='#n139'>139</a></p>
  196. <p id='n140' class='pln'><a href='#n140'>140</a></p>
  197. <p id='n141' class='pln'><a href='#n141'>141</a></p>
  198. <p id='n142' class='pln'><a href='#n142'>142</a></p>
  199. <p id='n143' class='pln'><a href='#n143'>143</a></p>
  200. <p id='n144' class='pln'><a href='#n144'>144</a></p>
  201. <p id='n145' class='pln'><a href='#n145'>145</a></p>
  202. <p id='n146' class='stm run hide_run'><a href='#n146'>146</a></p>
  203. <p id='n147' class='stm run hide_run'><a href='#n147'>147</a></p>
  204. <p id='n148' class='stm run hide_run'><a href='#n148'>148</a></p>
  205. <p id='n149' class='stm run hide_run'><a href='#n149'>149</a></p>
  206. <p id='n150' class='stm run hide_run'><a href='#n150'>150</a></p>
  207. <p id='n151' class='pln'><a href='#n151'>151</a></p>
  208. <p id='n152' class='stm run hide_run'><a href='#n152'>152</a></p>
  209. <p id='n153' class='stm run hide_run'><a href='#n153'>153</a></p>
  210. <p id='n154' class='stm run hide_run'><a href='#n154'>154</a></p>
  211. <p id='n155' class='pln'><a href='#n155'>155</a></p>
  212. <p id='n156' class='pln'><a href='#n156'>156</a></p>
  213. <p id='n157' class='pln'><a href='#n157'>157</a></p>
  214. <p id='n158' class='pln'><a href='#n158'>158</a></p>
  215. <p id='n159' class='pln'><a href='#n159'>159</a></p>
  216. <p id='n160' class='pln'><a href='#n160'>160</a></p>
  217. <p id='n161' class='pln'><a href='#n161'>161</a></p>
  218. <p id='n162' class='pln'><a href='#n162'>162</a></p>
  219. <p id='n163' class='pln'><a href='#n163'>163</a></p>
  220. <p id='n164' class='pln'><a href='#n164'>164</a></p>
  221. <p id='n165' class='pln'><a href='#n165'>165</a></p>
  222. <p id='n166' class='stm run hide_run'><a href='#n166'>166</a></p>
  223. <p id='n167' class='pln'><a href='#n167'>167</a></p>
  224. <p id='n168' class='pln'><a href='#n168'>168</a></p>
  225. <p id='n169' class='pln'><a href='#n169'>169</a></p>
  226. <p id='n170' class='pln'><a href='#n170'>170</a></p>
  227. <p id='n171' class='pln'><a href='#n171'>171</a></p>
  228. <p id='n172' class='pln'><a href='#n172'>172</a></p>
  229. <p id='n173' class='pln'><a href='#n173'>173</a></p>
  230. <p id='n174' class='pln'><a href='#n174'>174</a></p>
  231. <p id='n175' class='pln'><a href='#n175'>175</a></p>
  232. <p id='n176' class='pln'><a href='#n176'>176</a></p>
  233. <p id='n177' class='pln'><a href='#n177'>177</a></p>
  234. <p id='n178' class='pln'><a href='#n178'>178</a></p>
  235. <p id='n179' class='pln'><a href='#n179'>179</a></p>
  236. <p id='n180' class='pln'><a href='#n180'>180</a></p>
  237. <p id='n181' class='pln'><a href='#n181'>181</a></p>
  238. <p id='n182' class='stm run hide_run'><a href='#n182'>182</a></p>
  239. <p id='n183' class='pln'><a href='#n183'>183</a></p>
  240. <p id='n184' class='stm run hide_run'><a href='#n184'>184</a></p>
  241. <p id='n185' class='pln'><a href='#n185'>185</a></p>
  242. <p id='n186' class='stm run hide_run'><a href='#n186'>186</a></p>
  243. <p id='n187' class='pln'><a href='#n187'>187</a></p>
  244. <p id='n188' class='stm run hide_run'><a href='#n188'>188</a></p>
  245. <p id='n189' class='pln'><a href='#n189'>189</a></p>
  246. <p id='n190' class='stm run hide_run'><a href='#n190'>190</a></p>
  247. <p id='n191' class='pln'><a href='#n191'>191</a></p>
  248. <p id='n192' class='stm run hide_run'><a href='#n192'>192</a></p>
  249. <p id='n193' class='pln'><a href='#n193'>193</a></p>
  250. <p id='n194' class='stm mis'><a href='#n194'>194</a></p>
  251. <p id='n195' class='pln'><a href='#n195'>195</a></p>
  252. <p id='n196' class='stm run hide_run'><a href='#n196'>196</a></p>
  253. <p id='n197' class='pln'><a href='#n197'>197</a></p>
  254. <p id='n198' class='stm mis'><a href='#n198'>198</a></p>
  255. <p id='n199' class='pln'><a href='#n199'>199</a></p>
  256. <p id='n200' class='stm run hide_run'><a href='#n200'>200</a></p>
  257. <p id='n201' class='pln'><a href='#n201'>201</a></p>
  258. <p id='n202' class='stm run hide_run'><a href='#n202'>202</a></p>
  259. <p id='n203' class='pln'><a href='#n203'>203</a></p>
  260. <p id='n204' class='stm run hide_run'><a href='#n204'>204</a></p>
  261. <p id='n205' class='pln'><a href='#n205'>205</a></p>
  262. <p id='n206' class='stm run hide_run'><a href='#n206'>206</a></p>
  263. <p id='n207' class='pln'><a href='#n207'>207</a></p>
  264. <p id='n208' class='stm run hide_run'><a href='#n208'>208</a></p>
  265. <p id='n209' class='pln'><a href='#n209'>209</a></p>
  266. <p id='n210' class='stm run hide_run'><a href='#n210'>210</a></p>
  267. <p id='n211' class='pln'><a href='#n211'>211</a></p>
  268. <p id='n212' class='stm run hide_run'><a href='#n212'>212</a></p>
  269. <p id='n213' class='pln'><a href='#n213'>213</a></p>
  270. <p id='n214' class='stm run hide_run'><a href='#n214'>214</a></p>
  271. <p id='n215' class='pln'><a href='#n215'>215</a></p>
  272. <p id='n216' class='stm run hide_run'><a href='#n216'>216</a></p>
  273. <p id='n217' class='pln'><a href='#n217'>217</a></p>
  274. <p id='n218' class='stm mis'><a href='#n218'>218</a></p>
  275. <p id='n219' class='pln'><a href='#n219'>219</a></p>
  276. <p id='n220' class='stm run hide_run'><a href='#n220'>220</a></p>
  277. <p id='n221' class='pln'><a href='#n221'>221</a></p>
  278. <p id='n222' class='stm mis'><a href='#n222'>222</a></p>
  279. <p id='n223' class='pln'><a href='#n223'>223</a></p>
  280. <p id='n224' class='stm run hide_run'><a href='#n224'>224</a></p>
  281. <p id='n225' class='stm run hide_run'><a href='#n225'>225</a></p>
  282. <p id='n226' class='stm run hide_run'><a href='#n226'>226</a></p>
  283. <p id='n227' class='pln'><a href='#n227'>227</a></p>
  284. <p id='n228' class='stm run hide_run'><a href='#n228'>228</a></p>
  285. <p id='n229' class='stm run hide_run'><a href='#n229'>229</a></p>
  286. <p id='n230' class='stm run hide_run'><a href='#n230'>230</a></p>
  287. <p id='n231' class='stm run hide_run'><a href='#n231'>231</a></p>
  288. <p id='n232' class='stm run hide_run'><a href='#n232'>232</a></p>
  289. <p id='n233' class='stm run hide_run'><a href='#n233'>233</a></p>
  290. <p id='n234' class='stm run hide_run'><a href='#n234'>234</a></p>
  291. <p id='n235' class='stm run hide_run'><a href='#n235'>235</a></p>
  292. <p id='n236' class='stm run hide_run'><a href='#n236'>236</a></p>
  293. <p id='n237' class='stm run hide_run'><a href='#n237'>237</a></p>
  294. <p id='n238' class='stm run hide_run'><a href='#n238'>238</a></p>
  295. <p id='n239' class='stm run hide_run'><a href='#n239'>239</a></p>
  296. <p id='n240' class='pln'><a href='#n240'>240</a></p>
  297. <p id='n241' class='stm run hide_run'><a href='#n241'>241</a></p>
  298. <p id='n242' class='stm run hide_run'><a href='#n242'>242</a></p>
  299. <p id='n243' class='stm run hide_run'><a href='#n243'>243</a></p>
  300. <p id='n244' class='stm run hide_run'><a href='#n244'>244</a></p>
  301. <p id='n245' class='stm run hide_run'><a href='#n245'>245</a></p>
  302. <p id='n246' class='stm mis'><a href='#n246'>246</a></p>
  303. <p id='n247' class='stm mis'><a href='#n247'>247</a></p>
  304. <p id='n248' class='stm run hide_run'><a href='#n248'>248</a></p>
  305. <p id='n249' class='stm run hide_run'><a href='#n249'>249</a></p>
  306. <p id='n250' class='stm run hide_run'><a href='#n250'>250</a></p>
  307. <p id='n251' class='stm mis'><a href='#n251'>251</a></p>
  308. <p id='n252' class='stm run hide_run'><a href='#n252'>252</a></p>
  309. <p id='n253' class='stm run hide_run'><a href='#n253'>253</a></p>
  310. <p id='n254' class='stm run hide_run'><a href='#n254'>254</a></p>
  311. <p id='n255' class='stm run hide_run'><a href='#n255'>255</a></p>
  312. <p id='n256' class='pln'><a href='#n256'>256</a></p>
  313. <p id='n257' class='stm mis'><a href='#n257'>257</a></p>
  314. <p id='n258' class='stm run hide_run'><a href='#n258'>258</a></p>
  315. <p id='n259' class='stm mis'><a href='#n259'>259</a></p>
  316. <p id='n260' class='stm run hide_run'><a href='#n260'>260</a></p>
  317. <p id='n261' class='stm run hide_run'><a href='#n261'>261</a></p>
  318. <p id='n262' class='stm run hide_run'><a href='#n262'>262</a></p>
  319. <p id='n263' class='stm mis'><a href='#n263'>263</a></p>
  320. <p id='n264' class='stm mis'><a href='#n264'>264</a></p>
  321. <p id='n265' class='stm run hide_run'><a href='#n265'>265</a></p>
  322. <p id='n266' class='stm mis'><a href='#n266'>266</a></p>
  323. <p id='n267' class='stm run hide_run'><a href='#n267'>267</a></p>
  324. <p id='n268' class='pln'><a href='#n268'>268</a></p>
  325. <p id='n269' class='stm run hide_run'><a href='#n269'>269</a></p>
  326. <p id='n270' class='stm mis'><a href='#n270'>270</a></p>
  327. <p id='n271' class='stm mis'><a href='#n271'>271</a></p>
  328. <p id='n272' class='stm mis'><a href='#n272'>272</a></p>
  329. <p id='n273' class='pln'><a href='#n273'>273</a></p>
  330. <p id='n274' class='stm run hide_run'><a href='#n274'>274</a></p>
  331. <p id='n275' class='stm run hide_run'><a href='#n275'>275</a></p>
  332. <p id='n276' class='stm mis'><a href='#n276'>276</a></p>
  333. <p id='n277' class='pln'><a href='#n277'>277</a></p>
  334. <p id='n278' class='stm run hide_run'><a href='#n278'>278</a></p>
  335. <p id='n279' class='stm run hide_run'><a href='#n279'>279</a></p>
  336. <p id='n280' class='stm run hide_run'><a href='#n280'>280</a></p>
  337. <p id='n281' class='pln'><a href='#n281'>281</a></p>
  338. <p id='n282' class='pln'><a href='#n282'>282</a></p>
  339. <p id='n283' class='stm run hide_run'><a href='#n283'>283</a></p>
  340. <p id='n284' class='stm mis'><a href='#n284'>284</a></p>
  341. <p id='n285' class='stm mis'><a href='#n285'>285</a></p>
  342. <p id='n286' class='stm run hide_run'><a href='#n286'>286</a></p>
  343. <p id='n287' class='stm mis'><a href='#n287'>287</a></p>
  344. <p id='n288' class='stm mis'><a href='#n288'>288</a></p>
  345. <p id='n289' class='stm mis'><a href='#n289'>289</a></p>
  346. <p id='n290' class='stm mis'><a href='#n290'>290</a></p>
  347. <p id='n291' class='stm mis'><a href='#n291'>291</a></p>
  348. <p id='n292' class='pln'><a href='#n292'>292</a></p>
  349. <p id='n293' class='stm mis'><a href='#n293'>293</a></p>
  350. <p id='n294' class='stm mis'><a href='#n294'>294</a></p>
  351. <p id='n295' class='stm mis'><a href='#n295'>295</a></p>
  352. <p id='n296' class='stm mis'><a href='#n296'>296</a></p>
  353. <p id='n297' class='pln'><a href='#n297'>297</a></p>
  354. <p id='n298' class='pln'><a href='#n298'>298</a></p>
  355. <p id='n299' class='stm run hide_run'><a href='#n299'>299</a></p>
  356. <p id='n300' class='stm run hide_run'><a href='#n300'>300</a></p>
  357. <p id='n301' class='stm run hide_run'><a href='#n301'>301</a></p>
  358. <p id='n302' class='stm run hide_run'><a href='#n302'>302</a></p>
  359. <p id='n303' class='stm mis'><a href='#n303'>303</a></p>
  360. <p id='n304' class='stm mis'><a href='#n304'>304</a></p>
  361. <p id='n305' class='stm mis'><a href='#n305'>305</a></p>
  362. <p id='n306' class='pln'><a href='#n306'>306</a></p>
  363. <p id='n307' class='pln'><a href='#n307'>307</a></p>
  364. <p id='n308' class='stm run hide_run'><a href='#n308'>308</a></p>
  365. <p id='n309' class='stm run hide_run'><a href='#n309'>309</a></p>
  366. <p id='n310' class='pln'><a href='#n310'>310</a></p>
  367. <p id='n311' class='pln'><a href='#n311'>311</a></p>
  368. <p id='n312' class='stm mis'><a href='#n312'>312</a></p>
  369. <p id='n313' class='pln'><a href='#n313'>313</a></p>
  370. <p id='n314' class='pln'><a href='#n314'>314</a></p>
  371. <p id='n315' class='pln'><a href='#n315'>315</a></p>
  372. <p id='n316' class='pln'><a href='#n316'>316</a></p>
  373. <p id='n317' class='pln'><a href='#n317'>317</a></p>
  374. <p id='n318' class='pln'><a href='#n318'>318</a></p>
  375. <p id='n319' class='stm mis'><a href='#n319'>319</a></p>
  376. <p id='n320' class='stm mis'><a href='#n320'>320</a></p>
  377. <p id='n321' class='stm mis'><a href='#n321'>321</a></p>
  378. <p id='n322' class='stm mis'><a href='#n322'>322</a></p>
  379. <p id='n323' class='stm mis'><a href='#n323'>323</a></p>
  380. <p id='n324' class='stm mis'><a href='#n324'>324</a></p>
  381. <p id='n325' class='stm mis'><a href='#n325'>325</a></p>
  382. <p id='n326' class='stm mis'><a href='#n326'>326</a></p>
  383. <p id='n327' class='stm mis'><a href='#n327'>327</a></p>
  384. <p id='n328' class='stm mis'><a href='#n328'>328</a></p>
  385. <p id='n329' class='pln'><a href='#n329'>329</a></p>
  386. <p id='n330' class='pln'><a href='#n330'>330</a></p>
  387. <p id='n331' class='stm mis'><a href='#n331'>331</a></p>
  388. <p id='n332' class='pln'><a href='#n332'>332</a></p>
  389. <p id='n333' class='pln'><a href='#n333'>333</a></p>
  390. <p id='n334' class='pln'><a href='#n334'>334</a></p>
  391. <p id='n335' class='stm mis'><a href='#n335'>335</a></p>
  392. <p id='n336' class='stm mis'><a href='#n336'>336</a></p>
  393. <p id='n337' class='stm mis'><a href='#n337'>337</a></p>
  394. <p id='n338' class='stm mis'><a href='#n338'>338</a></p>
  395. <p id='n339' class='stm mis'><a href='#n339'>339</a></p>
  396. <p id='n340' class='stm mis'><a href='#n340'>340</a></p>
  397. <p id='n341' class='stm mis'><a href='#n341'>341</a></p>
  398. <p id='n342' class='pln'><a href='#n342'>342</a></p>
  399. <p id='n343' class='stm run hide_run'><a href='#n343'>343</a></p>
  400. <p id='n344' class='stm run hide_run'><a href='#n344'>344</a></p>
  401. <p id='n345' class='stm run hide_run'><a href='#n345'>345</a></p>
  402. <p id='n346' class='stm mis'><a href='#n346'>346</a></p>
  403. <p id='n347' class='stm mis'><a href='#n347'>347</a></p>
  404. <p id='n348' class='stm run hide_run'><a href='#n348'>348</a></p>
  405. <p id='n349' class='stm run hide_run'><a href='#n349'>349</a></p>
  406. <p id='n350' class='pln'><a href='#n350'>350</a></p>
  407. <p id='n351' class='stm run hide_run'><a href='#n351'>351</a></p>
  408. <p id='n352' class='pln'><a href='#n352'>352</a></p>
  409. <p id='n353' class='stm run hide_run'><a href='#n353'>353</a></p>
  410. <p id='n354' class='stm run hide_run'><a href='#n354'>354</a></p>
  411. <p id='n355' class='stm mis'><a href='#n355'>355</a></p>
  412. <p id='n356' class='stm run hide_run'><a href='#n356'>356</a></p>
  413. <p id='n357' class='pln'><a href='#n357'>357</a></p>
  414. <p id='n358' class='pln'><a href='#n358'>358</a></p>
  415. <p id='n359' class='stm run hide_run'><a href='#n359'>359</a></p>
  416. <p id='n360' class='stm run hide_run'><a href='#n360'>360</a></p>
  417. <p id='n361' class='stm run hide_run'><a href='#n361'>361</a></p>
  418. <p id='n362' class='stm run hide_run'><a href='#n362'>362</a></p>
  419. <p id='n363' class='stm run hide_run'><a href='#n363'>363</a></p>
  420. <p id='n364' class='stm mis'><a href='#n364'>364</a></p>
  421. <p id='n365' class='stm mis'><a href='#n365'>365</a></p>
  422. <p id='n366' class='stm mis'><a href='#n366'>366</a></p>
  423. <p id='n367' class='pln'><a href='#n367'>367</a></p>
  424. <p id='n368' class='stm run hide_run'><a href='#n368'>368</a></p>
  425. <p id='n369' class='pln'><a href='#n369'>369</a></p>
  426. <p id='n370' class='pln'><a href='#n370'>370</a></p>
  427. <p id='n371' class='stm run hide_run'><a href='#n371'>371</a></p>
  428. <p id='n372' class='stm run hide_run'><a href='#n372'>372</a></p>
  429. <p id='n373' class='stm mis'><a href='#n373'>373</a></p>
  430. <p id='n374' class='pln'><a href='#n374'>374</a></p>
  431. <p id='n375' class='stm run hide_run'><a href='#n375'>375</a></p>
  432. <p id='n376' class='pln'><a href='#n376'>376</a></p>
  433. <p id='n377' class='pln'><a href='#n377'>377</a></p>
  434. <p id='n378' class='stm run hide_run'><a href='#n378'>378</a></p>
  435. <p id='n379' class='stm run hide_run'><a href='#n379'>379</a></p>
  436. <p id='n380' class='stm run hide_run'><a href='#n380'>380</a></p>
  437. <p id='n381' class='pln'><a href='#n381'>381</a></p>
  438. <p id='n382' class='stm run hide_run'><a href='#n382'>382</a></p>
  439. <p id='n383' class='stm run hide_run'><a href='#n383'>383</a></p>
  440. <p id='n384' class='stm run hide_run'><a href='#n384'>384</a></p>
  441. <p id='n385' class='stm run hide_run'><a href='#n385'>385</a></p>
  442. <p id='n386' class='stm run hide_run'><a href='#n386'>386</a></p>
  443. <p id='n387' class='stm run hide_run'><a href='#n387'>387</a></p>
  444. <p id='n388' class='stm run hide_run'><a href='#n388'>388</a></p>
  445. <p id='n389' class='stm mis'><a href='#n389'>389</a></p>
  446. <p id='n390' class='stm mis'><a href='#n390'>390</a></p>
  447. <p id='n391' class='stm mis'><a href='#n391'>391</a></p>
  448. <p id='n392' class='stm run hide_run'><a href='#n392'>392</a></p>
  449. <p id='n393' class='stm mis'><a href='#n393'>393</a></p>
  450. <p id='n394' class='stm mis'><a href='#n394'>394</a></p>
  451. <p id='n395' class='pln'><a href='#n395'>395</a></p>
  452. <p id='n396' class='stm mis'><a href='#n396'>396</a></p>
  453. <p id='n397' class='stm mis'><a href='#n397'>397</a></p>
  454. <p id='n398' class='pln'><a href='#n398'>398</a></p>
  455. <p id='n399' class='pln'><a href='#n399'>399</a></p>
  456. <p id='n400' class='stm run hide_run'><a href='#n400'>400</a></p>
  457. <p id='n401' class='stm mis'><a href='#n401'>401</a></p>
  458. <p id='n402' class='stm mis'><a href='#n402'>402</a></p>
  459. <p id='n403' class='pln'><a href='#n403'>403</a></p>
  460. <p id='n404' class='pln'><a href='#n404'>404</a></p>
  461. <p id='n405' class='stm run hide_run'><a href='#n405'>405</a></p>
  462. <p id='n406' class='pln'><a href='#n406'>406</a></p>
  463. <p id='n407' class='pln'><a href='#n407'>407</a></p>
  464. <p id='n408' class='stm run hide_run'><a href='#n408'>408</a></p>
  465. <p id='n409' class='stm mis'><a href='#n409'>409</a></p>
  466. <p id='n410' class='stm mis'><a href='#n410'>410</a></p>
  467. <p id='n411' class='stm run hide_run'><a href='#n411'>411</a></p>
  468. <p id='n412' class='pln'><a href='#n412'>412</a></p>
  469. <p id='n413' class='pln'><a href='#n413'>413</a></p>
  470. <p id='n414' class='stm run hide_run'><a href='#n414'>414</a></p>
  471. <p id='n415' class='stm run hide_run'><a href='#n415'>415</a></p>
  472. <p id='n416' class='stm run hide_run'><a href='#n416'>416</a></p>
  473. <p id='n417' class='stm run hide_run'><a href='#n417'>417</a></p>
  474. <p id='n418' class='pln'><a href='#n418'>418</a></p>
  475. <p id='n419' class='stm mis'><a href='#n419'>419</a></p>
  476. <p id='n420' class='pln'><a href='#n420'>420</a></p>
  477. <p id='n421' class='pln'><a href='#n421'>421</a></p>
  478. <p id='n422' class='stm run hide_run'><a href='#n422'>422</a></p>
  479. <p id='n423' class='stm mis'><a href='#n423'>423</a></p>
  480. <p id='n424' class='stm mis'><a href='#n424'>424</a></p>
  481. <p id='n425' class='stm run hide_run'><a href='#n425'>425</a></p>
  482. <p id='n426' class='pln'><a href='#n426'>426</a></p>
  483. <p id='n427' class='pln'><a href='#n427'>427</a></p>
  484. <p id='n428' class='stm run hide_run'><a href='#n428'>428</a></p>
  485. <p id='n429' class='stm mis'><a href='#n429'>429</a></p>
  486. <p id='n430' class='stm mis'><a href='#n430'>430</a></p>
  487. <p id='n431' class='pln'><a href='#n431'>431</a></p>
  488. <p id='n432' class='stm run hide_run'><a href='#n432'>432</a></p>
  489. <p id='n433' class='pln'><a href='#n433'>433</a></p>
  490. <p id='n434' class='pln'><a href='#n434'>434</a></p>
  491. <p id='n435' class='stm run hide_run'><a href='#n435'>435</a></p>
  492. <p id='n436' class='stm run hide_run'><a href='#n436'>436</a></p>
  493. <p id='n437' class='stm run hide_run'><a href='#n437'>437</a></p>
  494. <p id='n438' class='stm run hide_run'><a href='#n438'>438</a></p>
  495. <p id='n439' class='stm run hide_run'><a href='#n439'>439</a></p>
  496. <p id='n440' class='stm run hide_run'><a href='#n440'>440</a></p>
  497. <p id='n441' class='stm run hide_run'><a href='#n441'>441</a></p>
  498. <p id='n442' class='stm run hide_run'><a href='#n442'>442</a></p>
  499. <p id='n443' class='stm run hide_run'><a href='#n443'>443</a></p>
  500. <p id='n444' class='stm run hide_run'><a href='#n444'>444</a></p>
  501. <p id='n445' class='pln'><a href='#n445'>445</a></p>
  502. <p id='n446' class='pln'><a href='#n446'>446</a></p>
  503. <p id='n447' class='stm run hide_run'><a href='#n447'>447</a></p>
  504. <p id='n448' class='stm run hide_run'><a href='#n448'>448</a></p>
  505. <p id='n449' class='stm run hide_run'><a href='#n449'>449</a></p>
  506. <p id='n450' class='pln'><a href='#n450'>450</a></p>
  507. <p id='n451' class='stm mis'><a href='#n451'>451</a></p>
  508. <p id='n452' class='pln'><a href='#n452'>452</a></p>
  509. <p id='n453' class='pln'><a href='#n453'>453</a></p>
  510. <p id='n454' class='stm run hide_run'><a href='#n454'>454</a></p>
  511. <p id='n455' class='stm run hide_run'><a href='#n455'>455</a></p>
  512. <p id='n456' class='stm run hide_run'><a href='#n456'>456</a></p>
  513. <p id='n457' class='stm run hide_run'><a href='#n457'>457</a></p>
  514. <p id='n458' class='stm mis'><a href='#n458'>458</a></p>
  515. <p id='n459' class='pln'><a href='#n459'>459</a></p>
  516. <p id='n460' class='stm run hide_run'><a href='#n460'>460</a></p>
  517. <p id='n461' class='stm mis'><a href='#n461'>461</a></p>
  518. <p id='n462' class='stm mis'><a href='#n462'>462</a></p>
  519. <p id='n463' class='pln'><a href='#n463'>463</a></p>
  520. <p id='n464' class='stm run hide_run'><a href='#n464'>464</a></p>
  521. <p id='n465' class='pln'><a href='#n465'>465</a></p>
  522. <p id='n466' class='pln'><a href='#n466'>466</a></p>
  523. <p id='n467' class='stm run hide_run'><a href='#n467'>467</a></p>
  524. <p id='n468' class='pln'><a href='#n468'>468</a></p>
  525. <p id='n469' class='pln'><a href='#n469'>469</a></p>
  526. <p id='n470' class='stm run hide_run'><a href='#n470'>470</a></p>
  527. <p id='n471' class='pln'><a href='#n471'>471</a></p>
  528. <p id='n472' class='stm run hide_run'><a href='#n472'>472</a></p>
  529. <p id='n473' class='stm mis'><a href='#n473'>473</a></p>
  530. <p id='n474' class='stm mis'><a href='#n474'>474</a></p>
  531. <p id='n475' class='stm run hide_run'><a href='#n475'>475</a></p>
  532. <p id='n476' class='stm run hide_run'><a href='#n476'>476</a></p>
  533. <p id='n477' class='stm run hide_run'><a href='#n477'>477</a></p>
  534. <p id='n478' class='stm run hide_run'><a href='#n478'>478</a></p>
  535. <p id='n479' class='stm run hide_run'><a href='#n479'>479</a></p>
  536. <p id='n480' class='pln'><a href='#n480'>480</a></p>
  537. <p id='n481' class='stm run hide_run'><a href='#n481'>481</a></p>
  538. <p id='n482' class='stm run hide_run'><a href='#n482'>482</a></p>
  539. <p id='n483' class='stm run hide_run'><a href='#n483'>483</a></p>
  540. <p id='n484' class='stm mis'><a href='#n484'>484</a></p>
  541. <p id='n485' class='pln'><a href='#n485'>485</a></p>
  542. <p id='n486' class='stm run hide_run'><a href='#n486'>486</a></p>
  543. <p id='n487' class='stm run hide_run'><a href='#n487'>487</a></p>
  544. <p id='n488' class='stm run hide_run'><a href='#n488'>488</a></p>
  545. <p id='n489' class='stm mis'><a href='#n489'>489</a></p>
  546. <p id='n490' class='stm mis'><a href='#n490'>490</a></p>
  547. <p id='n491' class='stm run hide_run'><a href='#n491'>491</a></p>
  548. <p id='n492' class='stm mis'><a href='#n492'>492</a></p>
  549. <p id='n493' class='stm mis'><a href='#n493'>493</a></p>
  550. <p id='n494' class='stm run hide_run'><a href='#n494'>494</a></p>
  551. <p id='n495' class='stm run hide_run'><a href='#n495'>495</a></p>
  552. <p id='n496' class='stm mis'><a href='#n496'>496</a></p>
  553. <p id='n497' class='stm mis'><a href='#n497'>497</a></p>
  554. <p id='n498' class='stm mis'><a href='#n498'>498</a></p>
  555. <p id='n499' class='stm mis'><a href='#n499'>499</a></p>
  556. <p id='n500' class='pln'><a href='#n500'>500</a></p>
  557. <p id='n501' class='pln'><a href='#n501'>501</a></p>
  558. <p id='n502' class='pln'><a href='#n502'>502</a></p>
  559. <p id='n503' class='stm mis'><a href='#n503'>503</a></p>
  560. <p id='n504' class='stm mis'><a href='#n504'>504</a></p>
  561. <p id='n505' class='stm mis'><a href='#n505'>505</a></p>
  562. <p id='n506' class='stm mis'><a href='#n506'>506</a></p>
  563. <p id='n507' class='stm mis'><a href='#n507'>507</a></p>
  564. <p id='n508' class='stm mis'><a href='#n508'>508</a></p>
  565. <p id='n509' class='stm mis'><a href='#n509'>509</a></p>
  566. <p id='n510' class='stm mis'><a href='#n510'>510</a></p>
  567. <p id='n511' class='stm mis'><a href='#n511'>511</a></p>
  568. <p id='n512' class='pln'><a href='#n512'>512</a></p>
  569. <p id='n513' class='stm mis'><a href='#n513'>513</a></p>
  570. <p id='n514' class='stm mis'><a href='#n514'>514</a></p>
  571. <p id='n515' class='pln'><a href='#n515'>515</a></p>
  572. <p id='n516' class='stm run hide_run'><a href='#n516'>516</a></p>
  573. <p id='n517' class='stm run hide_run'><a href='#n517'>517</a></p>
  574. <p id='n518' class='pln'><a href='#n518'>518</a></p>
  575. <p id='n519' class='stm run hide_run'><a href='#n519'>519</a></p>
  576. <p id='n520' class='pln'><a href='#n520'>520</a></p>
  577. <p id='n521' class='stm run hide_run'><a href='#n521'>521</a></p>
  578. <p id='n522' class='pln'><a href='#n522'>522</a></p>
  579. <p id='n523' class='pln'><a href='#n523'>523</a></p>
  580. <p id='n524' class='stm run hide_run'><a href='#n524'>524</a></p>
  581. <p id='n525' class='pln'><a href='#n525'>525</a></p>
  582. <p id='n526' class='pln'><a href='#n526'>526</a></p>
  583. <p id='n527' class='pln'><a href='#n527'>527</a></p>
  584. <p id='n528' class='pln'><a href='#n528'>528</a></p>
  585. <p id='n529' class='pln'><a href='#n529'>529</a></p>
  586. <p id='n530' class='pln'><a href='#n530'>530</a></p>
  587. <p id='n531' class='pln'><a href='#n531'>531</a></p>
  588. <p id='n532' class='pln'><a href='#n532'>532</a></p>
  589. <p id='n533' class='pln'><a href='#n533'>533</a></p>
  590. <p id='n534' class='pln'><a href='#n534'>534</a></p>
  591. <p id='n535' class='pln'><a href='#n535'>535</a></p>
  592. <p id='n536' class='pln'><a href='#n536'>536</a></p>
  593. <p id='n537' class='pln'><a href='#n537'>537</a></p>
  594. <p id='n538' class='pln'><a href='#n538'>538</a></p>
  595. <p id='n539' class='stm run hide_run'><a href='#n539'>539</a></p>
  596. <p id='n540' class='pln'><a href='#n540'>540</a></p>
  597. <p id='n541' class='pln'><a href='#n541'>541</a></p>
  598. <p id='n542' class='stm run hide_run'><a href='#n542'>542</a></p>
  599. <p id='n543' class='pln'><a href='#n543'>543</a></p>
  600. <p id='n544' class='pln'><a href='#n544'>544</a></p>
  601. <p id='n545' class='stm run hide_run'><a href='#n545'>545</a></p>
  602. <p id='n546' class='stm run hide_run'><a href='#n546'>546</a></p>
  603. <p id='n547' class='stm run hide_run'><a href='#n547'>547</a></p>
  604. <p id='n548' class='stm run hide_run'><a href='#n548'>548</a></p>
  605. <p id='n549' class='pln'><a href='#n549'>549</a></p>
  606. <p id='n550' class='stm run hide_run'><a href='#n550'>550</a></p>
  607. <p id='n551' class='stm run hide_run'><a href='#n551'>551</a></p>
  608. <p id='n552' class='pln'><a href='#n552'>552</a></p>
  609. <p id='n553' class='stm run hide_run'><a href='#n553'>553</a></p>
  610. <p id='n554' class='pln'><a href='#n554'>554</a></p>
  611. <p id='n555' class='stm run hide_run'><a href='#n555'>555</a></p>
  612. <p id='n556' class='pln'><a href='#n556'>556</a></p>
  613. <p id='n557' class='stm run hide_run'><a href='#n557'>557</a></p>
  614. <p id='n558' class='pln'><a href='#n558'>558</a></p>
  615. <p id='n559' class='stm run hide_run'><a href='#n559'>559</a></p>
  616. <p id='n560' class='pln'><a href='#n560'>560</a></p>
  617. <p id='n561' class='stm run hide_run'><a href='#n561'>561</a></p>
  618. <p id='n562' class='pln'><a href='#n562'>562</a></p>
  619. <p id='n563' class='stm mis'><a href='#n563'>563</a></p>
  620. <p id='n564' class='pln'><a href='#n564'>564</a></p>
  621. <p id='n565' class='stm run hide_run'><a href='#n565'>565</a></p>
  622. <p id='n566' class='pln'><a href='#n566'>566</a></p>
  623. <p id='n567' class='stm mis'><a href='#n567'>567</a></p>
  624. <p id='n568' class='pln'><a href='#n568'>568</a></p>
  625. <p id='n569' class='stm run hide_run'><a href='#n569'>569</a></p>
  626. <p id='n570' class='pln'><a href='#n570'>570</a></p>
  627. <p id='n571' class='stm run hide_run'><a href='#n571'>571</a></p>
  628. <p id='n572' class='stm run hide_run'><a href='#n572'>572</a></p>
  629. <p id='n573' class='stm run hide_run'><a href='#n573'>573</a></p>
  630. <p id='n574' class='stm run hide_run'><a href='#n574'>574</a></p>
  631. <p id='n575' class='stm mis'><a href='#n575'>575</a></p>
  632. <p id='n576' class='stm mis'><a href='#n576'>576</a></p>
  633. <p id='n577' class='stm mis'><a href='#n577'>577</a></p>
  634. <p id='n578' class='pln'><a href='#n578'>578</a></p>
  635. <p id='n579' class='pln'><a href='#n579'>579</a></p>
  636. <p id='n580' class='stm run hide_run'><a href='#n580'>580</a></p>
  637. <p id='n581' class='pln'><a href='#n581'>581</a></p>
  638. <p id='n582' class='pln'><a href='#n582'>582</a></p>
  639. <p id='n583' class='pln'><a href='#n583'>583</a></p>
  640. <p id='n584' class='stm run hide_run'><a href='#n584'>584</a></p>
  641. <p id='n585' class='stm run hide_run'><a href='#n585'>585</a></p>
  642. <p id='n586' class='stm run hide_run'><a href='#n586'>586</a></p>
  643. <p id='n587' class='stm run hide_run'><a href='#n587'>587</a></p>
  644. <p id='n588' class='stm mis'><a href='#n588'>588</a></p>
  645. <p id='n589' class='stm mis'><a href='#n589'>589</a></p>
  646. <p id='n590' class='stm mis'><a href='#n590'>590</a></p>
  647. <p id='n591' class='pln'><a href='#n591'>591</a></p>
  648. <p id='n592' class='stm run hide_run'><a href='#n592'>592</a></p>
  649. <p id='n593' class='pln'><a href='#n593'>593</a></p>
  650. <p id='n594' class='stm run hide_run'><a href='#n594'>594</a></p>
  651. <p id='n595' class='stm run hide_run'><a href='#n595'>595</a></p>
  652. <p id='n596' class='stm mis'><a href='#n596'>596</a></p>
  653. <p id='n597' class='stm mis'><a href='#n597'>597</a></p>
  654. <p id='n598' class='pln'><a href='#n598'>598</a></p>
  655. <p id='n599' class='stm run hide_run'><a href='#n599'>599</a></p>
  656. <p id='n600' class='pln'><a href='#n600'>600</a></p>
  657. <p id='n601' class='pln'><a href='#n601'>601</a></p>
  658. <p id='n602' class='stm run hide_run'><a href='#n602'>602</a></p>
  659. <p id='n603' class='stm run hide_run'><a href='#n603'>603</a></p>
  660. <p id='n604' class='stm run hide_run'><a href='#n604'>604</a></p>
  661. <p id='n605' class='stm run hide_run'><a href='#n605'>605</a></p>
  662. <p id='n606' class='pln'><a href='#n606'>606</a></p>
  663. <p id='n607' class='pln'><a href='#n607'>607</a></p>
  664. <p id='n608' class='stm mis'><a href='#n608'>608</a></p>
  665. <p id='n609' class='stm mis'><a href='#n609'>609</a></p>
  666. <p id='n610' class='stm mis'><a href='#n610'>610</a></p>
  667. <p id='n611' class='stm mis'><a href='#n611'>611</a></p>
  668. <p id='n612' class='stm mis'><a href='#n612'>612</a></p>
  669. <p id='n613' class='stm mis'><a href='#n613'>613</a></p>
  670. <p id='n614' class='stm mis'><a href='#n614'>614</a></p>
  671. <p id='n615' class='pln'><a href='#n615'>615</a></p>
  672. <p id='n616' class='pln'><a href='#n616'>616</a></p>
  673. <p id='n617' class='stm mis'><a href='#n617'>617</a></p>
  674. <p id='n618' class='stm mis'><a href='#n618'>618</a></p>
  675. <p id='n619' class='stm mis'><a href='#n619'>619</a></p>
  676. <p id='n620' class='stm mis'><a href='#n620'>620</a></p>
  677. <p id='n621' class='stm mis'><a href='#n621'>621</a></p>
  678. <p id='n622' class='pln'><a href='#n622'>622</a></p>
  679. <p id='n623' class='pln'><a href='#n623'>623</a></p>
  680. <p id='n624' class='stm mis'><a href='#n624'>624</a></p>
  681. <p id='n625' class='stm mis'><a href='#n625'>625</a></p>
  682. <p id='n626' class='stm mis'><a href='#n626'>626</a></p>
  683. <p id='n627' class='pln'><a href='#n627'>627</a></p>
  684. <p id='n628' class='stm mis'><a href='#n628'>628</a></p>
  685. <p id='n629' class='stm mis'><a href='#n629'>629</a></p>
  686. <p id='n630' class='pln'><a href='#n630'>630</a></p>
  687. <p id='n631' class='stm mis'><a href='#n631'>631</a></p>
  688. <p id='n632' class='stm mis'><a href='#n632'>632</a></p>
  689. <p id='n633' class='stm mis'><a href='#n633'>633</a></p>
  690. <p id='n634' class='stm mis'><a href='#n634'>634</a></p>
  691. <p id='n635' class='stm mis'><a href='#n635'>635</a></p>
  692. <p id='n636' class='stm mis'><a href='#n636'>636</a></p>
  693. <p id='n637' class='stm mis'><a href='#n637'>637</a></p>
  694. <p id='n638' class='stm mis'><a href='#n638'>638</a></p>
  695. <p id='n639' class='stm mis'><a href='#n639'>639</a></p>
  696. <p id='n640' class='stm mis'><a href='#n640'>640</a></p>
  697. <p id='n641' class='stm mis'><a href='#n641'>641</a></p>
  698. <p id='n642' class='stm mis'><a href='#n642'>642</a></p>
  699. <p id='n643' class='stm mis'><a href='#n643'>643</a></p>
  700. <p id='n644' class='stm mis'><a href='#n644'>644</a></p>
  701. <p id='n645' class='stm mis'><a href='#n645'>645</a></p>
  702. <p id='n646' class='pln'><a href='#n646'>646</a></p>
  703. <p id='n647' class='stm mis'><a href='#n647'>647</a></p>
  704. <p id='n648' class='stm mis'><a href='#n648'>648</a></p>
  705. <p id='n649' class='stm mis'><a href='#n649'>649</a></p>
  706. <p id='n650' class='stm mis'><a href='#n650'>650</a></p>
  707. <p id='n651' class='stm mis'><a href='#n651'>651</a></p>
  708. <p id='n652' class='pln'><a href='#n652'>652</a></p>
  709. <p id='n653' class='stm mis'><a href='#n653'>653</a></p>
  710. <p id='n654' class='stm mis'><a href='#n654'>654</a></p>
  711. <p id='n655' class='stm mis'><a href='#n655'>655</a></p>
  712. <p id='n656' class='stm mis'><a href='#n656'>656</a></p>
  713. <p id='n657' class='stm mis'><a href='#n657'>657</a></p>
  714. <p id='n658' class='pln'><a href='#n658'>658</a></p>
  715. <p id='n659' class='stm mis'><a href='#n659'>659</a></p>
  716. <p id='n660' class='pln'><a href='#n660'>660</a></p>
  717. <p id='n661' class='pln'><a href='#n661'>661</a></p>
  718. <p id='n662' class='pln'><a href='#n662'>662</a></p>
  719. <p id='n663' class='pln'><a href='#n663'>663</a></p>
  720. <p id='n664' class='pln'><a href='#n664'>664</a></p>
  721. <p id='n665' class='pln'><a href='#n665'>665</a></p>
  722. <p id='n666' class='pln'><a href='#n666'>666</a></p>
  723. <p id='n667' class='pln'><a href='#n667'>667</a></p>
  724. <p id='n668' class='pln'><a href='#n668'>668</a></p>
  725. <p id='n669' class='stm run hide_run'><a href='#n669'>669</a></p>
  726. <p id='n670' class='pln'><a href='#n670'>670</a></p>
  727. <p id='n671' class='pln'><a href='#n671'>671</a></p>
  728. <p id='n672' class='stm run hide_run'><a href='#n672'>672</a></p>
  729. <p id='n673' class='stm run hide_run'><a href='#n673'>673</a></p>
  730. <p id='n674' class='pln'><a href='#n674'>674</a></p>
  731. <p id='n675' class='stm run hide_run'><a href='#n675'>675</a></p>
  732. <p id='n676' class='stm run hide_run'><a href='#n676'>676</a></p>
  733. <p id='n677' class='pln'><a href='#n677'>677</a></p>
  734. <p id='n678' class='stm run hide_run'><a href='#n678'>678</a></p>
  735. <p id='n679' class='pln'><a href='#n679'>679</a></p>
  736. <p id='n680' class='stm run hide_run'><a href='#n680'>680</a></p>
  737. <p id='n681' class='pln'><a href='#n681'>681</a></p>
  738. <p id='n682' class='stm run hide_run'><a href='#n682'>682</a></p>
  739. <p id='n683' class='pln'><a href='#n683'>683</a></p>
  740. <p id='n684' class='stm run hide_run'><a href='#n684'>684</a></p>
  741. <p id='n685' class='stm run hide_run'><a href='#n685'>685</a></p>
  742. <p id='n686' class='stm mis'><a href='#n686'>686</a></p>
  743. <p id='n687' class='stm mis'><a href='#n687'>687</a></p>
  744. <p id='n688' class='pln'><a href='#n688'>688</a></p>
  745. <p id='n689' class='stm run hide_run'><a href='#n689'>689</a></p>
  746. <p id='n690' class='pln'><a href='#n690'>690</a></p>
  747. <p id='n691' class='stm run hide_run'><a href='#n691'>691</a></p>
  748. <p id='n692' class='pln'><a href='#n692'>692</a></p>
  749. <p id='n693' class='pln'><a href='#n693'>693</a></p>
  750. <p id='n694' class='stm run hide_run'><a href='#n694'>694</a></p>
  751. <p id='n695' class='stm run hide_run'><a href='#n695'>695</a></p>
  752. <p id='n696' class='stm run hide_run'><a href='#n696'>696</a></p>
  753. <p id='n697' class='pln'><a href='#n697'>697</a></p>
  754. <p id='n698' class='pln'><a href='#n698'>698</a></p>
  755. <p id='n699' class='stm run hide_run'><a href='#n699'>699</a></p>
  756. <p id='n700' class='stm run hide_run'><a href='#n700'>700</a></p>
  757. <p id='n701' class='stm run hide_run'><a href='#n701'>701</a></p>
  758. <p id='n702' class='stm mis'><a href='#n702'>702</a></p>
  759. <p id='n703' class='stm mis'><a href='#n703'>703</a></p>
  760. <p id='n704' class='stm run hide_run'><a href='#n704'>704</a></p>
  761. <p id='n705' class='pln'><a href='#n705'>705</a></p>
  762. <p id='n706' class='stm run hide_run'><a href='#n706'>706</a></p>
  763. <p id='n707' class='stm run hide_run'><a href='#n707'>707</a></p>
  764. <p id='n708' class='stm run hide_run'><a href='#n708'>708</a></p>
  765. <p id='n709' class='stm run hide_run'><a href='#n709'>709</a></p>
  766. <p id='n710' class='stm run hide_run'><a href='#n710'>710</a></p>
  767. <p id='n711' class='pln'><a href='#n711'>711</a></p>
  768. <p id='n712' class='stm mis'><a href='#n712'>712</a></p>
  769. <p id='n713' class='stm mis'><a href='#n713'>713</a></p>
  770. <p id='n714' class='pln'><a href='#n714'>714</a></p>
  771. <p id='n715' class='stm run hide_run'><a href='#n715'>715</a></p>
  772. <p id='n716' class='stm run hide_run'><a href='#n716'>716</a></p>
  773. <p id='n717' class='stm mis'><a href='#n717'>717</a></p>
  774. <p id='n718' class='stm mis'><a href='#n718'>718</a></p>
  775. <p id='n719' class='pln'><a href='#n719'>719</a></p>
  776. <p id='n720' class='stm run hide_run'><a href='#n720'>720</a></p>
  777. <p id='n721' class='pln'><a href='#n721'>721</a></p>
  778. <p id='n722' class='pln'><a href='#n722'>722</a></p>
  779. <p id='n723' class='pln'><a href='#n723'>723</a></p>
  780. <p id='n724' class='stm run hide_run'><a href='#n724'>724</a></p>
  781. <p id='n725' class='stm run hide_run'><a href='#n725'>725</a></p>
  782. <p id='n726' class='stm mis'><a href='#n726'>726</a></p>
  783. <p id='n727' class='stm mis'><a href='#n727'>727</a></p>
  784. <p id='n728' class='stm run hide_run'><a href='#n728'>728</a></p>
  785. <p id='n729' class='pln'><a href='#n729'>729</a></p>
  786. <p id='n730' class='stm run hide_run'><a href='#n730'>730</a></p>
  787. <p id='n731' class='stm run hide_run'><a href='#n731'>731</a></p>
  788. <p id='n732' class='stm run hide_run'><a href='#n732'>732</a></p>
  789. <p id='n733' class='pln'><a href='#n733'>733</a></p>
  790. <p id='n734' class='stm mis'><a href='#n734'>734</a></p>
  791. <p id='n735' class='stm mis'><a href='#n735'>735</a></p>
  792. <p id='n736' class='stm mis'><a href='#n736'>736</a></p>
  793. <p id='n737' class='pln'><a href='#n737'>737</a></p>
  794. <p id='n738' class='stm mis'><a href='#n738'>738</a></p>
  795. <p id='n739' class='pln'><a href='#n739'>739</a></p>
  796. <p id='n740' class='stm run hide_run'><a href='#n740'>740</a></p>
  797. <p id='n741' class='pln'><a href='#n741'>741</a></p>
  798. <p id='n742' class='stm run hide_run'><a href='#n742'>742</a></p>
  799. <p id='n743' class='stm run hide_run'><a href='#n743'>743</a></p>
  800. <p id='n744' class='stm run hide_run'><a href='#n744'>744</a></p>
  801. <p id='n745' class='stm mis'><a href='#n745'>745</a></p>
  802. <p id='n746' class='pln'><a href='#n746'>746</a></p>
  803. <p id='n747' class='stm run hide_run'><a href='#n747'>747</a></p>
  804. <p id='n748' class='pln'><a href='#n748'>748</a></p>
  805. <p id='n749' class='pln'><a href='#n749'>749</a></p>
  806. <p id='n750' class='pln'><a href='#n750'>750</a></p>
  807. <p id='n751' class='pln'><a href='#n751'>751</a></p>
  808. <p id='n752' class='pln'><a href='#n752'>752</a></p>
  809. <p id='n753' class='pln'><a href='#n753'>753</a></p>
  810. <p id='n754' class='pln'><a href='#n754'>754</a></p>
  811. <p id='n755' class='pln'><a href='#n755'>755</a></p>
  812. <p id='n756' class='pln'><a href='#n756'>756</a></p>
  813. <p id='n757' class='stm run hide_run'><a href='#n757'>757</a></p>
  814. <p id='n758' class='pln'><a href='#n758'>758</a></p>
  815. <p id='n759' class='pln'><a href='#n759'>759</a></p>
  816. <p id='n760' class='stm run hide_run'><a href='#n760'>760</a></p>
  817. <p id='n761' class='stm run hide_run'><a href='#n761'>761</a></p>
  818. <p id='n762' class='pln'><a href='#n762'>762</a></p>
  819. <p id='n763' class='stm run hide_run'><a href='#n763'>763</a></p>
  820. <p id='n764' class='stm mis'><a href='#n764'>764</a></p>
  821. <p id='n765' class='pln'><a href='#n765'>765</a></p>
  822. <p id='n766' class='stm run hide_run'><a href='#n766'>766</a></p>
  823. <p id='n767' class='pln'><a href='#n767'>767</a></p>
  824. <p id='n768' class='stm mis'><a href='#n768'>768</a></p>
  825. <p id='n769' class='pln'><a href='#n769'>769</a></p>
  826. <p id='n770' class='stm run hide_run'><a href='#n770'>770</a></p>
  827. <p id='n771' class='pln'><a href='#n771'>771</a></p>
  828. <p id='n772' class='stm mis'><a href='#n772'>772</a></p>
  829. <p id='n773' class='pln'><a href='#n773'>773</a></p>
  830. <p id='n774' class='stm run hide_run'><a href='#n774'>774</a></p>
  831. <p id='n775' class='pln'><a href='#n775'>775</a></p>
  832. <p id='n776' class='stm mis'><a href='#n776'>776</a></p>
  833. <p id='n777' class='stm mis'><a href='#n777'>777</a></p>
  834. <p id='n778' class='stm mis'><a href='#n778'>778</a></p>
  835. <p id='n779' class='stm mis'><a href='#n779'>779</a></p>
  836. <p id='n780' class='pln'><a href='#n780'>780</a></p>
  837. <p id='n781' class='stm mis'><a href='#n781'>781</a></p>
  838. <p id='n782' class='pln'><a href='#n782'>782</a></p>
  839. <p id='n783' class='stm mis'><a href='#n783'>783</a></p>
  840. <p id='n784' class='pln'><a href='#n784'>784</a></p>
  841. <p id='n785' class='pln'><a href='#n785'>785</a></p>
  842. <p id='n786' class='stm mis'><a href='#n786'>786</a></p>
  843. <p id='n787' class='stm mis'><a href='#n787'>787</a></p>
  844. <p id='n788' class='stm mis'><a href='#n788'>788</a></p>
  845. <p id='n789' class='stm mis'><a href='#n789'>789</a></p>
  846. <p id='n790' class='stm mis'><a href='#n790'>790</a></p>
  847. <p id='n791' class='stm mis'><a href='#n791'>791</a></p>
  848. <p id='n792' class='stm mis'><a href='#n792'>792</a></p>
  849. <p id='n793' class='pln'><a href='#n793'>793</a></p>
  850. <p id='n794' class='pln'><a href='#n794'>794</a></p>
  851. <p id='n795' class='stm mis'><a href='#n795'>795</a></p>
  852. <p id='n796' class='stm mis'><a href='#n796'>796</a></p>
  853. <p id='n797' class='stm mis'><a href='#n797'>797</a></p>
  854. <p id='n798' class='stm mis'><a href='#n798'>798</a></p>
  855. <p id='n799' class='stm mis'><a href='#n799'>799</a></p>
  856. <p id='n800' class='stm mis'><a href='#n800'>800</a></p>
  857. <p id='n801' class='pln'><a href='#n801'>801</a></p>
  858. <p id='n802' class='stm mis'><a href='#n802'>802</a></p>
  859. <p id='n803' class='pln'><a href='#n803'>803</a></p>
  860. <p id='n804' class='stm mis'><a href='#n804'>804</a></p>
  861. <p id='n805' class='stm mis'><a href='#n805'>805</a></p>
  862. <p id='n806' class='stm mis'><a href='#n806'>806</a></p>
  863. <p id='n807' class='stm mis'><a href='#n807'>807</a></p>
  864. <p id='n808' class='stm mis'><a href='#n808'>808</a></p>
  865. <p id='n809' class='pln'><a href='#n809'>809</a></p>
  866. <p id='n810' class='stm mis'><a href='#n810'>810</a></p>
  867. <p id='n811' class='pln'><a href='#n811'>811</a></p>
  868. <p id='n812' class='stm mis'><a href='#n812'>812</a></p>
  869. <p id='n813' class='pln'><a href='#n813'>813</a></p>
  870. <p id='n814' class='pln'><a href='#n814'>814</a></p>
  871. <p id='n815' class='pln'><a href='#n815'>815</a></p>
  872. <p id='n816' class='pln'><a href='#n816'>816</a></p>
  873. <p id='n817' class='pln'><a href='#n817'>817</a></p>
  874. <p id='n818' class='pln'><a href='#n818'>818</a></p>
  875. <p id='n819' class='pln'><a href='#n819'>819</a></p>
  876. <p id='n820' class='pln'><a href='#n820'>820</a></p>
  877. <p id='n821' class='pln'><a href='#n821'>821</a></p>
  878. <p id='n822' class='stm run hide_run'><a href='#n822'>822</a></p>
  879. <p id='n823' class='pln'><a href='#n823'>823</a></p>
  880. <p id='n824' class='pln'><a href='#n824'>824</a></p>
  881. <p id='n825' class='stm run hide_run'><a href='#n825'>825</a></p>
  882. <p id='n826' class='pln'><a href='#n826'>826</a></p>
  883. <p id='n827' class='pln'><a href='#n827'>827</a></p>
  884. <p id='n828' class='stm run hide_run'><a href='#n828'>828</a></p>
  885. <p id='n829' class='stm run hide_run'><a href='#n829'>829</a></p>
  886. <p id='n830' class='stm run hide_run'><a href='#n830'>830</a></p>
  887. <p id='n831' class='pln'><a href='#n831'>831</a></p>
  888. <p id='n832' class='stm run hide_run'><a href='#n832'>832</a></p>
  889. <p id='n833' class='stm mis'><a href='#n833'>833</a></p>
  890. <p id='n834' class='pln'><a href='#n834'>834</a></p>
  891. <p id='n835' class='stm run hide_run'><a href='#n835'>835</a></p>
  892. <p id='n836' class='pln'><a href='#n836'>836</a></p>
  893. <p id='n837' class='stm mis'><a href='#n837'>837</a></p>
  894. <p id='n838' class='pln'><a href='#n838'>838</a></p>
  895. <p id='n839' class='stm run hide_run'><a href='#n839'>839</a></p>
  896. <p id='n840' class='pln'><a href='#n840'>840</a></p>
  897. <p id='n841' class='stm mis'><a href='#n841'>841</a></p>
  898. <p id='n842' class='pln'><a href='#n842'>842</a></p>
  899. <p id='n843' class='stm run hide_run'><a href='#n843'>843</a></p>
  900. <p id='n844' class='pln'><a href='#n844'>844</a></p>
  901. <p id='n845' class='stm mis'><a href='#n845'>845</a></p>
  902. <p id='n846' class='stm mis'><a href='#n846'>846</a></p>
  903. <p id='n847' class='stm mis'><a href='#n847'>847</a></p>
  904. <p id='n848' class='stm mis'><a href='#n848'>848</a></p>
  905. <p id='n849' class='pln'><a href='#n849'>849</a></p>
  906. <p id='n850' class='stm mis'><a href='#n850'>850</a></p>
  907. <p id='n851' class='stm mis'><a href='#n851'>851</a></p>
  908. <p id='n852' class='pln'><a href='#n852'>852</a></p>
  909. <p id='n853' class='pln'><a href='#n853'>853</a></p>
  910. <p id='n854' class='pln'><a href='#n854'>854</a></p>
  911. <p id='n855' class='stm mis'><a href='#n855'>855</a></p>
  912. <p id='n856' class='stm mis'><a href='#n856'>856</a></p>
  913. <p id='n857' class='stm mis'><a href='#n857'>857</a></p>
  914. <p id='n858' class='stm mis'><a href='#n858'>858</a></p>
  915. <p id='n859' class='stm mis'><a href='#n859'>859</a></p>
  916. <p id='n860' class='stm mis'><a href='#n860'>860</a></p>
  917. <p id='n861' class='stm mis'><a href='#n861'>861</a></p>
  918. <p id='n862' class='pln'><a href='#n862'>862</a></p>
  919. <p id='n863' class='stm mis'><a href='#n863'>863</a></p>
  920. <p id='n864' class='stm mis'><a href='#n864'>864</a></p>
  921. <p id='n865' class='stm mis'><a href='#n865'>865</a></p>
  922. <p id='n866' class='stm mis'><a href='#n866'>866</a></p>
  923. <p id='n867' class='stm mis'><a href='#n867'>867</a></p>
  924. <p id='n868' class='pln'><a href='#n868'>868</a></p>
  925. <p id='n869' class='stm mis'><a href='#n869'>869</a></p>
  926. <p id='n870' class='stm mis'><a href='#n870'>870</a></p>
  927. <p id='n871' class='stm mis'><a href='#n871'>871</a></p>
  928. <p id='n872' class='stm mis'><a href='#n872'>872</a></p>
  929. <p id='n873' class='stm mis'><a href='#n873'>873</a></p>
  930. <p id='n874' class='pln'><a href='#n874'>874</a></p>
  931. <p id='n875' class='stm mis'><a href='#n875'>875</a></p>
  932. <p id='n876' class='stm mis'><a href='#n876'>876</a></p>
  933. <p id='n877' class='pln'><a href='#n877'>877</a></p>
  934. <p id='n878' class='pln'><a href='#n878'>878</a></p>
  935. <p id='n879' class='stm mis'><a href='#n879'>879</a></p>
  936. <p id='n880' class='stm mis'><a href='#n880'>880</a></p>
  937. <p id='n881' class='stm mis'><a href='#n881'>881</a></p>
  938. <p id='n882' class='stm mis'><a href='#n882'>882</a></p>
  939. <p id='n883' class='stm mis'><a href='#n883'>883</a></p>
  940. <p id='n884' class='stm mis'><a href='#n884'>884</a></p>
  941. <p id='n885' class='stm mis'><a href='#n885'>885</a></p>
  942. <p id='n886' class='pln'><a href='#n886'>886</a></p>
  943. <p id='n887' class='pln'><a href='#n887'>887</a></p>
  944. <p id='n888' class='stm mis'><a href='#n888'>888</a></p>
  945. <p id='n889' class='stm mis'><a href='#n889'>889</a></p>
  946. <p id='n890' class='stm mis'><a href='#n890'>890</a></p>
  947. <p id='n891' class='stm mis'><a href='#n891'>891</a></p>
  948. <p id='n892' class='stm mis'><a href='#n892'>892</a></p>
  949. <p id='n893' class='stm mis'><a href='#n893'>893</a></p>
  950. <p id='n894' class='pln'><a href='#n894'>894</a></p>
  951. <p id='n895' class='stm mis'><a href='#n895'>895</a></p>
  952. <p id='n896' class='stm mis'><a href='#n896'>896</a></p>
  953. <p id='n897' class='stm mis'><a href='#n897'>897</a></p>
  954. <p id='n898' class='stm mis'><a href='#n898'>898</a></p>
  955. <p id='n899' class='stm mis'><a href='#n899'>899</a></p>
  956. <p id='n900' class='pln'><a href='#n900'>900</a></p>
  957. <p id='n901' class='pln'><a href='#n901'>901</a></p>
  958. <p id='n902' class='stm mis'><a href='#n902'>902</a></p>
  959. <p id='n903' class='stm mis'><a href='#n903'>903</a></p>
  960. <p id='n904' class='stm mis'><a href='#n904'>904</a></p>
  961. <p id='n905' class='stm mis'><a href='#n905'>905</a></p>
  962. <p id='n906' class='stm mis'><a href='#n906'>906</a></p>
  963. <p id='n907' class='pln'><a href='#n907'>907</a></p>
  964. <p id='n908' class='pln'><a href='#n908'>908</a></p>
  965. <p id='n909' class='stm mis'><a href='#n909'>909</a></p>
  966. <p id='n910' class='stm mis'><a href='#n910'>910</a></p>
  967. <p id='n911' class='stm mis'><a href='#n911'>911</a></p>
  968. <p id='n912' class='stm mis'><a href='#n912'>912</a></p>
  969. <p id='n913' class='stm mis'><a href='#n913'>913</a></p>
  970. <p id='n914' class='stm mis'><a href='#n914'>914</a></p>
  971. <p id='n915' class='stm mis'><a href='#n915'>915</a></p>
  972. <p id='n916' class='pln'><a href='#n916'>916</a></p>
  973. <p id='n917' class='pln'><a href='#n917'>917</a></p>
  974. <p id='n918' class='stm mis'><a href='#n918'>918</a></p>
  975. <p id='n919' class='stm mis'><a href='#n919'>919</a></p>
  976. <p id='n920' class='stm mis'><a href='#n920'>920</a></p>
  977. <p id='n921' class='stm mis'><a href='#n921'>921</a></p>
  978. <p id='n922' class='stm mis'><a href='#n922'>922</a></p>
  979. <p id='n923' class='pln'><a href='#n923'>923</a></p>
  980. <p id='n924' class='stm mis'><a href='#n924'>924</a></p>
  981. <p id='n925' class='stm mis'><a href='#n925'>925</a></p>
  982. <p id='n926' class='stm mis'><a href='#n926'>926</a></p>
  983. <p id='n927' class='stm mis'><a href='#n927'>927</a></p>
  984. <p id='n928' class='stm mis'><a href='#n928'>928</a></p>
  985. <p id='n929' class='pln'><a href='#n929'>929</a></p>
  986. <p id='n930' class='pln'><a href='#n930'>930</a></p>
  987. <p id='n931' class='pln'><a href='#n931'>931</a></p>
  988. <p id='n932' class='pln'><a href='#n932'>932</a></p>
  989. <p id='n933' class='stm mis'><a href='#n933'>933</a></p>
  990. <p id='n934' class='stm mis'><a href='#n934'>934</a></p>
  991. <p id='n935' class='stm mis'><a href='#n935'>935</a></p>
  992. <p id='n936' class='pln'><a href='#n936'>936</a></p>
  993. <p id='n937' class='pln'><a href='#n937'>937</a></p>
  994. <p id='n938' class='stm mis'><a href='#n938'>938</a></p>
  995. <p id='n939' class='stm mis'><a href='#n939'>939</a></p>
  996. <p id='n940' class='stm mis'><a href='#n940'>940</a></p>
  997. <p id='n941' class='stm mis'><a href='#n941'>941</a></p>
  998. <p id='n942' class='stm mis'><a href='#n942'>942</a></p>
  999. <p id='n943' class='stm mis'><a href='#n943'>943</a></p>
  1000. <p id='n944' class='pln'><a href='#n944'>944</a></p>
  1001. <p id='n945' class='pln'><a href='#n945'>945</a></p>
  1002. <p id='n946' class='stm mis'><a href='#n946'>946</a></p>
  1003. <p id='n947' class='stm mis'><a href='#n947'>947</a></p>
  1004. <p id='n948' class='stm mis'><a href='#n948'>948</a></p>
  1005. <p id='n949' class='stm mis'><a href='#n949'>949</a></p>
  1006. <p id='n950' class='stm mis'><a href='#n950'>950</a></p>
  1007. <p id='n951' class='stm mis'><a href='#n951'>951</a></p>
  1008. <p id='n952' class='pln'><a href='#n952'>952</a></p>
  1009. <p id='n953' class='stm mis'><a href='#n953'>953</a></p>
  1010. <p id='n954' class='pln'><a href='#n954'>954</a></p>
  1011. <p id='n955' class='pln'><a href='#n955'>955</a></p>
  1012. <p id='n956' class='pln'><a href='#n956'>956</a></p>
  1013. <p id='n957' class='pln'><a href='#n957'>957</a></p>
  1014. <p id='n958' class='pln'><a href='#n958'>958</a></p>
  1015. <p id='n959' class='pln'><a href='#n959'>959</a></p>
  1016. <p id='n960' class='pln'><a href='#n960'>960</a></p>
  1017. <p id='n961' class='pln'><a href='#n961'>961</a></p>
  1018. <p id='n962' class='pln'><a href='#n962'>962</a></p>
  1019. <p id='n963' class='pln'><a href='#n963'>963</a></p>
  1020. <p id='n964' class='pln'><a href='#n964'>964</a></p>
  1021. <p id='n965' class='stm run hide_run'><a href='#n965'>965</a></p>
  1022. <p id='n966' class='pln'><a href='#n966'>966</a></p>
  1023. <p id='n967' class='pln'><a href='#n967'>967</a></p>
  1024. <p id='n968' class='pln'><a href='#n968'>968</a></p>
  1025. <p id='n969' class='stm run hide_run'><a href='#n969'>969</a></p>
  1026. <p id='n970' class='stm run hide_run'><a href='#n970'>970</a></p>
  1027. <p id='n971' class='pln'><a href='#n971'>971</a></p>
  1028. <p id='n972' class='stm run hide_run'><a href='#n972'>972</a></p>
  1029. <p id='n973' class='stm run hide_run'><a href='#n973'>973</a></p>
  1030. <p id='n974' class='pln'><a href='#n974'>974</a></p>
  1031. <p id='n975' class='stm run hide_run'><a href='#n975'>975</a></p>
  1032. <p id='n976' class='pln'><a href='#n976'>976</a></p>
  1033. <p id='n977' class='stm run hide_run'><a href='#n977'>977</a></p>
  1034. <p id='n978' class='pln'><a href='#n978'>978</a></p>
  1035. <p id='n979' class='stm run hide_run'><a href='#n979'>979</a></p>
  1036. <p id='n980' class='pln'><a href='#n980'>980</a></p>
  1037. <p id='n981' class='stm run hide_run'><a href='#n981'>981</a></p>
  1038. <p id='n982' class='pln'><a href='#n982'>982</a></p>
  1039. <p id='n983' class='stm run hide_run'><a href='#n983'>983</a></p>
  1040. <p id='n984' class='pln'><a href='#n984'>984</a></p>
  1041. <p id='n985' class='stm run hide_run'><a href='#n985'>985</a></p>
  1042. <p id='n986' class='stm run hide_run'><a href='#n986'>986</a></p>
  1043. <p id='n987' class='stm mis'><a href='#n987'>987</a></p>
  1044. <p id='n988' class='stm mis'><a href='#n988'>988</a></p>
  1045. <p id='n989' class='pln'><a href='#n989'>989</a></p>
  1046. <p id='n990' class='stm run hide_run'><a href='#n990'>990</a></p>
  1047. <p id='n991' class='pln'><a href='#n991'>991</a></p>
  1048. <p id='n992' class='pln'><a href='#n992'>992</a></p>
  1049. <p id='n993' class='stm run hide_run'><a href='#n993'>993</a></p>
  1050. <p id='n994' class='stm run hide_run'><a href='#n994'>994</a></p>
  1051. <p id='n995' class='stm run hide_run'><a href='#n995'>995</a></p>
  1052. <p id='n996' class='stm run hide_run'><a href='#n996'>996</a></p>
  1053. <p id='n997' class='stm run hide_run'><a href='#n997'>997</a></p>
  1054. <p id='n998' class='stm mis'><a href='#n998'>998</a></p>
  1055. <p id='n999' class='stm mis'><a href='#n999'>999</a></p>
  1056. <p id='n1000' class='stm mis'><a href='#n1000'>1000</a></p>
  1057. <p id='n1001' class='pln'><a href='#n1001'>1001</a></p>
  1058. <p id='n1002' class='pln'><a href='#n1002'>1002</a></p>
  1059. <p id='n1003' class='pln'><a href='#n1003'>1003</a></p>
  1060. <p id='n1004' class='pln'><a href='#n1004'>1004</a></p>
  1061. <p id='n1005' class='stm run hide_run'><a href='#n1005'>1005</a></p>
  1062. <p id='n1006' class='pln'><a href='#n1006'>1006</a></p>
  1063. <p id='n1007' class='pln'><a href='#n1007'>1007</a></p>
  1064. <p id='n1008' class='stm run hide_run'><a href='#n1008'>1008</a></p>
  1065. <p id='n1009' class='stm run hide_run'><a href='#n1009'>1009</a></p>
  1066. <p id='n1010' class='stm run hide_run'><a href='#n1010'>1010</a></p>
  1067. <p id='n1011' class='stm mis'><a href='#n1011'>1011</a></p>
  1068. <p id='n1012' class='stm mis'><a href='#n1012'>1012</a></p>
  1069. <p id='n1013' class='stm mis'><a href='#n1013'>1013</a></p>
  1070. <p id='n1014' class='pln'><a href='#n1014'>1014</a></p>
  1071. <p id='n1015' class='pln'><a href='#n1015'>1015</a></p>
  1072. <p id='n1016' class='stm run hide_run'><a href='#n1016'>1016</a></p>
  1073. <p id='n1017' class='pln'><a href='#n1017'>1017</a></p>
  1074. <p id='n1018' class='pln'><a href='#n1018'>1018</a></p>
  1075. <p id='n1019' class='stm run hide_run'><a href='#n1019'>1019</a></p>
  1076. <p id='n1020' class='stm run hide_run'><a href='#n1020'>1020</a></p>
  1077. <p id='n1021' class='pln'><a href='#n1021'>1021</a></p>
  1078. <p id='n1022' class='pln'><a href='#n1022'>1022</a></p>
  1079. <p id='n1023' class='stm run hide_run'><a href='#n1023'>1023</a></p>
  1080. <p id='n1024' class='pln'><a href='#n1024'>1024</a></p>
  1081. <p id='n1025' class='pln'><a href='#n1025'>1025</a></p>
  1082. <p id='n1026' class='stm run hide_run'><a href='#n1026'>1026</a></p>
  1083. <p id='n1027' class='stm run hide_run'><a href='#n1027'>1027</a></p>
  1084. <p id='n1028' class='stm mis'><a href='#n1028'>1028</a></p>
  1085. <p id='n1029' class='pln'><a href='#n1029'>1029</a></p>
  1086. <p id='n1030' class='pln'><a href='#n1030'>1030</a></p>
  1087. <p id='n1031' class='stm run hide_run'><a href='#n1031'>1031</a></p>
  1088. <p id='n1032' class='stm run hide_run'><a href='#n1032'>1032</a></p>
  1089. <p id='n1033' class='stm run hide_run'><a href='#n1033'>1033</a></p>
  1090. <p id='n1034' class='stm run hide_run'><a href='#n1034'>1034</a></p>
  1091. <p id='n1035' class='pln'><a href='#n1035'>1035</a></p>
  1092. <p id='n1036' class='pln'><a href='#n1036'>1036</a></p>
  1093. <p id='n1037' class='stm run hide_run'><a href='#n1037'>1037</a></p>
  1094. <p id='n1038' class='stm run hide_run'><a href='#n1038'>1038</a></p>
  1095. <p id='n1039' class='pln'><a href='#n1039'>1039</a></p>
  1096. <p id='n1040' class='pln'><a href='#n1040'>1040</a></p>
  1097. <p id='n1041' class='pln'><a href='#n1041'>1041</a></p>
  1098. <p id='n1042' class='pln'><a href='#n1042'>1042</a></p>
  1099. <p id='n1043' class='stm run hide_run'><a href='#n1043'>1043</a></p>
  1100. <p id='n1044' class='stm run hide_run'><a href='#n1044'>1044</a></p>
  1101. <p id='n1045' class='stm run hide_run'><a href='#n1045'>1045</a></p>
  1102. <p id='n1046' class='stm run hide_run'><a href='#n1046'>1046</a></p>
  1103. <p id='n1047' class='stm run hide_run'><a href='#n1047'>1047</a></p>
  1104. <p id='n1048' class='stm run hide_run'><a href='#n1048'>1048</a></p>
  1105. <p id='n1049' class='stm mis'><a href='#n1049'>1049</a></p>
  1106. <p id='n1050' class='stm mis'><a href='#n1050'>1050</a></p>
  1107. <p id='n1051' class='pln'><a href='#n1051'>1051</a></p>
  1108. <p id='n1052' class='stm mis'><a href='#n1052'>1052</a></p>
  1109. <p id='n1053' class='pln'><a href='#n1053'>1053</a></p>
  1110. <p id='n1054' class='stm run hide_run'><a href='#n1054'>1054</a></p>
  1111. <p id='n1055' class='stm run hide_run'><a href='#n1055'>1055</a></p>
  1112. <p id='n1056' class='stm run hide_run'><a href='#n1056'>1056</a></p>
  1113. <p id='n1057' class='stm run hide_run'><a href='#n1057'>1057</a></p>
  1114. <p id='n1058' class='stm run hide_run'><a href='#n1058'>1058</a></p>
  1115. <p id='n1059' class='stm run hide_run'><a href='#n1059'>1059</a></p>
  1116. <p id='n1060' class='stm run hide_run'><a href='#n1060'>1060</a></p>
  1117. <p id='n1061' class='pln'><a href='#n1061'>1061</a></p>
  1118. <p id='n1062' class='stm mis'><a href='#n1062'>1062</a></p>
  1119. <p id='n1063' class='stm mis'><a href='#n1063'>1063</a></p>
  1120. <p id='n1064' class='pln'><a href='#n1064'>1064</a></p>
  1121. <p id='n1065' class='stm run hide_run'><a href='#n1065'>1065</a></p>
  1122. <p id='n1066' class='pln'><a href='#n1066'>1066</a></p>
  1123. <p id='n1067' class='pln'><a href='#n1067'>1067</a></p>
  1124. <p id='n1068' class='stm run hide_run'><a href='#n1068'>1068</a></p>
  1125. <p id='n1069' class='pln'><a href='#n1069'>1069</a></p>
  1126. <p id='n1070' class='pln'><a href='#n1070'>1070</a></p>
  1127. <p id='n1071' class='pln'><a href='#n1071'>1071</a></p>
  1128. <p id='n1072' class='pln'><a href='#n1072'>1072</a></p>
  1129. <p id='n1073' class='pln'><a href='#n1073'>1073</a></p>
  1130. <p id='n1074' class='pln'><a href='#n1074'>1074</a></p>
  1131. <p id='n1075' class='pln'><a href='#n1075'>1075</a></p>
  1132. <p id='n1076' class='pln'><a href='#n1076'>1076</a></p>
  1133. <p id='n1077' class='pln'><a href='#n1077'>1077</a></p>
  1134. <p id='n1078' class='pln'><a href='#n1078'>1078</a></p>
  1135. <p id='n1079' class='pln'><a href='#n1079'>1079</a></p>
  1136. <p id='n1080' class='pln'><a href='#n1080'>1080</a></p>
  1137. <p id='n1081' class='stm run hide_run'><a href='#n1081'>1081</a></p>
  1138. <p id='n1082' class='pln'><a href='#n1082'>1082</a></p>
  1139. <p id='n1083' class='pln'><a href='#n1083'>1083</a></p>
  1140. <p id='n1084' class='stm run hide_run'><a href='#n1084'>1084</a></p>
  1141. <p id='n1085' class='stm run hide_run'><a href='#n1085'>1085</a></p>
  1142. <p id='n1086' class='pln'><a href='#n1086'>1086</a></p>
  1143. <p id='n1087' class='stm run hide_run'><a href='#n1087'>1087</a></p>
  1144. <p id='n1088' class='pln'><a href='#n1088'>1088</a></p>
  1145. <p id='n1089' class='stm run hide_run'><a href='#n1089'>1089</a></p>
  1146. <p id='n1090' class='stm mis'><a href='#n1090'>1090</a></p>
  1147. <p id='n1091' class='pln'><a href='#n1091'>1091</a></p>
  1148. <p id='n1092' class='stm run hide_run'><a href='#n1092'>1092</a></p>
  1149. <p id='n1093' class='pln'><a href='#n1093'>1093</a></p>
  1150. <p id='n1094' class='stm mis'><a href='#n1094'>1094</a></p>
  1151. <p id='n1095' class='pln'><a href='#n1095'>1095</a></p>
  1152. <p id='n1096' class='stm run hide_run'><a href='#n1096'>1096</a></p>
  1153. <p id='n1097' class='pln'><a href='#n1097'>1097</a></p>
  1154. <p id='n1098' class='stm mis'><a href='#n1098'>1098</a></p>
  1155. <p id='n1099' class='pln'><a href='#n1099'>1099</a></p>
  1156. <p id='n1100' class='stm run hide_run'><a href='#n1100'>1100</a></p>
  1157. <p id='n1101' class='stm mis'><a href='#n1101'>1101</a></p>
  1158. <p id='n1102' class='stm mis'><a href='#n1102'>1102</a></p>
  1159. <p id='n1103' class='stm mis'><a href='#n1103'>1103</a></p>
  1160. <p id='n1104' class='stm mis'><a href='#n1104'>1104</a></p>
  1161. <p id='n1105' class='stm mis'><a href='#n1105'>1105</a></p>
  1162. <p id='n1106' class='stm mis'><a href='#n1106'>1106</a></p>
  1163. <p id='n1107' class='stm mis'><a href='#n1107'>1107</a></p>
  1164. <p id='n1108' class='stm mis'><a href='#n1108'>1108</a></p>
  1165. <p id='n1109' class='stm mis'><a href='#n1109'>1109</a></p>
  1166. <p id='n1110' class='stm mis'><a href='#n1110'>1110</a></p>
  1167. <p id='n1111' class='stm mis'><a href='#n1111'>1111</a></p>
  1168. <p id='n1112' class='pln'><a href='#n1112'>1112</a></p>
  1169. <p id='n1113' class='stm run hide_run'><a href='#n1113'>1113</a></p>
  1170. <p id='n1114' class='stm mis'><a href='#n1114'>1114</a></p>
  1171. <p id='n1115' class='stm mis'><a href='#n1115'>1115</a></p>
  1172. <p id='n1116' class='stm mis'><a href='#n1116'>1116</a></p>
  1173. <p id='n1117' class='pln'><a href='#n1117'>1117</a></p>
  1174. <p id='n1118' class='stm mis'><a href='#n1118'>1118</a></p>
  1175. <p id='n1119' class='stm mis'><a href='#n1119'>1119</a></p>
  1176. <p id='n1120' class='stm mis'><a href='#n1120'>1120</a></p>
  1177. <p id='n1121' class='pln'><a href='#n1121'>1121</a></p>
  1178. <p id='n1122' class='stm mis'><a href='#n1122'>1122</a></p>
  1179. <p id='n1123' class='stm mis'><a href='#n1123'>1123</a></p>
  1180. <p id='n1124' class='stm mis'><a href='#n1124'>1124</a></p>
  1181. <p id='n1125' class='stm mis'><a href='#n1125'>1125</a></p>
  1182. <p id='n1126' class='pln'><a href='#n1126'>1126</a></p>
  1183. <p id='n1127' class='stm mis'><a href='#n1127'>1127</a></p>
  1184. <p id='n1128' class='pln'><a href='#n1128'>1128</a></p>
  1185. <p id='n1129' class='stm mis'><a href='#n1129'>1129</a></p>
  1186. <p id='n1130' class='pln'><a href='#n1130'>1130</a></p>
  1187. <p id='n1131' class='stm run hide_run'><a href='#n1131'>1131</a></p>
  1188. <p id='n1132' class='stm mis'><a href='#n1132'>1132</a></p>
  1189. <p id='n1133' class='stm mis'><a href='#n1133'>1133</a></p>
  1190. <p id='n1134' class='pln'><a href='#n1134'>1134</a></p>
  1191. <p id='n1135' class='pln'><a href='#n1135'>1135</a></p>
  1192. <p id='n1136' class='pln'><a href='#n1136'>1136</a></p>
  1193. <p id='n1137' class='pln'><a href='#n1137'>1137</a></p>
  1194. <p id='n1138' class='pln'><a href='#n1138'>1138</a></p>
  1195. <p id='n1139' class='pln'><a href='#n1139'>1139</a></p>
  1196. <p id='n1140' class='pln'><a href='#n1140'>1140</a></p>
  1197. <p id='n1141' class='stm mis'><a href='#n1141'>1141</a></p>
  1198. <p id='n1142' class='stm mis'><a href='#n1142'>1142</a></p>
  1199. <p id='n1143' class='stm mis'><a href='#n1143'>1143</a></p>
  1200. <p id='n1144' class='pln'><a href='#n1144'>1144</a></p>
  1201. <p id='n1145' class='pln'><a href='#n1145'>1145</a></p>
  1202. <p id='n1146' class='pln'><a href='#n1146'>1146</a></p>
  1203. <p id='n1147' class='pln'><a href='#n1147'>1147</a></p>
  1204. <p id='n1148' class='pln'><a href='#n1148'>1148</a></p>
  1205. <p id='n1149' class='pln'><a href='#n1149'>1149</a></p>
  1206. <p id='n1150' class='pln'><a href='#n1150'>1150</a></p>
  1207. <p id='n1151' class='pln'><a href='#n1151'>1151</a></p>
  1208. <p id='n1152' class='pln'><a href='#n1152'>1152</a></p>
  1209. <p id='n1153' class='pln'><a href='#n1153'>1153</a></p>
  1210. <p id='n1154' class='pln'><a href='#n1154'>1154</a></p>
  1211. <p id='n1155' class='stm mis'><a href='#n1155'>1155</a></p>
  1212. <p id='n1156' class='pln'><a href='#n1156'>1156</a></p>
  1213. <p id='n1157' class='stm run hide_run'><a href='#n1157'>1157</a></p>
  1214. <p id='n1158' class='stm mis'><a href='#n1158'>1158</a></p>
  1215. <p id='n1159' class='stm mis'><a href='#n1159'>1159</a></p>
  1216. <p id='n1160' class='pln'><a href='#n1160'>1160</a></p>
  1217. <p id='n1161' class='pln'><a href='#n1161'>1161</a></p>
  1218. <p id='n1162' class='pln'><a href='#n1162'>1162</a></p>
  1219. <p id='n1163' class='pln'><a href='#n1163'>1163</a></p>
  1220. <p id='n1164' class='pln'><a href='#n1164'>1164</a></p>
  1221. <p id='n1165' class='pln'><a href='#n1165'>1165</a></p>
  1222. <p id='n1166' class='pln'><a href='#n1166'>1166</a></p>
  1223. <p id='n1167' class='stm mis'><a href='#n1167'>1167</a></p>
  1224. <p id='n1168' class='stm mis'><a href='#n1168'>1168</a></p>
  1225. <p id='n1169' class='pln'><a href='#n1169'>1169</a></p>
  1226. <p id='n1170' class='pln'><a href='#n1170'>1170</a></p>
  1227. <p id='n1171' class='pln'><a href='#n1171'>1171</a></p>
  1228. <p id='n1172' class='pln'><a href='#n1172'>1172</a></p>
  1229. <p id='n1173' class='pln'><a href='#n1173'>1173</a></p>
  1230. <p id='n1174' class='pln'><a href='#n1174'>1174</a></p>
  1231. <p id='n1175' class='pln'><a href='#n1175'>1175</a></p>
  1232. <p id='n1176' class='stm mis'><a href='#n1176'>1176</a></p>
  1233. <p id='n1177' class='pln'><a href='#n1177'>1177</a></p>
  1234. <p id='n1178' class='stm mis'><a href='#n1178'>1178</a></p>
  1235. <p id='n1179' class='pln'><a href='#n1179'>1179</a></p>
  1236. <p id='n1180' class='pln'><a href='#n1180'>1180</a></p>
  1237. <p id='n1181' class='pln'><a href='#n1181'>1181</a></p>
  1238. <p id='n1182' class='pln'><a href='#n1182'>1182</a></p>
  1239. <p id='n1183' class='pln'><a href='#n1183'>1183</a></p>
  1240. <p id='n1184' class='pln'><a href='#n1184'>1184</a></p>
  1241. <p id='n1185' class='pln'><a href='#n1185'>1185</a></p>
  1242. <p id='n1186' class='pln'><a href='#n1186'>1186</a></p>
  1243. <p id='n1187' class='pln'><a href='#n1187'>1187</a></p>
  1244. <p id='n1188' class='pln'><a href='#n1188'>1188</a></p>
  1245. <p id='n1189' class='pln'><a href='#n1189'>1189</a></p>
  1246. <p id='n1190' class='pln'><a href='#n1190'>1190</a></p>
  1247. <p id='n1191' class='pln'><a href='#n1191'>1191</a></p>
  1248. <p id='n1192' class='pln'><a href='#n1192'>1192</a></p>
  1249. <p id='n1193' class='stm mis'><a href='#n1193'>1193</a></p>
  1250. <p id='n1194' class='pln'><a href='#n1194'>1194</a></p>
  1251. <p id='n1195' class='pln'><a href='#n1195'>1195</a></p>
  1252. <p id='n1196' class='pln'><a href='#n1196'>1196</a></p>
  1253. <p id='n1197' class='pln'><a href='#n1197'>1197</a></p>
  1254. <p id='n1198' class='pln'><a href='#n1198'>1198</a></p>
  1255. <p id='n1199' class='pln'><a href='#n1199'>1199</a></p>
  1256. <p id='n1200' class='pln'><a href='#n1200'>1200</a></p>
  1257. <p id='n1201' class='pln'><a href='#n1201'>1201</a></p>
  1258. <p id='n1202' class='pln'><a href='#n1202'>1202</a></p>
  1259. <p id='n1203' class='pln'><a href='#n1203'>1203</a></p>
  1260. <p id='n1204' class='stm run hide_run'><a href='#n1204'>1204</a></p>
  1261. <p id='n1205' class='stm mis'><a href='#n1205'>1205</a></p>
  1262. <p id='n1206' class='stm mis'><a href='#n1206'>1206</a></p>
  1263. <p id='n1207' class='pln'><a href='#n1207'>1207</a></p>
  1264. <p id='n1208' class='stm mis'><a href='#n1208'>1208</a></p>
  1265. <p id='n1209' class='stm mis'><a href='#n1209'>1209</a></p>
  1266. <p id='n1210' class='stm mis'><a href='#n1210'>1210</a></p>
  1267. <p id='n1211' class='pln'><a href='#n1211'>1211</a></p>
  1268. <p id='n1212' class='stm mis'><a href='#n1212'>1212</a></p>
  1269. <p id='n1213' class='pln'><a href='#n1213'>1213</a></p>
  1270. <p id='n1214' class='stm mis'><a href='#n1214'>1214</a></p>
  1271. <p id='n1215' class='pln'><a href='#n1215'>1215</a></p>
  1272. <p id='n1216' class='pln'><a href='#n1216'>1216</a></p>
  1273. <p id='n1217' class='stm run hide_run'><a href='#n1217'>1217</a></p>
  1274. <p id='n1218' class='pln'><a href='#n1218'>1218</a></p>
  1275. <p id='n1219' class='pln'><a href='#n1219'>1219</a></p>
  1276. <p id='n1220' class='stm run hide_run'><a href='#n1220'>1220</a></p>
  1277. <p id='n1221' class='stm run hide_run'><a href='#n1221'>1221</a></p>
  1278. <p id='n1222' class='pln'><a href='#n1222'>1222</a></p>
  1279. <p id='n1223' class='stm run hide_run'><a href='#n1223'>1223</a></p>
  1280. <p id='n1224' class='stm mis'><a href='#n1224'>1224</a></p>
  1281. <p id='n1225' class='pln'><a href='#n1225'>1225</a></p>
  1282. <p id='n1226' class='stm run hide_run'><a href='#n1226'>1226</a></p>
  1283. <p id='n1227' class='pln'><a href='#n1227'>1227</a></p>
  1284. <p id='n1228' class='stm mis'><a href='#n1228'>1228</a></p>
  1285. <p id='n1229' class='stm mis'><a href='#n1229'>1229</a></p>
  1286. <p id='n1230' class='pln'><a href='#n1230'>1230</a></p>
  1287. <p id='n1231' class='stm run hide_run'><a href='#n1231'>1231</a></p>
  1288. <p id='n1232' class='pln'><a href='#n1232'>1232</a></p>
  1289. <p id='n1233' class='stm mis'><a href='#n1233'>1233</a></p>
  1290. <p id='n1234' class='pln'><a href='#n1234'>1234</a></p>
  1291. <p id='n1235' class='stm run hide_run'><a href='#n1235'>1235</a></p>
  1292. <p id='n1236' class='pln'><a href='#n1236'>1236</a></p>
  1293. <p id='n1237' class='stm mis'><a href='#n1237'>1237</a></p>
  1294. <p id='n1238' class='pln'><a href='#n1238'>1238</a></p>
  1295. <p id='n1239' class='stm run hide_run'><a href='#n1239'>1239</a></p>
  1296. <p id='n1240' class='pln'><a href='#n1240'>1240</a></p>
  1297. <p id='n1241' class='stm mis'><a href='#n1241'>1241</a></p>
  1298. <p id='n1242' class='stm mis'><a href='#n1242'>1242</a></p>
  1299. <p id='n1243' class='stm mis'><a href='#n1243'>1243</a></p>
  1300. <p id='n1244' class='pln'><a href='#n1244'>1244</a></p>
  1301. <p id='n1245' class='stm mis'><a href='#n1245'>1245</a></p>
  1302. <p id='n1246' class='pln'><a href='#n1246'>1246</a></p>
  1303. <p id='n1247' class='pln'><a href='#n1247'>1247</a></p>
  1304. <p id='n1248' class='pln'><a href='#n1248'>1248</a></p>
  1305. <p id='n1249' class='pln'><a href='#n1249'>1249</a></p>
  1306. <p id='n1250' class='stm mis'><a href='#n1250'>1250</a></p>
  1307. <p id='n1251' class='stm mis'><a href='#n1251'>1251</a></p>
  1308. <p id='n1252' class='stm mis'><a href='#n1252'>1252</a></p>
  1309. <p id='n1253' class='stm mis'><a href='#n1253'>1253</a></p>
  1310. <p id='n1254' class='pln'><a href='#n1254'>1254</a></p>
  1311. <p id='n1255' class='stm mis'><a href='#n1255'>1255</a></p>
  1312. <p id='n1256' class='pln'><a href='#n1256'>1256</a></p>
  1313. <p id='n1257' class='pln'><a href='#n1257'>1257</a></p>
  1314. <p id='n1258' class='pln'><a href='#n1258'>1258</a></p>
  1315. <p id='n1259' class='pln'><a href='#n1259'>1259</a></p>
  1316. <p id='n1260' class='stm mis'><a href='#n1260'>1260</a></p>
  1317. <p id='n1261' class='pln'><a href='#n1261'>1261</a></p>
  1318. <p id='n1262' class='stm mis'><a href='#n1262'>1262</a></p>
  1319. <p id='n1263' class='pln'><a href='#n1263'>1263</a></p>
  1320. <p id='n1264' class='pln'><a href='#n1264'>1264</a></p>
  1321. <p id='n1265' class='pln'><a href='#n1265'>1265</a></p>
  1322. <p id='n1266' class='stm mis'><a href='#n1266'>1266</a></p>
  1323. <p id='n1267' class='stm mis'><a href='#n1267'>1267</a></p>
  1324. <p id='n1268' class='stm mis'><a href='#n1268'>1268</a></p>
  1325. <p id='n1269' class='pln'><a href='#n1269'>1269</a></p>
  1326. <p id='n1270' class='stm mis'><a href='#n1270'>1270</a></p>
  1327. <p id='n1271' class='pln'><a href='#n1271'>1271</a></p>
  1328. <p id='n1272' class='stm mis'><a href='#n1272'>1272</a></p>
  1329. <p id='n1273' class='pln'><a href='#n1273'>1273</a></p>
  1330. <p id='n1274' class='pln'><a href='#n1274'>1274</a></p>
  1331. <p id='n1275' class='pln'><a href='#n1275'>1275</a></p>
  1332. <p id='n1276' class='pln'><a href='#n1276'>1276</a></p>
  1333. <p id='n1277' class='pln'><a href='#n1277'>1277</a></p>
  1334. <p id='n1278' class='stm mis'><a href='#n1278'>1278</a></p>
  1335. <p id='n1279' class='stm mis'><a href='#n1279'>1279</a></p>
  1336. <p id='n1280' class='pln'><a href='#n1280'>1280</a></p>
  1337. <p id='n1281' class='pln'><a href='#n1281'>1281</a></p>
  1338. <p id='n1282' class='stm mis'><a href='#n1282'>1282</a></p>
  1339. <p id='n1283' class='pln'><a href='#n1283'>1283</a></p>
  1340. <p id='n1284' class='stm mis'><a href='#n1284'>1284</a></p>
  1341. <p id='n1285' class='stm mis'><a href='#n1285'>1285</a></p>
  1342. <p id='n1286' class='pln'><a href='#n1286'>1286</a></p>
  1343. <p id='n1287' class='stm mis'><a href='#n1287'>1287</a></p>
  1344. <p id='n1288' class='stm mis'><a href='#n1288'>1288</a></p>
  1345. <p id='n1289' class='pln'><a href='#n1289'>1289</a></p>
  1346. <p id='n1290' class='stm mis'><a href='#n1290'>1290</a></p>
  1347. <p id='n1291' class='stm mis'><a href='#n1291'>1291</a></p>
  1348. <p id='n1292' class='stm mis'><a href='#n1292'>1292</a></p>
  1349. <p id='n1293' class='pln'><a href='#n1293'>1293</a></p>
  1350. <p id='n1294' class='stm run hide_run'><a href='#n1294'>1294</a></p>
  1351. <p id='n1295' class='stm mis'><a href='#n1295'>1295</a></p>
  1352. <p id='n1296' class='pln'><a href='#n1296'>1296</a></p>
  1353. <p id='n1297' class='stm mis'><a href='#n1297'>1297</a></p>
  1354. <p id='n1298' class='stm mis'><a href='#n1298'>1298</a></p>
  1355. <p id='n1299' class='stm mis'><a href='#n1299'>1299</a></p>
  1356. <p id='n1300' class='stm mis'><a href='#n1300'>1300</a></p>
  1357. <p id='n1301' class='stm mis'><a href='#n1301'>1301</a></p>
  1358. <p id='n1302' class='stm mis'><a href='#n1302'>1302</a></p>
  1359. <p id='n1303' class='stm mis'><a href='#n1303'>1303</a></p>
  1360. <p id='n1304' class='stm mis'><a href='#n1304'>1304</a></p>
  1361. <p id='n1305' class='stm mis'><a href='#n1305'>1305</a></p>
  1362. <p id='n1306' class='pln'><a href='#n1306'>1306</a></p>
  1363. <p id='n1307' class='pln'><a href='#n1307'>1307</a></p>
  1364. <p id='n1308' class='stm mis'><a href='#n1308'>1308</a></p>
  1365. <p id='n1309' class='stm mis'><a href='#n1309'>1309</a></p>
  1366. <p id='n1310' class='pln'><a href='#n1310'>1310</a></p>
  1367. <p id='n1311' class='stm mis'><a href='#n1311'>1311</a></p>
  1368. <p id='n1312' class='pln'><a href='#n1312'>1312</a></p>
  1369. <p id='n1313' class='stm mis'><a href='#n1313'>1313</a></p>
  1370. <p id='n1314' class='stm mis'><a href='#n1314'>1314</a></p>
  1371. <p id='n1315' class='pln'><a href='#n1315'>1315</a></p>
  1372. <p id='n1316' class='stm mis'><a href='#n1316'>1316</a></p>
  1373. <p id='n1317' class='stm mis'><a href='#n1317'>1317</a></p>
  1374. <p id='n1318' class='stm mis'><a href='#n1318'>1318</a></p>
  1375. <p id='n1319' class='stm mis'><a href='#n1319'>1319</a></p>
  1376. <p id='n1320' class='pln'><a href='#n1320'>1320</a></p>
  1377. <p id='n1321' class='pln'><a href='#n1321'>1321</a></p>
  1378. <p id='n1322' class='pln'><a href='#n1322'>1322</a></p>
  1379. <p id='n1323' class='stm mis'><a href='#n1323'>1323</a></p>
  1380. <p id='n1324' class='stm mis'><a href='#n1324'>1324</a></p>
  1381. <p id='n1325' class='stm mis'><a href='#n1325'>1325</a></p>
  1382. <p id='n1326' class='pln'><a href='#n1326'>1326</a></p>
  1383. <p id='n1327' class='stm mis'><a href='#n1327'>1327</a></p>
  1384. <p id='n1328' class='stm mis'><a href='#n1328'>1328</a></p>
  1385. <p id='n1329' class='pln'><a href='#n1329'>1329</a></p>
  1386. <p id='n1330' class='pln'><a href='#n1330'>1330</a></p>
  1387. <p id='n1331' class='stm mis'><a href='#n1331'>1331</a></p>
  1388. <p id='n1332' class='stm mis'><a href='#n1332'>1332</a></p>
  1389. <p id='n1333' class='pln'><a href='#n1333'>1333</a></p>
  1390. <p id='n1334' class='pln'><a href='#n1334'>1334</a></p>
  1391. <p id='n1335' class='pln'><a href='#n1335'>1335</a></p>
  1392. <p id='n1336' class='pln'><a href='#n1336'>1336</a></p>
  1393. <p id='n1337' class='pln'><a href='#n1337'>1337</a></p>
  1394. <p id='n1338' class='pln'><a href='#n1338'>1338</a></p>
  1395. <p id='n1339' class='pln'><a href='#n1339'>1339</a></p>
  1396. <p id='n1340' class='stm mis'><a href='#n1340'>1340</a></p>
  1397. <p id='n1341' class='stm mis'><a href='#n1341'>1341</a></p>
  1398. <p id='n1342' class='stm mis'><a href='#n1342'>1342</a></p>
  1399. <p id='n1343' class='stm mis'><a href='#n1343'>1343</a></p>
  1400. <p id='n1344' class='stm mis'><a href='#n1344'>1344</a></p>
  1401. <p id='n1345' class='pln'><a href='#n1345'>1345</a></p>
  1402. <p id='n1346' class='pln'><a href='#n1346'>1346</a></p>
  1403. <p id='n1347' class='stm mis'><a href='#n1347'>1347</a></p>
  1404. <p id='n1348' class='stm mis'><a href='#n1348'>1348</a></p>
  1405. <p id='n1349' class='stm mis'><a href='#n1349'>1349</a></p>
  1406. <p id='n1350' class='stm mis'><a href='#n1350'>1350</a></p>
  1407. <p id='n1351' class='stm mis'><a href='#n1351'>1351</a></p>
  1408. <p id='n1352' class='pln'><a href='#n1352'>1352</a></p>
  1409. <p id='n1353' class='stm mis'><a href='#n1353'>1353</a></p>
  1410. <p id='n1354' class='pln'><a href='#n1354'>1354</a></p>
  1411. <p id='n1355' class='pln'><a href='#n1355'>1355</a></p>
  1412. <p id='n1356' class='pln'><a href='#n1356'>1356</a></p>
  1413. <p id='n1357' class='pln'><a href='#n1357'>1357</a></p>
  1414. <p id='n1358' class='pln'><a href='#n1358'>1358</a></p>
  1415. <p id='n1359' class='pln'><a href='#n1359'>1359</a></p>
  1416. <p id='n1360' class='pln'><a href='#n1360'>1360</a></p>
  1417. <p id='n1361' class='pln'><a href='#n1361'>1361</a></p>
  1418. <p id='n1362' class='pln'><a href='#n1362'>1362</a></p>
  1419. <p id='n1363' class='stm run hide_run'><a href='#n1363'>1363</a></p>
  1420. <p id='n1364' class='pln'><a href='#n1364'>1364</a></p>
  1421. <p id='n1365' class='stm run hide_run'><a href='#n1365'>1365</a></p>
  1422. <p id='n1366' class='stm run hide_run'><a href='#n1366'>1366</a></p>
  1423. <p id='n1367' class='stm run hide_run'><a href='#n1367'>1367</a></p>
  1424. <p id='n1368' class='stm run hide_run'><a href='#n1368'>1368</a></p>
  1425. <p id='n1369' class='pln'><a href='#n1369'>1369</a></p>
  1426. <p id='n1370' class='stm run hide_run'><a href='#n1370'>1370</a></p>
  1427. <p id='n1371' class='stm mis'><a href='#n1371'>1371</a></p>
  1428. <p id='n1372' class='pln'><a href='#n1372'>1372</a></p>
  1429. <p id='n1373' class='stm run hide_run'><a href='#n1373'>1373</a></p>
  1430. <p id='n1374' class='pln'><a href='#n1374'>1374</a></p>
  1431. <p id='n1375' class='stm mis'><a href='#n1375'>1375</a></p>
  1432. <p id='n1376' class='stm mis'><a href='#n1376'>1376</a></p>
  1433. <p id='n1377' class='pln'><a href='#n1377'>1377</a></p>
  1434. <p id='n1378' class='stm run hide_run'><a href='#n1378'>1378</a></p>
  1435. <p id='n1379' class='stm mis'><a href='#n1379'>1379</a></p>
  1436. <p id='n1380' class='stm mis'><a href='#n1380'>1380</a></p>
  1437. <p id='n1381' class='stm mis'><a href='#n1381'>1381</a></p>
  1438. <p id='n1382' class='stm mis'><a href='#n1382'>1382</a></p>
  1439. <p id='n1383' class='pln'><a href='#n1383'>1383</a></p>
  1440. <p id='n1384' class='stm mis'><a href='#n1384'>1384</a></p>
  1441. <p id='n1385' class='stm mis'><a href='#n1385'>1385</a></p>
  1442. <p id='n1386' class='stm mis'><a href='#n1386'>1386</a></p>
  1443. <p id='n1387' class='stm mis'><a href='#n1387'>1387</a></p>
  1444. <p id='n1388' class='stm mis'><a href='#n1388'>1388</a></p>
  1445. <p id='n1389' class='stm mis'><a href='#n1389'>1389</a></p>
  1446. <p id='n1390' class='stm mis'><a href='#n1390'>1390</a></p>
  1447. <p id='n1391' class='stm mis'><a href='#n1391'>1391</a></p>
  1448. <p id='n1392' class='stm mis'><a href='#n1392'>1392</a></p>
  1449. <p id='n1393' class='pln'><a href='#n1393'>1393</a></p>
  1450. <p id='n1394' class='stm mis'><a href='#n1394'>1394</a></p>
  1451. <p id='n1395' class='stm mis'><a href='#n1395'>1395</a></p>
  1452. <p id='n1396' class='stm mis'><a href='#n1396'>1396</a></p>
  1453. <p id='n1397' class='stm mis'><a href='#n1397'>1397</a></p>
  1454. <p id='n1398' class='stm mis'><a href='#n1398'>1398</a></p>
  1455. <p id='n1399' class='stm mis'><a href='#n1399'>1399</a></p>
  1456. <p id='n1400' class='stm mis'><a href='#n1400'>1400</a></p>
  1457. <p id='n1401' class='stm mis'><a href='#n1401'>1401</a></p>
  1458. <p id='n1402' class='stm mis'><a href='#n1402'>1402</a></p>
  1459. <p id='n1403' class='stm mis'><a href='#n1403'>1403</a></p>
  1460. <p id='n1404' class='stm mis'><a href='#n1404'>1404</a></p>
  1461. <p id='n1405' class='stm mis'><a href='#n1405'>1405</a></p>
  1462. <p id='n1406' class='stm mis'><a href='#n1406'>1406</a></p>
  1463. <p id='n1407' class='pln'><a href='#n1407'>1407</a></p>
  1464. <p id='n1408' class='stm run hide_run'><a href='#n1408'>1408</a></p>
  1465. <p id='n1409' class='pln'><a href='#n1409'>1409</a></p>
  1466. <p id='n1410' class='pln'><a href='#n1410'>1410</a></p>
  1467. <p id='n1411' class='stm mis'><a href='#n1411'>1411</a></p>
  1468. <p id='n1412' class='stm mis'><a href='#n1412'>1412</a></p>
  1469. <p id='n1413' class='stm mis'><a href='#n1413'>1413</a></p>
  1470. <p id='n1414' class='pln'><a href='#n1414'>1414</a></p>
  1471. <p id='n1415' class='stm mis'><a href='#n1415'>1415</a></p>
  1472. <p id='n1416' class='stm mis'><a href='#n1416'>1416</a></p>
  1473. <p id='n1417' class='stm mis'><a href='#n1417'>1417</a></p>
  1474. <p id='n1418' class='stm mis'><a href='#n1418'>1418</a></p>
  1475. <p id='n1419' class='stm mis'><a href='#n1419'>1419</a></p>
  1476. <p id='n1420' class='stm mis'><a href='#n1420'>1420</a></p>
  1477. <p id='n1421' class='stm mis'><a href='#n1421'>1421</a></p>
  1478. <p id='n1422' class='stm mis'><a href='#n1422'>1422</a></p>
  1479. <p id='n1423' class='stm mis'><a href='#n1423'>1423</a></p>
  1480. <p id='n1424' class='stm mis'><a href='#n1424'>1424</a></p>
  1481. <p id='n1425' class='pln'><a href='#n1425'>1425</a></p>
  1482. <p id='n1426' class='stm mis'><a href='#n1426'>1426</a></p>
  1483. <p id='n1427' class='stm mis'><a href='#n1427'>1427</a></p>
  1484. <p id='n1428' class='pln'><a href='#n1428'>1428</a></p>
  1485. <p id='n1429' class='stm mis'><a href='#n1429'>1429</a></p>
  1486. <p id='n1430' class='stm mis'><a href='#n1430'>1430</a></p>
  1487. <p id='n1431' class='pln'><a href='#n1431'>1431</a></p>
  1488. <p id='n1432' class='stm mis'><a href='#n1432'>1432</a></p>
  1489. <p id='n1433' class='stm mis'><a href='#n1433'>1433</a></p>
  1490. <p id='n1434' class='stm mis'><a href='#n1434'>1434</a></p>
  1491. <p id='n1435' class='stm mis'><a href='#n1435'>1435</a></p>
  1492. <p id='n1436' class='stm mis'><a href='#n1436'>1436</a></p>
  1493. <p id='n1437' class='pln'><a href='#n1437'>1437</a></p>
  1494. <p id='n1438' class='pln'><a href='#n1438'>1438</a></p>
  1495. <p id='n1439' class='stm run hide_run'><a href='#n1439'>1439</a></p>
  1496. <p id='n1440' class='pln'><a href='#n1440'>1440</a></p>
  1497. <p id='n1441' class='stm run hide_run'><a href='#n1441'>1441</a></p>
  1498. <p id='n1442' class='stm run hide_run'><a href='#n1442'>1442</a></p>
  1499. <p id='n1443' class='stm run hide_run'><a href='#n1443'>1443</a></p>
  1500. <p id='n1444' class='stm run hide_run'><a href='#n1444'>1444</a></p>
  1501. <p id='n1445' class='stm run hide_run'><a href='#n1445'>1445</a></p>
  1502. <p id='n1446' class='stm run hide_run'><a href='#n1446'>1446</a></p>
  1503. <p id='n1447' class='pln'><a href='#n1447'>1447</a></p>
  1504. <p id='n1448' class='stm run hide_run'><a href='#n1448'>1448</a></p>
  1505. <p id='n1449' class='stm mis'><a href='#n1449'>1449</a></p>
  1506. <p id='n1450' class='pln'><a href='#n1450'>1450</a></p>
  1507. <p id='n1451' class='stm run hide_run'><a href='#n1451'>1451</a></p>
  1508. <p id='n1452' class='pln'><a href='#n1452'>1452</a></p>
  1509. <p id='n1453' class='stm mis'><a href='#n1453'>1453</a></p>
  1510. <p id='n1454' class='stm mis'><a href='#n1454'>1454</a></p>
  1511. <p id='n1455' class='pln'><a href='#n1455'>1455</a></p>
  1512. <p id='n1456' class='stm run hide_run'><a href='#n1456'>1456</a></p>
  1513. <p id='n1457' class='stm mis'><a href='#n1457'>1457</a></p>
  1514. <p id='n1458' class='stm mis'><a href='#n1458'>1458</a></p>
  1515. <p id='n1459' class='stm mis'><a href='#n1459'>1459</a></p>
  1516. <p id='n1460' class='stm mis'><a href='#n1460'>1460</a></p>
  1517. <p id='n1461' class='pln'><a href='#n1461'>1461</a></p>
  1518. <p id='n1462' class='stm mis'><a href='#n1462'>1462</a></p>
  1519. <p id='n1463' class='stm mis'><a href='#n1463'>1463</a></p>
  1520. <p id='n1464' class='stm mis'><a href='#n1464'>1464</a></p>
  1521. <p id='n1465' class='stm mis'><a href='#n1465'>1465</a></p>
  1522. <p id='n1466' class='stm mis'><a href='#n1466'>1466</a></p>
  1523. <p id='n1467' class='stm mis'><a href='#n1467'>1467</a></p>
  1524. <p id='n1468' class='stm mis'><a href='#n1468'>1468</a></p>
  1525. <p id='n1469' class='stm mis'><a href='#n1469'>1469</a></p>
  1526. <p id='n1470' class='stm mis'><a href='#n1470'>1470</a></p>
  1527. <p id='n1471' class='pln'><a href='#n1471'>1471</a></p>
  1528. <p id='n1472' class='stm mis'><a href='#n1472'>1472</a></p>
  1529. <p id='n1473' class='stm mis'><a href='#n1473'>1473</a></p>
  1530. <p id='n1474' class='stm mis'><a href='#n1474'>1474</a></p>
  1531. <p id='n1475' class='stm mis'><a href='#n1475'>1475</a></p>
  1532. <p id='n1476' class='stm mis'><a href='#n1476'>1476</a></p>
  1533. <p id='n1477' class='stm mis'><a href='#n1477'>1477</a></p>
  1534. <p id='n1478' class='stm mis'><a href='#n1478'>1478</a></p>
  1535. <p id='n1479' class='stm mis'><a href='#n1479'>1479</a></p>
  1536. <p id='n1480' class='stm mis'><a href='#n1480'>1480</a></p>
  1537. <p id='n1481' class='stm mis'><a href='#n1481'>1481</a></p>
  1538. <p id='n1482' class='stm mis'><a href='#n1482'>1482</a></p>
  1539. <p id='n1483' class='stm mis'><a href='#n1483'>1483</a></p>
  1540. <p id='n1484' class='stm mis'><a href='#n1484'>1484</a></p>
  1541. <p id='n1485' class='pln'><a href='#n1485'>1485</a></p>
  1542. <p id='n1486' class='stm run hide_run'><a href='#n1486'>1486</a></p>
  1543. <p id='n1487' class='pln'><a href='#n1487'>1487</a></p>
  1544. <p id='n1488' class='pln'><a href='#n1488'>1488</a></p>
  1545. <p id='n1489' class='stm mis'><a href='#n1489'>1489</a></p>
  1546. <p id='n1490' class='stm mis'><a href='#n1490'>1490</a></p>
  1547. <p id='n1491' class='pln'><a href='#n1491'>1491</a></p>
  1548. <p id='n1492' class='stm mis'><a href='#n1492'>1492</a></p>
  1549. <p id='n1493' class='stm mis'><a href='#n1493'>1493</a></p>
  1550. <p id='n1494' class='stm mis'><a href='#n1494'>1494</a></p>
  1551. <p id='n1495' class='stm mis'><a href='#n1495'>1495</a></p>
  1552. <p id='n1496' class='stm mis'><a href='#n1496'>1496</a></p>
  1553. <p id='n1497' class='stm mis'><a href='#n1497'>1497</a></p>
  1554. <p id='n1498' class='stm mis'><a href='#n1498'>1498</a></p>
  1555. <p id='n1499' class='stm mis'><a href='#n1499'>1499</a></p>
  1556. <p id='n1500' class='stm mis'><a href='#n1500'>1500</a></p>
  1557. <p id='n1501' class='pln'><a href='#n1501'>1501</a></p>
  1558. <p id='n1502' class='pln'><a href='#n1502'>1502</a></p>
  1559. <p id='n1503' class='stm mis'><a href='#n1503'>1503</a></p>
  1560. <p id='n1504' class='stm mis'><a href='#n1504'>1504</a></p>
  1561. <p id='n1505' class='stm mis'><a href='#n1505'>1505</a></p>
  1562. <p id='n1506' class='stm mis'><a href='#n1506'>1506</a></p>
  1563. <p id='n1507' class='stm mis'><a href='#n1507'>1507</a></p>
  1564. <p id='n1508' class='pln'><a href='#n1508'>1508</a></p>
  1565. <p id='n1509' class='stm mis'><a href='#n1509'>1509</a></p>
  1566. <p id='n1510' class='stm mis'><a href='#n1510'>1510</a></p>
  1567. <p id='n1511' class='stm mis'><a href='#n1511'>1511</a></p>
  1568. <p id='n1512' class='pln'><a href='#n1512'>1512</a></p>
  1569. <p id='n1513' class='stm mis'><a href='#n1513'>1513</a></p>
  1570. <p id='n1514' class='stm mis'><a href='#n1514'>1514</a></p>
  1571. <p id='n1515' class='stm mis'><a href='#n1515'>1515</a></p>
  1572. <p id='n1516' class='stm mis'><a href='#n1516'>1516</a></p>
  1573. <p id='n1517' class='pln'><a href='#n1517'>1517</a></p>
  1574. <p id='n1518' class='stm mis'><a href='#n1518'>1518</a></p>
  1575. <p id='n1519' class='pln'><a href='#n1519'>1519</a></p>
  1576. <p id='n1520' class='pln'><a href='#n1520'>1520</a></p>
  1577. <p id='n1521' class='stm run hide_run'><a href='#n1521'>1521</a></p>
  1578. <p id='n1522' class='pln'><a href='#n1522'>1522</a></p>
  1579. <p id='n1523' class='pln'><a href='#n1523'>1523</a></p>
  1580. <p id='n1524' class='stm run hide_run'><a href='#n1524'>1524</a></p>
  1581. <p id='n1525' class='stm run hide_run'><a href='#n1525'>1525</a></p>
  1582. <p id='n1526' class='stm run hide_run'><a href='#n1526'>1526</a></p>
  1583. <p id='n1527' class='stm run hide_run'><a href='#n1527'>1527</a></p>
  1584. <p id='n1528' class='stm run hide_run'><a href='#n1528'>1528</a></p>
  1585. <p id='n1529' class='stm run hide_run'><a href='#n1529'>1529</a></p>
  1586. <p id='n1530' class='stm run hide_run'><a href='#n1530'>1530</a></p>
  1587. <p id='n1531' class='pln'><a href='#n1531'>1531</a></p>
  1588. <p id='n1532' class='stm run hide_run'><a href='#n1532'>1532</a></p>
  1589. <p id='n1533' class='stm mis'><a href='#n1533'>1533</a></p>
  1590. <p id='n1534' class='pln'><a href='#n1534'>1534</a></p>
  1591. <p id='n1535' class='stm run hide_run'><a href='#n1535'>1535</a></p>
  1592. <p id='n1536' class='pln'><a href='#n1536'>1536</a></p>
  1593. <p id='n1537' class='stm mis'><a href='#n1537'>1537</a></p>
  1594. <p id='n1538' class='stm mis'><a href='#n1538'>1538</a></p>
  1595. <p id='n1539' class='pln'><a href='#n1539'>1539</a></p>
  1596. <p id='n1540' class='stm run hide_run'><a href='#n1540'>1540</a></p>
  1597. <p id='n1541' class='stm mis'><a href='#n1541'>1541</a></p>
  1598. <p id='n1542' class='stm mis'><a href='#n1542'>1542</a></p>
  1599. <p id='n1543' class='stm mis'><a href='#n1543'>1543</a></p>
  1600. <p id='n1544' class='stm mis'><a href='#n1544'>1544</a></p>
  1601. <p id='n1545' class='pln'><a href='#n1545'>1545</a></p>
  1602. <p id='n1546' class='stm mis'><a href='#n1546'>1546</a></p>
  1603. <p id='n1547' class='stm mis'><a href='#n1547'>1547</a></p>
  1604. <p id='n1548' class='stm mis'><a href='#n1548'>1548</a></p>
  1605. <p id='n1549' class='stm mis'><a href='#n1549'>1549</a></p>
  1606. <p id='n1550' class='stm mis'><a href='#n1550'>1550</a></p>
  1607. <p id='n1551' class='stm mis'><a href='#n1551'>1551</a></p>
  1608. <p id='n1552' class='stm mis'><a href='#n1552'>1552</a></p>
  1609. <p id='n1553' class='stm mis'><a href='#n1553'>1553</a></p>
  1610. <p id='n1554' class='stm mis'><a href='#n1554'>1554</a></p>
  1611. <p id='n1555' class='pln'><a href='#n1555'>1555</a></p>
  1612. <p id='n1556' class='stm mis'><a href='#n1556'>1556</a></p>
  1613. <p id='n1557' class='stm mis'><a href='#n1557'>1557</a></p>
  1614. <p id='n1558' class='stm mis'><a href='#n1558'>1558</a></p>
  1615. <p id='n1559' class='stm mis'><a href='#n1559'>1559</a></p>
  1616. <p id='n1560' class='stm mis'><a href='#n1560'>1560</a></p>
  1617. <p id='n1561' class='stm mis'><a href='#n1561'>1561</a></p>
  1618. <p id='n1562' class='stm mis'><a href='#n1562'>1562</a></p>
  1619. <p id='n1563' class='stm mis'><a href='#n1563'>1563</a></p>
  1620. <p id='n1564' class='stm mis'><a href='#n1564'>1564</a></p>
  1621. <p id='n1565' class='stm mis'><a href='#n1565'>1565</a></p>
  1622. <p id='n1566' class='stm mis'><a href='#n1566'>1566</a></p>
  1623. <p id='n1567' class='stm mis'><a href='#n1567'>1567</a></p>
  1624. <p id='n1568' class='stm mis'><a href='#n1568'>1568</a></p>
  1625. <p id='n1569' class='pln'><a href='#n1569'>1569</a></p>
  1626. <p id='n1570' class='stm run hide_run'><a href='#n1570'>1570</a></p>
  1627. <p id='n1571' class='pln'><a href='#n1571'>1571</a></p>
  1628. <p id='n1572' class='pln'><a href='#n1572'>1572</a></p>
  1629. <p id='n1573' class='stm mis'><a href='#n1573'>1573</a></p>
  1630. <p id='n1574' class='stm mis'><a href='#n1574'>1574</a></p>
  1631. <p id='n1575' class='stm mis'><a href='#n1575'>1575</a></p>
  1632. <p id='n1576' class='pln'><a href='#n1576'>1576</a></p>
  1633. <p id='n1577' class='stm mis'><a href='#n1577'>1577</a></p>
  1634. <p id='n1578' class='stm mis'><a href='#n1578'>1578</a></p>
  1635. <p id='n1579' class='stm mis'><a href='#n1579'>1579</a></p>
  1636. <p id='n1580' class='stm mis'><a href='#n1580'>1580</a></p>
  1637. <p id='n1581' class='stm mis'><a href='#n1581'>1581</a></p>
  1638. <p id='n1582' class='stm mis'><a href='#n1582'>1582</a></p>
  1639. <p id='n1583' class='stm mis'><a href='#n1583'>1583</a></p>
  1640. <p id='n1584' class='stm mis'><a href='#n1584'>1584</a></p>
  1641. <p id='n1585' class='stm mis'><a href='#n1585'>1585</a></p>
  1642. <p id='n1586' class='pln'><a href='#n1586'>1586</a></p>
  1643. <p id='n1587' class='pln'><a href='#n1587'>1587</a></p>
  1644. <p id='n1588' class='stm mis'><a href='#n1588'>1588</a></p>
  1645. <p id='n1589' class='stm mis'><a href='#n1589'>1589</a></p>
  1646. <p id='n1590' class='stm mis'><a href='#n1590'>1590</a></p>
  1647. <p id='n1591' class='stm mis'><a href='#n1591'>1591</a></p>
  1648. <p id='n1592' class='stm mis'><a href='#n1592'>1592</a></p>
  1649. <p id='n1593' class='stm mis'><a href='#n1593'>1593</a></p>
  1650. <p id='n1594' class='pln'><a href='#n1594'>1594</a></p>
  1651. <p id='n1595' class='stm mis'><a href='#n1595'>1595</a></p>
  1652. <p id='n1596' class='stm mis'><a href='#n1596'>1596</a></p>
  1653. <p id='n1597' class='stm mis'><a href='#n1597'>1597</a></p>
  1654. <p id='n1598' class='pln'><a href='#n1598'>1598</a></p>
  1655. <p id='n1599' class='stm mis'><a href='#n1599'>1599</a></p>
  1656. <p id='n1600' class='stm mis'><a href='#n1600'>1600</a></p>
  1657. <p id='n1601' class='stm mis'><a href='#n1601'>1601</a></p>
  1658. <p id='n1602' class='stm mis'><a href='#n1602'>1602</a></p>
  1659. <p id='n1603' class='pln'><a href='#n1603'>1603</a></p>
  1660. <p id='n1604' class='stm mis'><a href='#n1604'>1604</a></p>
  1661. <p id='n1605' class='pln'><a href='#n1605'>1605</a></p>
  1662. <p id='n1606' class='pln'><a href='#n1606'>1606</a></p>
  1663. <p id='n1607' class='stm run hide_run'><a href='#n1607'>1607</a></p>
  1664. <p id='n1608' class='pln'><a href='#n1608'>1608</a></p>
  1665. <p id='n1609' class='pln'><a href='#n1609'>1609</a></p>
  1666. <p id='n1610' class='stm run hide_run'><a href='#n1610'>1610</a></p>
  1667. <p id='n1611' class='stm run hide_run'><a href='#n1611'>1611</a></p>
  1668. <p id='n1612' class='stm run hide_run'><a href='#n1612'>1612</a></p>
  1669. <p id='n1613' class='stm run hide_run'><a href='#n1613'>1613</a></p>
  1670. <p id='n1614' class='stm run hide_run'><a href='#n1614'>1614</a></p>
  1671. <p id='n1615' class='pln'><a href='#n1615'>1615</a></p>
  1672. <p id='n1616' class='stm run hide_run'><a href='#n1616'>1616</a></p>
  1673. <p id='n1617' class='stm run hide_run'><a href='#n1617'>1617</a></p>
  1674. <p id='n1618' class='pln'><a href='#n1618'>1618</a></p>
  1675. <p id='n1619' class='stm run hide_run'><a href='#n1619'>1619</a></p>
  1676. <p id='n1620' class='pln'><a href='#n1620'>1620</a></p>
  1677. <p id='n1621' class='stm run hide_run'><a href='#n1621'>1621</a></p>
  1678. <p id='n1622' class='pln'><a href='#n1622'>1622</a></p>
  1679. <p id='n1623' class='stm run hide_run'><a href='#n1623'>1623</a></p>
  1680. <p id='n1624' class='pln'><a href='#n1624'>1624</a></p>
  1681. <p id='n1625' class='stm run hide_run'><a href='#n1625'>1625</a></p>
  1682. <p id='n1626' class='stm run hide_run'><a href='#n1626'>1626</a></p>
  1683. <p id='n1627' class='stm mis'><a href='#n1627'>1627</a></p>
  1684. <p id='n1628' class='stm mis'><a href='#n1628'>1628</a></p>
  1685. <p id='n1629' class='pln'><a href='#n1629'>1629</a></p>
  1686. <p id='n1630' class='pln'><a href='#n1630'>1630</a></p>
  1687. <p id='n1631' class='stm run hide_run'><a href='#n1631'>1631</a></p>
  1688. <p id='n1632' class='stm mis'><a href='#n1632'>1632</a></p>
  1689. <p id='n1633' class='stm mis'><a href='#n1633'>1633</a></p>
  1690. <p id='n1634' class='pln'><a href='#n1634'>1634</a></p>
  1691. <p id='n1635' class='pln'><a href='#n1635'>1635</a></p>
  1692. <p id='n1636' class='pln'><a href='#n1636'>1636</a></p>
  1693. <p id='n1637' class='stm run hide_run'><a href='#n1637'>1637</a></p>
  1694. <p id='n1638' class='stm run hide_run'><a href='#n1638'>1638</a></p>
  1695. <p id='n1639' class='stm mis'><a href='#n1639'>1639</a></p>
  1696. <p id='n1640' class='pln'><a href='#n1640'>1640</a></p>
  1697. <p id='n1641' class='stm run hide_run'><a href='#n1641'>1641</a></p>
  1698. <p id='n1642' class='stm run hide_run'><a href='#n1642'>1642</a></p>
  1699. <p id='n1643' class='stm run hide_run'><a href='#n1643'>1643</a></p>
  1700. <p id='n1644' class='stm run hide_run'><a href='#n1644'>1644</a></p>
  1701. <p id='n1645' class='stm run hide_run'><a href='#n1645'>1645</a></p>
  1702. <p id='n1646' class='pln'><a href='#n1646'>1646</a></p>
  1703. <p id='n1647' class='stm run hide_run'><a href='#n1647'>1647</a></p>
  1704. <p id='n1648' class='stm run hide_run'><a href='#n1648'>1648</a></p>
  1705. <p id='n1649' class='stm run hide_run'><a href='#n1649'>1649</a></p>
  1706. <p id='n1650' class='stm run hide_run'><a href='#n1650'>1650</a></p>
  1707. <p id='n1651' class='stm run hide_run'><a href='#n1651'>1651</a></p>
  1708. <p id='n1652' class='stm run hide_run'><a href='#n1652'>1652</a></p>
  1709. <p id='n1653' class='stm mis'><a href='#n1653'>1653</a></p>
  1710. <p id='n1654' class='stm mis'><a href='#n1654'>1654</a></p>
  1711. <p id='n1655' class='stm mis'><a href='#n1655'>1655</a></p>
  1712. <p id='n1656' class='pln'><a href='#n1656'>1656</a></p>
  1713. <p id='n1657' class='pln'><a href='#n1657'>1657</a></p>
  1714. <p id='n1658' class='stm run hide_run'><a href='#n1658'>1658</a></p>
  1715. <p id='n1659' class='stm run hide_run'><a href='#n1659'>1659</a></p>
  1716. <p id='n1660' class='stm run hide_run'><a href='#n1660'>1660</a></p>
  1717. <p id='n1661' class='stm run hide_run'><a href='#n1661'>1661</a></p>
  1718. <p id='n1662' class='stm run hide_run'><a href='#n1662'>1662</a></p>
  1719. <p id='n1663' class='pln'><a href='#n1663'>1663</a></p>
  1720. <p id='n1664' class='stm run hide_run'><a href='#n1664'>1664</a></p>
  1721. <p id='n1665' class='stm run hide_run'><a href='#n1665'>1665</a></p>
  1722. <p id='n1666' class='stm run hide_run'><a href='#n1666'>1666</a></p>
  1723. <p id='n1667' class='pln'><a href='#n1667'>1667</a></p>
  1724. <p id='n1668' class='stm run hide_run'><a href='#n1668'>1668</a></p>
  1725. <p id='n1669' class='pln'><a href='#n1669'>1669</a></p>
  1726. <p id='n1670' class='stm run hide_run'><a href='#n1670'>1670</a></p>
  1727. <p id='n1671' class='stm run hide_run'><a href='#n1671'>1671</a></p>
  1728. <p id='n1672' class='stm run hide_run'><a href='#n1672'>1672</a></p>
  1729. <p id='n1673' class='stm run hide_run'><a href='#n1673'>1673</a></p>
  1730. <p id='n1674' class='pln'><a href='#n1674'>1674</a></p>
  1731. <p id='n1675' class='stm mis'><a href='#n1675'>1675</a></p>
  1732. <p id='n1676' class='pln'><a href='#n1676'>1676</a></p>
  1733. <p id='n1677' class='stm run hide_run'><a href='#n1677'>1677</a></p>
  1734. <p id='n1678' class='stm run hide_run'><a href='#n1678'>1678</a></p>
  1735. <p id='n1679' class='pln'><a href='#n1679'>1679</a></p>
  1736. <p id='n1680' class='stm mis'><a href='#n1680'>1680</a></p>
  1737. <p id='n1681' class='pln'><a href='#n1681'>1681</a></p>
  1738. <p id='n1682' class='stm run hide_run'><a href='#n1682'>1682</a></p>
  1739. <p id='n1683' class='stm run hide_run'><a href='#n1683'>1683</a></p>
  1740. <p id='n1684' class='stm run hide_run'><a href='#n1684'>1684</a></p>
  1741. <p id='n1685' class='pln'><a href='#n1685'>1685</a></p>
  1742. <p id='n1686' class='pln'><a href='#n1686'>1686</a></p>
  1743. <p id='n1687' class='stm run hide_run'><a href='#n1687'>1687</a></p>
  1744. <p id='n1688' class='pln'><a href='#n1688'>1688</a></p>
  1745. <p id='n1689' class='pln'><a href='#n1689'>1689</a></p>
  1746. <p id='n1690' class='stm run hide_run'><a href='#n1690'>1690</a></p>
  1747. <p id='n1691' class='stm run hide_run'><a href='#n1691'>1691</a></p>
  1748. <p id='n1692' class='stm run hide_run'><a href='#n1692'>1692</a></p>
  1749. <p id='n1693' class='stm run hide_run'><a href='#n1693'>1693</a></p>
  1750. <p id='n1694' class='pln'><a href='#n1694'>1694</a></p>
  1751. <p id='n1695' class='stm run hide_run'><a href='#n1695'>1695</a></p>
  1752. <p id='n1696' class='pln'><a href='#n1696'>1696</a></p>
  1753. <p id='n1697' class='stm mis'><a href='#n1697'>1697</a></p>
  1754. <p id='n1698' class='pln'><a href='#n1698'>1698</a></p>
  1755. <p id='n1699' class='stm run hide_run'><a href='#n1699'>1699</a></p>
  1756. <p id='n1700' class='pln'><a href='#n1700'>1700</a></p>
  1757. <p id='n1701' class='stm mis'><a href='#n1701'>1701</a></p>
  1758. <p id='n1702' class='stm mis'><a href='#n1702'>1702</a></p>
  1759. <p id='n1703' class='stm mis'><a href='#n1703'>1703</a></p>
  1760. <p id='n1704' class='stm mis'><a href='#n1704'>1704</a></p>
  1761. <p id='n1705' class='pln'><a href='#n1705'>1705</a></p>
  1762. <p id='n1706' class='pln'><a href='#n1706'>1706</a></p>
  1763. <p id='n1707' class='stm mis'><a href='#n1707'>1707</a></p>
  1764. <p id='n1708' class='stm mis'><a href='#n1708'>1708</a></p>
  1765. <p id='n1709' class='stm mis'><a href='#n1709'>1709</a></p>
  1766. <p id='n1710' class='pln'><a href='#n1710'>1710</a></p>
  1767. <p id='n1711' class='stm mis'><a href='#n1711'>1711</a></p>
  1768. <p id='n1712' class='stm mis'><a href='#n1712'>1712</a></p>
  1769. <p id='n1713' class='stm mis'><a href='#n1713'>1713</a></p>
  1770. <p id='n1714' class='stm mis'><a href='#n1714'>1714</a></p>
  1771. <p id='n1715' class='stm mis'><a href='#n1715'>1715</a></p>
  1772. <p id='n1716' class='stm mis'><a href='#n1716'>1716</a></p>
  1773. <p id='n1717' class='stm mis'><a href='#n1717'>1717</a></p>
  1774. <p id='n1718' class='stm mis'><a href='#n1718'>1718</a></p>
  1775. <p id='n1719' class='stm mis'><a href='#n1719'>1719</a></p>
  1776. <p id='n1720' class='pln'><a href='#n1720'>1720</a></p>
  1777. <p id='n1721' class='pln'><a href='#n1721'>1721</a></p>
  1778. <p id='n1722' class='stm mis'><a href='#n1722'>1722</a></p>
  1779. <p id='n1723' class='stm mis'><a href='#n1723'>1723</a></p>
  1780. <p id='n1724' class='stm mis'><a href='#n1724'>1724</a></p>
  1781. <p id='n1725' class='stm mis'><a href='#n1725'>1725</a></p>
  1782. <p id='n1726' class='stm mis'><a href='#n1726'>1726</a></p>
  1783. <p id='n1727' class='pln'><a href='#n1727'>1727</a></p>
  1784. <p id='n1728' class='stm mis'><a href='#n1728'>1728</a></p>
  1785. <p id='n1729' class='stm mis'><a href='#n1729'>1729</a></p>
  1786. <p id='n1730' class='stm mis'><a href='#n1730'>1730</a></p>
  1787. <p id='n1731' class='pln'><a href='#n1731'>1731</a></p>
  1788. <p id='n1732' class='stm mis'><a href='#n1732'>1732</a></p>
  1789. <p id='n1733' class='pln'><a href='#n1733'>1733</a></p>
  1790. <p id='n1734' class='stm mis'><a href='#n1734'>1734</a></p>
  1791. <p id='n1735' class='stm mis'><a href='#n1735'>1735</a></p>
  1792. <p id='n1736' class='stm mis'><a href='#n1736'>1736</a></p>
  1793. <p id='n1737' class='pln'><a href='#n1737'>1737</a></p>
  1794. <p id='n1738' class='pln'><a href='#n1738'>1738</a></p>
  1795. <p id='n1739' class='stm run hide_run'><a href='#n1739'>1739</a></p>
  1796. <p id='n1740' class='pln'><a href='#n1740'>1740</a></p>
  1797. <p id='n1741' class='pln'><a href='#n1741'>1741</a></p>
  1798. <p id='n1742' class='stm run hide_run'><a href='#n1742'>1742</a></p>
  1799. <p id='n1743' class='stm run hide_run'><a href='#n1743'>1743</a></p>
  1800. <p id='n1744' class='stm run hide_run'><a href='#n1744'>1744</a></p>
  1801. <p id='n1745' class='stm run hide_run'><a href='#n1745'>1745</a></p>
  1802. <p id='n1746' class='stm run hide_run'><a href='#n1746'>1746</a></p>
  1803. <p id='n1747' class='stm run hide_run'><a href='#n1747'>1747</a></p>
  1804. <p id='n1748' class='pln'><a href='#n1748'>1748</a></p>
  1805. <p id='n1749' class='stm run hide_run'><a href='#n1749'>1749</a></p>
  1806. <p id='n1750' class='stm run hide_run'><a href='#n1750'>1750</a></p>
  1807. <p id='n1751' class='pln'><a href='#n1751'>1751</a></p>
  1808. <p id='n1752' class='stm run hide_run'><a href='#n1752'>1752</a></p>
  1809. <p id='n1753' class='pln'><a href='#n1753'>1753</a></p>
  1810. <p id='n1754' class='stm run hide_run'><a href='#n1754'>1754</a></p>
  1811. <p id='n1755' class='pln'><a href='#n1755'>1755</a></p>
  1812. <p id='n1756' class='pln'><a href='#n1756'>1756</a></p>
  1813. <p id='n1757' class='stm run hide_run'><a href='#n1757'>1757</a></p>
  1814. <p id='n1758' class='pln'><a href='#n1758'>1758</a></p>
  1815. <p id='n1759' class='stm run hide_run'><a href='#n1759'>1759</a></p>
  1816. <p id='n1760' class='stm run hide_run'><a href='#n1760'>1760</a></p>
  1817. <p id='n1761' class='stm mis'><a href='#n1761'>1761</a></p>
  1818. <p id='n1762' class='stm mis'><a href='#n1762'>1762</a></p>
  1819. <p id='n1763' class='pln'><a href='#n1763'>1763</a></p>
  1820. <p id='n1764' class='stm run hide_run'><a href='#n1764'>1764</a></p>
  1821. <p id='n1765' class='pln'><a href='#n1765'>1765</a></p>
  1822. <p id='n1766' class='pln'><a href='#n1766'>1766</a></p>
  1823. <p id='n1767' class='pln'><a href='#n1767'>1767</a></p>
  1824. <p id='n1768' class='pln'><a href='#n1768'>1768</a></p>
  1825. <p id='n1769' class='pln'><a href='#n1769'>1769</a></p>
  1826. <p id='n1770' class='pln'><a href='#n1770'>1770</a></p>
  1827. <p id='n1771' class='stm run hide_run'><a href='#n1771'>1771</a></p>
  1828. <p id='n1772' class='stm run hide_run'><a href='#n1772'>1772</a></p>
  1829. <p id='n1773' class='pln'><a href='#n1773'>1773</a></p>
  1830. <p id='n1774' class='stm run hide_run'><a href='#n1774'>1774</a></p>
  1831. <p id='n1775' class='stm run hide_run'><a href='#n1775'>1775</a></p>
  1832. <p id='n1776' class='stm run hide_run'><a href='#n1776'>1776</a></p>
  1833. <p id='n1777' class='pln'><a href='#n1777'>1777</a></p>
  1834. <p id='n1778' class='stm run hide_run'><a href='#n1778'>1778</a></p>
  1835. <p id='n1779' class='pln'><a href='#n1779'>1779</a></p>
  1836. <p id='n1780' class='stm run hide_run'><a href='#n1780'>1780</a></p>
  1837. <p id='n1781' class='stm run hide_run'><a href='#n1781'>1781</a></p>
  1838. <p id='n1782' class='stm mis'><a href='#n1782'>1782</a></p>
  1839. <p id='n1783' class='stm mis'><a href='#n1783'>1783</a></p>
  1840. <p id='n1784' class='stm mis'><a href='#n1784'>1784</a></p>
  1841. <p id='n1785' class='pln'><a href='#n1785'>1785</a></p>
  1842. <p id='n1786' class='pln'><a href='#n1786'>1786</a></p>
  1843. <p id='n1787' class='stm run hide_run'><a href='#n1787'>1787</a></p>
  1844. <p id='n1788' class='pln'><a href='#n1788'>1788</a></p>
  1845. <p id='n1789' class='stm run hide_run'><a href='#n1789'>1789</a></p>
  1846. <p id='n1790' class='stm run hide_run'><a href='#n1790'>1790</a></p>
  1847. <p id='n1791' class='stm run hide_run'><a href='#n1791'>1791</a></p>
  1848. <p id='n1792' class='pln'><a href='#n1792'>1792</a></p>
  1849. <p id='n1793' class='stm run hide_run'><a href='#n1793'>1793</a></p>
  1850. <p id='n1794' class='pln'><a href='#n1794'>1794</a></p>
  1851. <p id='n1795' class='pln'><a href='#n1795'>1795</a></p>
  1852. <p id='n1796' class='pln'><a href='#n1796'>1796</a></p>
  1853. <p id='n1797' class='pln'><a href='#n1797'>1797</a></p>
  1854. <p id='n1798' class='pln'><a href='#n1798'>1798</a></p>
  1855. <p id='n1799' class='pln'><a href='#n1799'>1799</a></p>
  1856. <p id='n1800' class='pln'><a href='#n1800'>1800</a></p>
  1857. <p id='n1801' class='stm run hide_run'><a href='#n1801'>1801</a></p>
  1858. <p id='n1802' class='stm run hide_run'><a href='#n1802'>1802</a></p>
  1859. <p id='n1803' class='pln'><a href='#n1803'>1803</a></p>
  1860. <p id='n1804' class='stm run hide_run'><a href='#n1804'>1804</a></p>
  1861. <p id='n1805' class='pln'><a href='#n1805'>1805</a></p>
  1862. <p id='n1806' class='stm run hide_run'><a href='#n1806'>1806</a></p>
  1863. <p id='n1807' class='stm run hide_run'><a href='#n1807'>1807</a></p>
  1864. <p id='n1808' class='stm run hide_run'><a href='#n1808'>1808</a></p>
  1865. <p id='n1809' class='pln'><a href='#n1809'>1809</a></p>
  1866. <p id='n1810' class='stm run hide_run'><a href='#n1810'>1810</a></p>
  1867. <p id='n1811' class='stm run hide_run'><a href='#n1811'>1811</a></p>
  1868. <p id='n1812' class='pln'><a href='#n1812'>1812</a></p>
  1869. <p id='n1813' class='stm mis'><a href='#n1813'>1813</a></p>
  1870. <p id='n1814' class='pln'><a href='#n1814'>1814</a></p>
  1871. <p id='n1815' class='stm run hide_run'><a href='#n1815'>1815</a></p>
  1872. <p id='n1816' class='pln'><a href='#n1816'>1816</a></p>
  1873. <p id='n1817' class='pln'><a href='#n1817'>1817</a></p>
  1874. <p id='n1818' class='stm run hide_run'><a href='#n1818'>1818</a></p>
  1875. <p id='n1819' class='stm run hide_run'><a href='#n1819'>1819</a></p>
  1876. <p id='n1820' class='pln'><a href='#n1820'>1820</a></p>
  1877. <p id='n1821' class='pln'><a href='#n1821'>1821</a></p>
  1878. <p id='n1822' class='stm run hide_run'><a href='#n1822'>1822</a></p>
  1879. <p id='n1823' class='pln'><a href='#n1823'>1823</a></p>
  1880. <p id='n1824' class='pln'><a href='#n1824'>1824</a></p>
  1881. <p id='n1825' class='stm run hide_run'><a href='#n1825'>1825</a></p>
  1882. <p id='n1826' class='stm run hide_run'><a href='#n1826'>1826</a></p>
  1883. <p id='n1827' class='stm run hide_run'><a href='#n1827'>1827</a></p>
  1884. <p id='n1828' class='pln'><a href='#n1828'>1828</a></p>
  1885. <p id='n1829' class='stm run hide_run'><a href='#n1829'>1829</a></p>
  1886. <p id='n1830' class='stm mis'><a href='#n1830'>1830</a></p>
  1887. <p id='n1831' class='pln'><a href='#n1831'>1831</a></p>
  1888. <p id='n1832' class='stm run hide_run'><a href='#n1832'>1832</a></p>
  1889. <p id='n1833' class='pln'><a href='#n1833'>1833</a></p>
  1890. <p id='n1834' class='stm mis'><a href='#n1834'>1834</a></p>
  1891. <p id='n1835' class='pln'><a href='#n1835'>1835</a></p>
  1892. <p id='n1836' class='pln'><a href='#n1836'>1836</a></p>
  1893. <p id='n1837' class='stm run hide_run'><a href='#n1837'>1837</a></p>
  1894. <p id='n1838' class='pln'><a href='#n1838'>1838</a></p>
  1895. <p id='n1839' class='stm mis'><a href='#n1839'>1839</a></p>
  1896. <p id='n1840' class='stm mis'><a href='#n1840'>1840</a></p>
  1897. <p id='n1841' class='stm mis'><a href='#n1841'>1841</a></p>
  1898. <p id='n1842' class='stm mis'><a href='#n1842'>1842</a></p>
  1899. <p id='n1843' class='pln'><a href='#n1843'>1843</a></p>
  1900. <p id='n1844' class='stm mis'><a href='#n1844'>1844</a></p>
  1901. <p id='n1845' class='pln'><a href='#n1845'>1845</a></p>
  1902. <p id='n1846' class='stm mis'><a href='#n1846'>1846</a></p>
  1903. <p id='n1847' class='pln'><a href='#n1847'>1847</a></p>
  1904. <p id='n1848' class='stm mis'><a href='#n1848'>1848</a></p>
  1905. <p id='n1849' class='pln'><a href='#n1849'>1849</a></p>
  1906. <p id='n1850' class='stm mis'><a href='#n1850'>1850</a></p>
  1907. <p id='n1851' class='stm mis'><a href='#n1851'>1851</a></p>
  1908. <p id='n1852' class='stm mis'><a href='#n1852'>1852</a></p>
  1909. <p id='n1853' class='stm mis'><a href='#n1853'>1853</a></p>
  1910. <p id='n1854' class='stm mis'><a href='#n1854'>1854</a></p>
  1911. <p id='n1855' class='stm mis'><a href='#n1855'>1855</a></p>
  1912. <p id='n1856' class='stm mis'><a href='#n1856'>1856</a></p>
  1913. <p id='n1857' class='pln'><a href='#n1857'>1857</a></p>
  1914. <p id='n1858' class='pln'><a href='#n1858'>1858</a></p>
  1915. <p id='n1859' class='pln'><a href='#n1859'>1859</a></p>
  1916. <p id='n1860' class='pln'><a href='#n1860'>1860</a></p>
  1917. <p id='n1861' class='pln'><a href='#n1861'>1861</a></p>
  1918. <p id='n1862' class='pln'><a href='#n1862'>1862</a></p>
  1919. <p id='n1863' class='pln'><a href='#n1863'>1863</a></p>
  1920. <p id='n1864' class='stm mis'><a href='#n1864'>1864</a></p>
  1921. <p id='n1865' class='stm mis'><a href='#n1865'>1865</a></p>
  1922. <p id='n1866' class='pln'><a href='#n1866'>1866</a></p>
  1923. <p id='n1867' class='stm mis'><a href='#n1867'>1867</a></p>
  1924. <p id='n1868' class='stm mis'><a href='#n1868'>1868</a></p>
  1925. <p id='n1869' class='pln'><a href='#n1869'>1869</a></p>
  1926. <p id='n1870' class='stm mis'><a href='#n1870'>1870</a></p>
  1927. <p id='n1871' class='pln'><a href='#n1871'>1871</a></p>
  1928. <p id='n1872' class='stm mis'><a href='#n1872'>1872</a></p>
  1929. <p id='n1873' class='stm mis'><a href='#n1873'>1873</a></p>
  1930. <p id='n1874' class='stm mis'><a href='#n1874'>1874</a></p>
  1931. <p id='n1875' class='stm mis'><a href='#n1875'>1875</a></p>
  1932. <p id='n1876' class='stm mis'><a href='#n1876'>1876</a></p>
  1933. <p id='n1877' class='pln'><a href='#n1877'>1877</a></p>
  1934. <p id='n1878' class='pln'><a href='#n1878'>1878</a></p>
  1935. <p id='n1879' class='stm mis'><a href='#n1879'>1879</a></p>
  1936. <p id='n1880' class='pln'><a href='#n1880'>1880</a></p>
  1937. <p id='n1881' class='stm mis'><a href='#n1881'>1881</a></p>
  1938. <p id='n1882' class='stm mis'><a href='#n1882'>1882</a></p>
  1939. <p id='n1883' class='stm mis'><a href='#n1883'>1883</a></p>
  1940. <p id='n1884' class='pln'><a href='#n1884'>1884</a></p>
  1941. <p id='n1885' class='stm mis'><a href='#n1885'>1885</a></p>
  1942. <p id='n1886' class='pln'><a href='#n1886'>1886</a></p>
  1943. <p id='n1887' class='pln'><a href='#n1887'>1887</a></p>
  1944. <p id='n1888' class='pln'><a href='#n1888'>1888</a></p>
  1945. <p id='n1889' class='pln'><a href='#n1889'>1889</a></p>
  1946. <p id='n1890' class='pln'><a href='#n1890'>1890</a></p>
  1947. <p id='n1891' class='pln'><a href='#n1891'>1891</a></p>
  1948. <p id='n1892' class='pln'><a href='#n1892'>1892</a></p>
  1949. <p id='n1893' class='stm mis'><a href='#n1893'>1893</a></p>
  1950. <p id='n1894' class='stm mis'><a href='#n1894'>1894</a></p>
  1951. <p id='n1895' class='pln'><a href='#n1895'>1895</a></p>
  1952. <p id='n1896' class='stm mis'><a href='#n1896'>1896</a></p>
  1953. <p id='n1897' class='pln'><a href='#n1897'>1897</a></p>
  1954. <p id='n1898' class='stm mis'><a href='#n1898'>1898</a></p>
  1955. <p id='n1899' class='stm mis'><a href='#n1899'>1899</a></p>
  1956. <p id='n1900' class='stm mis'><a href='#n1900'>1900</a></p>
  1957. <p id='n1901' class='pln'><a href='#n1901'>1901</a></p>
  1958. <p id='n1902' class='stm mis'><a href='#n1902'>1902</a></p>
  1959. <p id='n1903' class='stm mis'><a href='#n1903'>1903</a></p>
  1960. <p id='n1904' class='pln'><a href='#n1904'>1904</a></p>
  1961. <p id='n1905' class='stm mis'><a href='#n1905'>1905</a></p>
  1962. <p id='n1906' class='pln'><a href='#n1906'>1906</a></p>
  1963. <p id='n1907' class='stm mis'><a href='#n1907'>1907</a></p>
  1964. <p id='n1908' class='pln'><a href='#n1908'>1908</a></p>
  1965. <p id='n1909' class='pln'><a href='#n1909'>1909</a></p>
  1966. <p id='n1910' class='stm mis'><a href='#n1910'>1910</a></p>
  1967. <p id='n1911' class='stm mis'><a href='#n1911'>1911</a></p>
  1968. <p id='n1912' class='pln'><a href='#n1912'>1912</a></p>
  1969. <p id='n1913' class='pln'><a href='#n1913'>1913</a></p>
  1970. <p id='n1914' class='stm run hide_run'><a href='#n1914'>1914</a></p>
  1971. <p id='n1915' class='pln'><a href='#n1915'>1915</a></p>
  1972. <p id='n1916' class='pln'><a href='#n1916'>1916</a></p>
  1973. <p id='n1917' class='stm run hide_run'><a href='#n1917'>1917</a></p>
  1974. <p id='n1918' class='pln'><a href='#n1918'>1918</a></p>
  1975. <p id='n1919' class='stm run hide_run'><a href='#n1919'>1919</a></p>
  1976. <p id='n1920' class='pln'><a href='#n1920'>1920</a></p>
  1977. <p id='n1921' class='stm mis'><a href='#n1921'>1921</a></p>
  1978. <p id='n1922' class='pln'><a href='#n1922'>1922</a></p>
  1979. <p id='n1923' class='stm run hide_run'><a href='#n1923'>1923</a></p>
  1980. <p id='n1924' class='pln'><a href='#n1924'>1924</a></p>
  1981. <p id='n1925' class='stm mis'><a href='#n1925'>1925</a></p>
  1982. <p id='n1926' class='pln'><a href='#n1926'>1926</a></p>
  1983. <p id='n1927' class='stm run hide_run'><a href='#n1927'>1927</a></p>
  1984. <p id='n1928' class='stm mis'><a href='#n1928'>1928</a></p>
  1985. <p id='n1929' class='pln'><a href='#n1929'>1929</a></p>
  1986. <p id='n1930' class='stm mis'><a href='#n1930'>1930</a></p>
  1987. <p id='n1931' class='pln'><a href='#n1931'>1931</a></p>
  1988. <p id='n1932' class='pln'><a href='#n1932'>1932</a></p>
  1989. <p id='n1933' class='stm mis'><a href='#n1933'>1933</a></p>
  1990. <p id='n1934' class='stm mis'><a href='#n1934'>1934</a></p>
  1991. <p id='n1935' class='stm mis'><a href='#n1935'>1935</a></p>
  1992. <p id='n1936' class='stm mis'><a href='#n1936'>1936</a></p>
  1993. <p id='n1937' class='stm mis'><a href='#n1937'>1937</a></p>
  1994. <p id='n1938' class='stm mis'><a href='#n1938'>1938</a></p>
  1995. <p id='n1939' class='stm mis'><a href='#n1939'>1939</a></p>
  1996. <p id='n1940' class='stm mis'><a href='#n1940'>1940</a></p>
  1997. <p id='n1941' class='pln'><a href='#n1941'>1941</a></p>
  1998. <p id='n1942' class='pln'><a href='#n1942'>1942</a></p>
  1999. <p id='n1943' class='stm mis'><a href='#n1943'>1943</a></p>
  2000. <p id='n1944' class='stm mis'><a href='#n1944'>1944</a></p>
  2001. <p id='n1945' class='pln'><a href='#n1945'>1945</a></p>
  2002. <p id='n1946' class='stm mis'><a href='#n1946'>1946</a></p>
  2003. <p id='n1947' class='stm mis'><a href='#n1947'>1947</a></p>
  2004. <p id='n1948' class='stm mis'><a href='#n1948'>1948</a></p>
  2005. <p id='n1949' class='stm mis'><a href='#n1949'>1949</a></p>
  2006. <p id='n1950' class='pln'><a href='#n1950'>1950</a></p>
  2007. <p id='n1951' class='stm mis'><a href='#n1951'>1951</a></p>
  2008. <p id='n1952' class='stm mis'><a href='#n1952'>1952</a></p>
  2009. <p id='n1953' class='pln'><a href='#n1953'>1953</a></p>
  2010. <p id='n1954' class='stm mis'><a href='#n1954'>1954</a></p>
  2011. <p id='n1955' class='stm mis'><a href='#n1955'>1955</a></p>
  2012. <p id='n1956' class='pln'><a href='#n1956'>1956</a></p>
  2013. <p id='n1957' class='pln'><a href='#n1957'>1957</a></p>
  2014. <p id='n1958' class='stm mis'><a href='#n1958'>1958</a></p>
  2015. <p id='n1959' class='stm mis'><a href='#n1959'>1959</a></p>
  2016. <p id='n1960' class='stm mis'><a href='#n1960'>1960</a></p>
  2017. <p id='n1961' class='stm mis'><a href='#n1961'>1961</a></p>
  2018. <p id='n1962' class='stm mis'><a href='#n1962'>1962</a></p>
  2019. <p id='n1963' class='pln'><a href='#n1963'>1963</a></p>
  2020. <p id='n1964' class='stm mis'><a href='#n1964'>1964</a></p>
  2021. <p id='n1965' class='pln'><a href='#n1965'>1965</a></p>
  2022. <p id='n1966' class='pln'><a href='#n1966'>1966</a></p>
  2023. <p id='n1967' class='pln'><a href='#n1967'>1967</a></p>
  2024. <p id='n1968' class='pln'><a href='#n1968'>1968</a></p>
  2025. <p id='n1969' class='pln'><a href='#n1969'>1969</a></p>
  2026. <p id='n1970' class='pln'><a href='#n1970'>1970</a></p>
  2027. <p id='n1971' class='pln'><a href='#n1971'>1971</a></p>
  2028. <p id='n1972' class='pln'><a href='#n1972'>1972</a></p>
  2029. <p id='n1973' class='pln'><a href='#n1973'>1973</a></p>
  2030. <p id='n1974' class='stm run hide_run'><a href='#n1974'>1974</a></p>
  2031. <p id='n1975' class='pln'><a href='#n1975'>1975</a></p>
  2032. <p id='n1976' class='pln'><a href='#n1976'>1976</a></p>
  2033. <p id='n1977' class='stm run hide_run'><a href='#n1977'>1977</a></p>
  2034. <p id='n1978' class='stm run hide_run'><a href='#n1978'>1978</a></p>
  2035. <p id='n1979' class='stm run hide_run'><a href='#n1979'>1979</a></p>
  2036. <p id='n1980' class='stm run hide_run'><a href='#n1980'>1980</a></p>
  2037. <p id='n1981' class='stm run hide_run'><a href='#n1981'>1981</a></p>
  2038. <p id='n1982' class='stm run hide_run'><a href='#n1982'>1982</a></p>
  2039. <p id='n1983' class='pln'><a href='#n1983'>1983</a></p>
  2040. <p id='n1984' class='pln'><a href='#n1984'>1984</a></p>
  2041. <p id='n1985' class='pln'><a href='#n1985'>1985</a></p>
  2042. <p id='n1986' class='pln'><a href='#n1986'>1986</a></p>
  2043. <p id='n1987' class='stm run hide_run'><a href='#n1987'>1987</a></p>
  2044. <p id='n1988' class='pln'><a href='#n1988'>1988</a></p>
  2045. <p id='n1989' class='stm run hide_run'><a href='#n1989'>1989</a></p>
  2046. <p id='n1990' class='stm mis'><a href='#n1990'>1990</a></p>
  2047. <p id='n1991' class='pln'><a href='#n1991'>1991</a></p>
  2048. <p id='n1992' class='stm run hide_run'><a href='#n1992'>1992</a></p>
  2049. <p id='n1993' class='pln'><a href='#n1993'>1993</a></p>
  2050. <p id='n1994' class='stm mis'><a href='#n1994'>1994</a></p>
  2051. <p id='n1995' class='pln'><a href='#n1995'>1995</a></p>
  2052. <p id='n1996' class='stm run hide_run'><a href='#n1996'>1996</a></p>
  2053. <p id='n1997' class='pln'><a href='#n1997'>1997</a></p>
  2054. <p id='n1998' class='stm mis'><a href='#n1998'>1998</a></p>
  2055. <p id='n1999' class='pln'><a href='#n1999'>1999</a></p>
  2056. <p id='n2000' class='stm run hide_run'><a href='#n2000'>2000</a></p>
  2057. <p id='n2001' class='pln'><a href='#n2001'>2001</a></p>
  2058. <p id='n2002' class='stm mis'><a href='#n2002'>2002</a></p>
  2059. <p id='n2003' class='pln'><a href='#n2003'>2003</a></p>
  2060. <p id='n2004' class='stm run hide_run'><a href='#n2004'>2004</a></p>
  2061. <p id='n2005' class='pln'><a href='#n2005'>2005</a></p>
  2062. <p id='n2006' class='stm mis'><a href='#n2006'>2006</a></p>
  2063. <p id='n2007' class='pln'><a href='#n2007'>2007</a></p>
  2064. <p id='n2008' class='stm run hide_run'><a href='#n2008'>2008</a></p>
  2065. <p id='n2009' class='pln'><a href='#n2009'>2009</a></p>
  2066. <p id='n2010' class='pln'><a href='#n2010'>2010</a></p>
  2067. <p id='n2011' class='stm mis'><a href='#n2011'>2011</a></p>
  2068. <p id='n2012' class='pln'><a href='#n2012'>2012</a></p>
  2069. <p id='n2013' class='pln'><a href='#n2013'>2013</a></p>
  2070. <p id='n2014' class='pln'><a href='#n2014'>2014</a></p>
  2071. <p id='n2015' class='pln'><a href='#n2015'>2015</a></p>
  2072. <p id='n2016' class='stm mis'><a href='#n2016'>2016</a></p>
  2073. <p id='n2017' class='stm mis'><a href='#n2017'>2017</a></p>
  2074. <p id='n2018' class='stm mis'><a href='#n2018'>2018</a></p>
  2075. <p id='n2019' class='stm mis'><a href='#n2019'>2019</a></p>
  2076. <p id='n2020' class='stm mis'><a href='#n2020'>2020</a></p>
  2077. <p id='n2021' class='pln'><a href='#n2021'>2021</a></p>
  2078. <p id='n2022' class='pln'><a href='#n2022'>2022</a></p>
  2079. <p id='n2023' class='stm mis'><a href='#n2023'>2023</a></p>
  2080. <p id='n2024' class='stm mis'><a href='#n2024'>2024</a></p>
  2081. <p id='n2025' class='stm mis'><a href='#n2025'>2025</a></p>
  2082. <p id='n2026' class='stm mis'><a href='#n2026'>2026</a></p>
  2083. <p id='n2027' class='pln'><a href='#n2027'>2027</a></p>
  2084. <p id='n2028' class='pln'><a href='#n2028'>2028</a></p>
  2085. <p id='n2029' class='stm mis'><a href='#n2029'>2029</a></p>
  2086. <p id='n2030' class='stm mis'><a href='#n2030'>2030</a></p>
  2087. <p id='n2031' class='pln'><a href='#n2031'>2031</a></p>
  2088. <p id='n2032' class='stm mis'><a href='#n2032'>2032</a></p>
  2089. <p id='n2033' class='pln'><a href='#n2033'>2033</a></p>
  2090. <p id='n2034' class='stm run hide_run'><a href='#n2034'>2034</a></p>
  2091. <p id='n2035' class='stm mis'><a href='#n2035'>2035</a></p>
  2092. <p id='n2036' class='stm mis'><a href='#n2036'>2036</a></p>
  2093. <p id='n2037' class='pln'><a href='#n2037'>2037</a></p>
  2094. <p id='n2038' class='stm mis'><a href='#n2038'>2038</a></p>
  2095. <p id='n2039' class='stm mis'><a href='#n2039'>2039</a></p>
  2096. <p id='n2040' class='stm mis'><a href='#n2040'>2040</a></p>
  2097. <p id='n2041' class='pln'><a href='#n2041'>2041</a></p>
  2098. <p id='n2042' class='pln'><a href='#n2042'>2042</a></p>
  2099. <p id='n2043' class='stm mis'><a href='#n2043'>2043</a></p>
  2100. <p id='n2044' class='stm mis'><a href='#n2044'>2044</a></p>
  2101. <p id='n2045' class='stm mis'><a href='#n2045'>2045</a></p>
  2102. <p id='n2046' class='stm mis'><a href='#n2046'>2046</a></p>
  2103. <p id='n2047' class='stm mis'><a href='#n2047'>2047</a></p>
  2104. <p id='n2048' class='stm mis'><a href='#n2048'>2048</a></p>
  2105. <p id='n2049' class='stm mis'><a href='#n2049'>2049</a></p>
  2106. <p id='n2050' class='stm mis'><a href='#n2050'>2050</a></p>
  2107. <p id='n2051' class='stm mis'><a href='#n2051'>2051</a></p>
  2108. <p id='n2052' class='pln'><a href='#n2052'>2052</a></p>
  2109. <p id='n2053' class='stm mis'><a href='#n2053'>2053</a></p>
  2110. <p id='n2054' class='stm mis'><a href='#n2054'>2054</a></p>
  2111. <p id='n2055' class='stm mis'><a href='#n2055'>2055</a></p>
  2112. <p id='n2056' class='stm mis'><a href='#n2056'>2056</a></p>
  2113. <p id='n2057' class='pln'><a href='#n2057'>2057</a></p>
  2114. <p id='n2058' class='stm mis'><a href='#n2058'>2058</a></p>
  2115. <p id='n2059' class='stm mis'><a href='#n2059'>2059</a></p>
  2116. <p id='n2060' class='pln'><a href='#n2060'>2060</a></p>
  2117. <p id='n2061' class='pln'><a href='#n2061'>2061</a></p>
  2118. <p id='n2062' class='stm mis'><a href='#n2062'>2062</a></p>
  2119. <p id='n2063' class='pln'><a href='#n2063'>2063</a></p>
  2120. <p id='n2064' class='pln'><a href='#n2064'>2064</a></p>
  2121. <p id='n2065' class='pln'><a href='#n2065'>2065</a></p>
  2122. <p id='n2066' class='pln'><a href='#n2066'>2066</a></p>
  2123. <p id='n2067' class='stm mis'><a href='#n2067'>2067</a></p>
  2124. <p id='n2068' class='stm mis'><a href='#n2068'>2068</a></p>
  2125. <p id='n2069' class='stm mis'><a href='#n2069'>2069</a></p>
  2126. <p id='n2070' class='stm mis'><a href='#n2070'>2070</a></p>
  2127. <p id='n2071' class='stm mis'><a href='#n2071'>2071</a></p>
  2128. <p id='n2072' class='stm mis'><a href='#n2072'>2072</a></p>
  2129. <p id='n2073' class='stm mis'><a href='#n2073'>2073</a></p>
  2130. <p id='n2074' class='stm mis'><a href='#n2074'>2074</a></p>
  2131. <p id='n2075' class='stm mis'><a href='#n2075'>2075</a></p>
  2132. <p id='n2076' class='stm mis'><a href='#n2076'>2076</a></p>
  2133. <p id='n2077' class='pln'><a href='#n2077'>2077</a></p>
  2134. <p id='n2078' class='stm run hide_run'><a href='#n2078'>2078</a></p>
  2135. <p id='n2079' class='stm mis'><a href='#n2079'>2079</a></p>
  2136. <p id='n2080' class='stm mis'><a href='#n2080'>2080</a></p>
  2137. <p id='n2081' class='stm mis'><a href='#n2081'>2081</a></p>
  2138. <p id='n2082' class='stm mis'><a href='#n2082'>2082</a></p>
  2139. <p id='n2083' class='stm mis'><a href='#n2083'>2083</a></p>
  2140. <p id='n2084' class='pln'><a href='#n2084'>2084</a></p>
  2141. <p id='n2085' class='pln'><a href='#n2085'>2085</a></p>
  2142. <p id='n2086' class='stm mis'><a href='#n2086'>2086</a></p>
  2143. <p id='n2087' class='stm mis'><a href='#n2087'>2087</a></p>
  2144. <p id='n2088' class='stm mis'><a href='#n2088'>2088</a></p>
  2145. <p id='n2089' class='stm mis'><a href='#n2089'>2089</a></p>
  2146. <p id='n2090' class='stm mis'><a href='#n2090'>2090</a></p>
  2147. <p id='n2091' class='stm mis'><a href='#n2091'>2091</a></p>
  2148. <p id='n2092' class='stm mis'><a href='#n2092'>2092</a></p>
  2149. <p id='n2093' class='stm mis'><a href='#n2093'>2093</a></p>
  2150. <p id='n2094' class='pln'><a href='#n2094'>2094</a></p>
  2151. <p id='n2095' class='pln'><a href='#n2095'>2095</a></p>
  2152. <p id='n2096' class='stm mis'><a href='#n2096'>2096</a></p>
  2153. <p id='n2097' class='pln'><a href='#n2097'>2097</a></p>
  2154. <p id='n2098' class='pln'><a href='#n2098'>2098</a></p>
  2155. <p id='n2099' class='stm mis'><a href='#n2099'>2099</a></p>
  2156. <p id='n2100' class='pln'><a href='#n2100'>2100</a></p>
  2157. <p id='n2101' class='pln'><a href='#n2101'>2101</a></p>
  2158. <p id='n2102' class='stm mis'><a href='#n2102'>2102</a></p>
  2159. <p id='n2103' class='stm mis'><a href='#n2103'>2103</a></p>
  2160. <p id='n2104' class='stm mis'><a href='#n2104'>2104</a></p>
  2161. <p id='n2105' class='stm mis'><a href='#n2105'>2105</a></p>
  2162. <p id='n2106' class='pln'><a href='#n2106'>2106</a></p>
  2163. <p id='n2107' class='pln'><a href='#n2107'>2107</a></p>
  2164. <p id='n2108' class='stm mis'><a href='#n2108'>2108</a></p>
  2165. <p id='n2109' class='stm mis'><a href='#n2109'>2109</a></p>
  2166. <p id='n2110' class='stm mis'><a href='#n2110'>2110</a></p>
  2167. <p id='n2111' class='stm mis'><a href='#n2111'>2111</a></p>
  2168. <p id='n2112' class='stm mis'><a href='#n2112'>2112</a></p>
  2169. <p id='n2113' class='pln'><a href='#n2113'>2113</a></p>
  2170. <p id='n2114' class='pln'><a href='#n2114'>2114</a></p>
  2171. <p id='n2115' class='stm mis'><a href='#n2115'>2115</a></p>
  2172. <p id='n2116' class='stm mis'><a href='#n2116'>2116</a></p>
  2173. <p id='n2117' class='stm mis'><a href='#n2117'>2117</a></p>
  2174. <p id='n2118' class='pln'><a href='#n2118'>2118</a></p>
  2175. <p id='n2119' class='stm mis'><a href='#n2119'>2119</a></p>
  2176. <p id='n2120' class='pln'><a href='#n2120'>2120</a></p>
  2177. <p id='n2121' class='pln'><a href='#n2121'>2121</a></p>
  2178. <p id='n2122' class='stm mis'><a href='#n2122'>2122</a></p>
  2179. <p id='n2123' class='stm mis'><a href='#n2123'>2123</a></p>
  2180. <p id='n2124' class='stm mis'><a href='#n2124'>2124</a></p>
  2181. <p id='n2125' class='stm mis'><a href='#n2125'>2125</a></p>
  2182. <p id='n2126' class='stm mis'><a href='#n2126'>2126</a></p>
  2183. <p id='n2127' class='stm mis'><a href='#n2127'>2127</a></p>
  2184. <p id='n2128' class='stm mis'><a href='#n2128'>2128</a></p>
  2185. <p id='n2129' class='stm mis'><a href='#n2129'>2129</a></p>
  2186. <p id='n2130' class='stm mis'><a href='#n2130'>2130</a></p>
  2187. <p id='n2131' class='pln'><a href='#n2131'>2131</a></p>
  2188. <p id='n2132' class='pln'><a href='#n2132'>2132</a></p>
  2189. <p id='n2133' class='stm mis'><a href='#n2133'>2133</a></p>
  2190. <p id='n2134' class='pln'><a href='#n2134'>2134</a></p>
  2191. <p id='n2135' class='stm mis'><a href='#n2135'>2135</a></p>
  2192. <p id='n2136' class='stm mis'><a href='#n2136'>2136</a></p>
  2193. <p id='n2137' class='pln'><a href='#n2137'>2137</a></p>
  2194. <p id='n2138' class='stm mis'><a href='#n2138'>2138</a></p>
  2195. <p id='n2139' class='stm mis'><a href='#n2139'>2139</a></p>
  2196. <p id='n2140' class='pln'><a href='#n2140'>2140</a></p>
  2197. <p id='n2141' class='stm mis'><a href='#n2141'>2141</a></p>
  2198. <p id='n2142' class='stm mis'><a href='#n2142'>2142</a></p>
  2199. <p id='n2143' class='pln'><a href='#n2143'>2143</a></p>
  2200. <p id='n2144' class='stm mis'><a href='#n2144'>2144</a></p>
  2201. <p id='n2145' class='stm mis'><a href='#n2145'>2145</a></p>
  2202. <p id='n2146' class='stm mis'><a href='#n2146'>2146</a></p>
  2203. <p id='n2147' class='stm mis'><a href='#n2147'>2147</a></p>
  2204. <p id='n2148' class='stm mis'><a href='#n2148'>2148</a></p>
  2205. <p id='n2149' class='stm mis'><a href='#n2149'>2149</a></p>
  2206. <p id='n2150' class='stm mis'><a href='#n2150'>2150</a></p>
  2207. <p id='n2151' class='stm mis'><a href='#n2151'>2151</a></p>
  2208. <p id='n2152' class='stm mis'><a href='#n2152'>2152</a></p>
  2209. <p id='n2153' class='stm mis'><a href='#n2153'>2153</a></p>
  2210. <p id='n2154' class='stm mis'><a href='#n2154'>2154</a></p>
  2211. <p id='n2155' class='pln'><a href='#n2155'>2155</a></p>
  2212. <p id='n2156' class='pln'><a href='#n2156'>2156</a></p>
  2213. <p id='n2157' class='stm mis'><a href='#n2157'>2157</a></p>
  2214. <p id='n2158' class='stm mis'><a href='#n2158'>2158</a></p>
  2215. <p id='n2159' class='stm mis'><a href='#n2159'>2159</a></p>
  2216. <p id='n2160' class='stm mis'><a href='#n2160'>2160</a></p>
  2217. <p id='n2161' class='pln'><a href='#n2161'>2161</a></p>
  2218. <p id='n2162' class='stm mis'><a href='#n2162'>2162</a></p>
  2219. <p id='n2163' class='stm mis'><a href='#n2163'>2163</a></p>
  2220. <p id='n2164' class='pln'><a href='#n2164'>2164</a></p>
  2221. <p id='n2165' class='stm mis'><a href='#n2165'>2165</a></p>
  2222. <p id='n2166' class='pln'><a href='#n2166'>2166</a></p>
  2223. <p id='n2167' class='stm mis'><a href='#n2167'>2167</a></p>
  2224. <p id='n2168' class='pln'><a href='#n2168'>2168</a></p>
  2225. <p id='n2169' class='pln'><a href='#n2169'>2169</a></p>
  2226. <p id='n2170' class='pln'><a href='#n2170'>2170</a></p>
  2227. <p id='n2171' class='pln'><a href='#n2171'>2171</a></p>
  2228. <p id='n2172' class='pln'><a href='#n2172'>2172</a></p>
  2229. <p id='n2173' class='pln'><a href='#n2173'>2173</a></p>
  2230. <p id='n2174' class='pln'><a href='#n2174'>2174</a></p>
  2231. <p id='n2175' class='pln'><a href='#n2175'>2175</a></p>
  2232. <p id='n2176' class='pln'><a href='#n2176'>2176</a></p>
  2233. <p id='n2177' class='pln'><a href='#n2177'>2177</a></p>
  2234. <p id='n2178' class='stm mis'><a href='#n2178'>2178</a></p>
  2235. <p id='n2179' class='pln'><a href='#n2179'>2179</a></p>
  2236. <p id='n2180' class='stm run hide_run'><a href='#n2180'>2180</a></p>
  2237. <p id='n2181' class='pln'><a href='#n2181'>2181</a></p>
  2238. <p id='n2182' class='pln'><a href='#n2182'>2182</a></p>
  2239. <p id='n2183' class='stm run hide_run'><a href='#n2183'>2183</a></p>
  2240. <p id='n2184' class='stm run hide_run'><a href='#n2184'>2184</a></p>
  2241. <p id='n2185' class='stm run hide_run'><a href='#n2185'>2185</a></p>
  2242. <p id='n2186' class='pln'><a href='#n2186'>2186</a></p>
  2243. <p id='n2187' class='stm run hide_run'><a href='#n2187'>2187</a></p>
  2244. <p id='n2188' class='pln'><a href='#n2188'>2188</a></p>
  2245. <p id='n2189' class='stm run hide_run'><a href='#n2189'>2189</a></p>
  2246. <p id='n2190' class='pln'><a href='#n2190'>2190</a></p>
  2247. <p id='n2191' class='stm run hide_run'><a href='#n2191'>2191</a></p>
  2248. <p id='n2192' class='pln'><a href='#n2192'>2192</a></p>
  2249. <p id='n2193' class='stm mis'><a href='#n2193'>2193</a></p>
  2250. <p id='n2194' class='pln'><a href='#n2194'>2194</a></p>
  2251. <p id='n2195' class='stm run hide_run'><a href='#n2195'>2195</a></p>
  2252. <p id='n2196' class='stm run hide_run'><a href='#n2196'>2196</a></p>
  2253. <p id='n2197' class='stm run hide_run'><a href='#n2197'>2197</a></p>
  2254. <p id='n2198' class='stm mis'><a href='#n2198'>2198</a></p>
  2255. <p id='n2199' class='stm mis'><a href='#n2199'>2199</a></p>
  2256. <p id='n2200' class='pln'><a href='#n2200'>2200</a></p>
  2257. <p id='n2201' class='stm run hide_run'><a href='#n2201'>2201</a></p>
  2258. <p id='n2202' class='stm mis'><a href='#n2202'>2202</a></p>
  2259. <p id='n2203' class='pln'><a href='#n2203'>2203</a></p>
  2260. <p id='n2204' class='stm run hide_run'><a href='#n2204'>2204</a></p>
  2261. <p id='n2205' class='stm run hide_run'><a href='#n2205'>2205</a></p>
  2262. <p id='n2206' class='stm run hide_run'><a href='#n2206'>2206</a></p>
  2263. <p id='n2207' class='stm run hide_run'><a href='#n2207'>2207</a></p>
  2264. <p id='n2208' class='stm run hide_run'><a href='#n2208'>2208</a></p>
  2265. <p id='n2209' class='stm run hide_run'><a href='#n2209'>2209</a></p>
  2266. <p id='n2210' class='stm run hide_run'><a href='#n2210'>2210</a></p>
  2267. <p id='n2211' class='stm run hide_run'><a href='#n2211'>2211</a></p>
  2268. <p id='n2212' class='stm mis'><a href='#n2212'>2212</a></p>
  2269. <p id='n2213' class='stm mis'><a href='#n2213'>2213</a></p>
  2270. <p id='n2214' class='stm mis'><a href='#n2214'>2214</a></p>
  2271. <p id='n2215' class='stm mis'><a href='#n2215'>2215</a></p>
  2272. <p id='n2216' class='stm mis'><a href='#n2216'>2216</a></p>
  2273. <p id='n2217' class='stm mis'><a href='#n2217'>2217</a></p>
  2274. <p id='n2218' class='pln'><a href='#n2218'>2218</a></p>
  2275. <p id='n2219' class='pln'><a href='#n2219'>2219</a></p>
  2276. <p id='n2220' class='pln'><a href='#n2220'>2220</a></p>
  2277. <p id='n2221' class='pln'><a href='#n2221'>2221</a></p>
  2278. <p id='n2222' class='pln'><a href='#n2222'>2222</a></p>
  2279. <p id='n2223' class='pln'><a href='#n2223'>2223</a></p>
  2280. <p id='n2224' class='pln'><a href='#n2224'>2224</a></p>
  2281. <p id='n2225' class='pln'><a href='#n2225'>2225</a></p>
  2282. <p id='n2226' class='stm mis'><a href='#n2226'>2226</a></p>
  2283. <p id='n2227' class='stm mis'><a href='#n2227'>2227</a></p>
  2284. <p id='n2228' class='stm mis'><a href='#n2228'>2228</a></p>
  2285. <p id='n2229' class='stm run hide_run'><a href='#n2229'>2229</a></p>
  2286. <p id='n2230' class='stm run hide_run'><a href='#n2230'>2230</a></p>
  2287. <p id='n2231' class='stm run hide_run'><a href='#n2231'>2231</a></p>
  2288. <p id='n2232' class='stm run hide_run'><a href='#n2232'>2232</a></p>
  2289. <p id='n2233' class='stm mis'><a href='#n2233'>2233</a></p>
  2290. <p id='n2234' class='stm mis'><a href='#n2234'>2234</a></p>
  2291. <p id='n2235' class='stm mis'><a href='#n2235'>2235</a></p>
  2292. <p id='n2236' class='pln'><a href='#n2236'>2236</a></p>
  2293. <p id='n2237' class='stm run hide_run'><a href='#n2237'>2237</a></p>
  2294. <p id='n2238' class='stm run hide_run'><a href='#n2238'>2238</a></p>
  2295. <p id='n2239' class='stm run hide_run'><a href='#n2239'>2239</a></p>
  2296. <p id='n2240' class='stm run hide_run'><a href='#n2240'>2240</a></p>
  2297. <p id='n2241' class='pln'><a href='#n2241'>2241</a></p>
  2298. <p id='n2242' class='stm mis'><a href='#n2242'>2242</a></p>
  2299. <p id='n2243' class='pln'><a href='#n2243'>2243</a></p>
  2300. <p id='n2244' class='stm run hide_run'><a href='#n2244'>2244</a></p>
  2301. <p id='n2245' class='stm run hide_run'><a href='#n2245'>2245</a></p>
  2302. <p id='n2246' class='stm run hide_run'><a href='#n2246'>2246</a></p>
  2303. <p id='n2247' class='stm run hide_run'><a href='#n2247'>2247</a></p>
  2304. <p id='n2248' class='stm mis'><a href='#n2248'>2248</a></p>
  2305. <p id='n2249' class='stm run hide_run'><a href='#n2249'>2249</a></p>
  2306. <p id='n2250' class='pln'><a href='#n2250'>2250</a></p>
  2307. <p id='n2251' class='stm run hide_run'><a href='#n2251'>2251</a></p>
  2308. <p id='n2252' class='pln'><a href='#n2252'>2252</a></p>
  2309. <p id='n2253' class='pln'><a href='#n2253'>2253</a></p>
  2310. <p id='n2254' class='pln'><a href='#n2254'>2254</a></p>
  2311. <p id='n2255' class='pln'><a href='#n2255'>2255</a></p>
  2312. <p id='n2256' class='pln'><a href='#n2256'>2256</a></p>
  2313. <p id='n2257' class='pln'><a href='#n2257'>2257</a></p>
  2314. <p id='n2258' class='pln'><a href='#n2258'>2258</a></p>
  2315. <p id='n2259' class='pln'><a href='#n2259'>2259</a></p>
  2316. <p id='n2260' class='pln'><a href='#n2260'>2260</a></p>
  2317. <p id='n2261' class='pln'><a href='#n2261'>2261</a></p>
  2318. <p id='n2262' class='pln'><a href='#n2262'>2262</a></p>
  2319. <p id='n2263' class='stm mis'><a href='#n2263'>2263</a></p>
  2320. <p id='n2264' class='stm mis'><a href='#n2264'>2264</a></p>
  2321. <p id='n2265' class='stm mis'><a href='#n2265'>2265</a></p>
  2322. <p id='n2266' class='pln'><a href='#n2266'>2266</a></p>
  2323. <p id='n2267' class='stm run hide_run'><a href='#n2267'>2267</a></p>
  2324. <p id='n2268' class='stm run hide_run'><a href='#n2268'>2268</a></p>
  2325. <p id='n2269' class='pln'><a href='#n2269'>2269</a></p>
  2326. <p id='n2270' class='pln'><a href='#n2270'>2270</a></p>
  2327. <p id='n2271' class='stm run hide_run'><a href='#n2271'>2271</a></p>
  2328. <p id='n2272' class='pln'><a href='#n2272'>2272</a></p>
  2329. <p id='n2273' class='pln'><a href='#n2273'>2273</a></p>
  2330. <p id='n2274' class='stm run hide_run'><a href='#n2274'>2274</a></p>
  2331. <p id='n2275' class='stm run hide_run'><a href='#n2275'>2275</a></p>
  2332. <p id='n2276' class='pln'><a href='#n2276'>2276</a></p>
  2333. <p id='n2277' class='stm run hide_run'><a href='#n2277'>2277</a></p>
  2334. <p id='n2278' class='stm run hide_run'><a href='#n2278'>2278</a></p>
  2335. <p id='n2279' class='pln'><a href='#n2279'>2279</a></p>
  2336. <p id='n2280' class='stm run hide_run'><a href='#n2280'>2280</a></p>
  2337. <p id='n2281' class='pln'><a href='#n2281'>2281</a></p>
  2338. <p id='n2282' class='stm run hide_run'><a href='#n2282'>2282</a></p>
  2339. <p id='n2283' class='pln'><a href='#n2283'>2283</a></p>
  2340. <p id='n2284' class='stm run hide_run'><a href='#n2284'>2284</a></p>
  2341. <p id='n2285' class='stm run hide_run'><a href='#n2285'>2285</a></p>
  2342. <p id='n2286' class='stm run hide_run'><a href='#n2286'>2286</a></p>
  2343. <p id='n2287' class='stm mis'><a href='#n2287'>2287</a></p>
  2344. <p id='n2288' class='stm mis'><a href='#n2288'>2288</a></p>
  2345. <p id='n2289' class='pln'><a href='#n2289'>2289</a></p>
  2346. <p id='n2290' class='stm run hide_run'><a href='#n2290'>2290</a></p>
  2347. <p id='n2291' class='pln'><a href='#n2291'>2291</a></p>
  2348. <p id='n2292' class='pln'><a href='#n2292'>2292</a></p>
  2349. <p id='n2293' class='stm run hide_run'><a href='#n2293'>2293</a></p>
  2350. <p id='n2294' class='stm run hide_run'><a href='#n2294'>2294</a></p>
  2351. <p id='n2295' class='pln'><a href='#n2295'>2295</a></p>
  2352. <p id='n2296' class='stm run hide_run'><a href='#n2296'>2296</a></p>
  2353. <p id='n2297' class='stm run hide_run'><a href='#n2297'>2297</a></p>
  2354. <p id='n2298' class='pln'><a href='#n2298'>2298</a></p>
  2355. <p id='n2299' class='stm run hide_run'><a href='#n2299'>2299</a></p>
  2356. <p id='n2300' class='stm mis'><a href='#n2300'>2300</a></p>
  2357. <p id='n2301' class='stm mis'><a href='#n2301'>2301</a></p>
  2358. <p id='n2302' class='stm run hide_run'><a href='#n2302'>2302</a></p>
  2359. <p id='n2303' class='pln'><a href='#n2303'>2303</a></p>
  2360. <p id='n2304' class='stm run hide_run'><a href='#n2304'>2304</a></p>
  2361. <p id='n2305' class='stm run hide_run'><a href='#n2305'>2305</a></p>
  2362. <p id='n2306' class='stm mis'><a href='#n2306'>2306</a></p>
  2363. <p id='n2307' class='stm mis'><a href='#n2307'>2307</a></p>
  2364. <p id='n2308' class='pln'><a href='#n2308'>2308</a></p>
  2365. <p id='n2309' class='stm run hide_run'><a href='#n2309'>2309</a></p>
  2366. <p id='n2310' class='pln'><a href='#n2310'>2310</a></p>
  2367. <p id='n2311' class='stm run hide_run'><a href='#n2311'>2311</a></p>
  2368. <p id='n2312' class='pln'><a href='#n2312'>2312</a></p>
  2369. <p id='n2313' class='pln'><a href='#n2313'>2313</a></p>
  2370. <p id='n2314' class='pln'><a href='#n2314'>2314</a></p>
  2371. <p id='n2315' class='pln'><a href='#n2315'>2315</a></p>
  2372. <p id='n2316' class='pln'><a href='#n2316'>2316</a></p>
  2373. <p id='n2317' class='pln'><a href='#n2317'>2317</a></p>
  2374. <p id='n2318' class='pln'><a href='#n2318'>2318</a></p>
  2375. <p id='n2319' class='pln'><a href='#n2319'>2319</a></p>
  2376. <p id='n2320' class='stm run hide_run'><a href='#n2320'>2320</a></p>
  2377. <p id='n2321' class='pln'><a href='#n2321'>2321</a></p>
  2378. <p id='n2322' class='pln'><a href='#n2322'>2322</a></p>
  2379. <p id='n2323' class='pln'><a href='#n2323'>2323</a></p>
  2380. <p id='n2324' class='pln'><a href='#n2324'>2324</a></p>
  2381. <p id='n2325' class='pln'><a href='#n2325'>2325</a></p>
  2382. <p id='n2326' class='pln'><a href='#n2326'>2326</a></p>
  2383. <p id='n2327' class='pln'><a href='#n2327'>2327</a></p>
  2384. <p id='n2328' class='stm run hide_run'><a href='#n2328'>2328</a></p>
  2385. <p id='n2329' class='pln'><a href='#n2329'>2329</a></p>
  2386. <p id='n2330' class='pln'><a href='#n2330'>2330</a></p>
  2387. <p id='n2331' class='pln'><a href='#n2331'>2331</a></p>
  2388. <p id='n2332' class='pln'><a href='#n2332'>2332</a></p>
  2389. <p id='n2333' class='pln'><a href='#n2333'>2333</a></p>
  2390. <p id='n2334' class='pln'><a href='#n2334'>2334</a></p>
  2391. <p id='n2335' class='pln'><a href='#n2335'>2335</a></p>
  2392. <p id='n2336' class='stm run hide_run'><a href='#n2336'>2336</a></p>
  2393. <p id='n2337' class='pln'><a href='#n2337'>2337</a></p>
  2394. <p id='n2338' class='stm run hide_run'><a href='#n2338'>2338</a></p>
  2395. <p id='n2339' class='pln'><a href='#n2339'>2339</a></p>
  2396. <p id='n2340' class='stm run hide_run'><a href='#n2340'>2340</a></p>
  2397. <p id='n2341' class='pln'><a href='#n2341'>2341</a></p>
  2398. <p id='n2342' class='pln'><a href='#n2342'>2342</a></p>
  2399. <p id='n2343' class='pln'><a href='#n2343'>2343</a></p>
  2400. <p id='n2344' class='pln'><a href='#n2344'>2344</a></p>
  2401. <p id='n2345' class='pln'><a href='#n2345'>2345</a></p>
  2402. <p id='n2346' class='pln'><a href='#n2346'>2346</a></p>
  2403. <p id='n2347' class='pln'><a href='#n2347'>2347</a></p>
  2404. <p id='n2348' class='stm run hide_run'><a href='#n2348'>2348</a></p>
  2405. <p id='n2349' class='pln'><a href='#n2349'>2349</a></p>
  2406. <p id='n2350' class='pln'><a href='#n2350'>2350</a></p>
  2407. <p id='n2351' class='pln'><a href='#n2351'>2351</a></p>
  2408. <p id='n2352' class='pln'><a href='#n2352'>2352</a></p>
  2409. <p id='n2353' class='pln'><a href='#n2353'>2353</a></p>
  2410. <p id='n2354' class='pln'><a href='#n2354'>2354</a></p>
  2411. <p id='n2355' class='pln'><a href='#n2355'>2355</a></p>
  2412. <p id='n2356' class='pln'><a href='#n2356'>2356</a></p>
  2413. <p id='n2357' class='stm run hide_run'><a href='#n2357'>2357</a></p>
  2414. <p id='n2358' class='pln'><a href='#n2358'>2358</a></p>
  2415. <p id='n2359' class='stm mis'><a href='#n2359'>2359</a></p>
  2416. <p id='n2360' class='pln'><a href='#n2360'>2360</a></p>
  2417. <p id='n2361' class='stm run hide_run'><a href='#n2361'>2361</a></p>
  2418. <p id='n2362' class='stm mis'><a href='#n2362'>2362</a></p>
  2419. <p id='n2363' class='pln'><a href='#n2363'>2363</a></p>
  2420. <p id='n2364' class='stm run hide_run'><a href='#n2364'>2364</a></p>
  2421. <p id='n2365' class='stm mis'><a href='#n2365'>2365</a></p>
  2422. <p id='n2366' class='pln'><a href='#n2366'>2366</a></p>
  2423. <p id='n2367' class='stm run hide_run'><a href='#n2367'>2367</a></p>
  2424. <p id='n2368' class='stm mis'><a href='#n2368'>2368</a></p>
  2425. <p id='n2369' class='pln'><a href='#n2369'>2369</a></p>
  2426. <p id='n2370' class='stm run hide_run'><a href='#n2370'>2370</a></p>
  2427. <p id='n2371' class='stm mis'><a href='#n2371'>2371</a></p>
  2428. <p id='n2372' class='pln'><a href='#n2372'>2372</a></p>
  2429. <p id='n2373' class='pln'><a href='#n2373'>2373</a></p>
  2430. <p id='n2374' class='stm run hide_run'><a href='#n2374'>2374</a></p>
  2431. <p id='n2375' class='stm mis'><a href='#n2375'>2375</a></p>
  2432. <p id='n2376' class='stm mis'><a href='#n2376'>2376</a></p>
  2433. <p id='n2377' class='stm mis'><a href='#n2377'>2377</a></p>
  2434. <p id='n2378' class='pln'><a href='#n2378'>2378</a></p>
  2435. <p id='n2379' class='pln'><a href='#n2379'>2379</a></p>
  2436. <p id='n2380' class='stm run hide_run'><a href='#n2380'>2380</a></p>
  2437. <p id='n2381' class='stm mis'><a href='#n2381'>2381</a></p>
  2438. <p id='n2382' class='stm mis'><a href='#n2382'>2382</a></p>
  2439. <p id='n2383' class='stm mis'><a href='#n2383'>2383</a></p>
  2440. <p id='n2384' class='stm mis'><a href='#n2384'>2384</a></p>
  2441. <p id='n2385' class='pln'><a href='#n2385'>2385</a></p>
  2442. <p id='n2386' class='stm mis'><a href='#n2386'>2386</a></p>
  2443. <p id='n2387' class='stm mis'><a href='#n2387'>2387</a></p>
  2444. <p id='n2388' class='stm mis'><a href='#n2388'>2388</a></p>
  2445. <p id='n2389' class='pln'><a href='#n2389'>2389</a></p>
  2446. <p id='n2390' class='stm mis'><a href='#n2390'>2390</a></p>
  2447. <p id='n2391' class='stm mis'><a href='#n2391'>2391</a></p>
  2448. <p id='n2392' class='stm mis'><a href='#n2392'>2392</a></p>
  2449. <p id='n2393' class='pln'><a href='#n2393'>2393</a></p>
  2450. <p id='n2394' class='stm mis'><a href='#n2394'>2394</a></p>
  2451. <p id='n2395' class='stm mis'><a href='#n2395'>2395</a></p>
  2452. <p id='n2396' class='stm mis'><a href='#n2396'>2396</a></p>
  2453. <p id='n2397' class='pln'><a href='#n2397'>2397</a></p>
  2454. <p id='n2398' class='stm mis'><a href='#n2398'>2398</a></p>
  2455. <p id='n2399' class='stm mis'><a href='#n2399'>2399</a></p>
  2456. <p id='n2400' class='pln'><a href='#n2400'>2400</a></p>
  2457. <p id='n2401' class='stm mis'><a href='#n2401'>2401</a></p>
  2458. <p id='n2402' class='stm mis'><a href='#n2402'>2402</a></p>
  2459. <p id='n2403' class='stm mis'><a href='#n2403'>2403</a></p>
  2460. <p id='n2404' class='pln'><a href='#n2404'>2404</a></p>
  2461. <p id='n2405' class='stm mis'><a href='#n2405'>2405</a></p>
  2462. <p id='n2406' class='pln'><a href='#n2406'>2406</a></p>
  2463. <p id='n2407' class='stm mis'><a href='#n2407'>2407</a></p>
  2464. <p id='n2408' class='stm mis'><a href='#n2408'>2408</a></p>
  2465. <p id='n2409' class='stm mis'><a href='#n2409'>2409</a></p>
  2466. <p id='n2410' class='stm mis'><a href='#n2410'>2410</a></p>
  2467. <p id='n2411' class='stm mis'><a href='#n2411'>2411</a></p>
  2468. <p id='n2412' class='stm mis'><a href='#n2412'>2412</a></p>
  2469. <p id='n2413' class='stm mis'><a href='#n2413'>2413</a></p>
  2470. <p id='n2414' class='stm mis'><a href='#n2414'>2414</a></p>
  2471. <p id='n2415' class='stm mis'><a href='#n2415'>2415</a></p>
  2472. <p id='n2416' class='stm mis'><a href='#n2416'>2416</a></p>
  2473. <p id='n2417' class='stm mis'><a href='#n2417'>2417</a></p>
  2474. <p id='n2418' class='stm mis'><a href='#n2418'>2418</a></p>
  2475. <p id='n2419' class='stm mis'><a href='#n2419'>2419</a></p>
  2476. <p id='n2420' class='stm mis'><a href='#n2420'>2420</a></p>
  2477. <p id='n2421' class='stm mis'><a href='#n2421'>2421</a></p>
  2478. <p id='n2422' class='stm mis'><a href='#n2422'>2422</a></p>
  2479. <p id='n2423' class='stm mis'><a href='#n2423'>2423</a></p>
  2480. <p id='n2424' class='stm mis'><a href='#n2424'>2424</a></p>
  2481. <p id='n2425' class='pln'><a href='#n2425'>2425</a></p>
  2482. <p id='n2426' class='stm mis'><a href='#n2426'>2426</a></p>
  2483. <p id='n2427' class='pln'><a href='#n2427'>2427</a></p>
  2484. <p id='n2428' class='stm mis'><a href='#n2428'>2428</a></p>
  2485. <p id='n2429' class='pln'><a href='#n2429'>2429</a></p>
  2486. <p id='n2430' class='pln'><a href='#n2430'>2430</a></p>
  2487. <p id='n2431' class='pln'><a href='#n2431'>2431</a></p>
  2488. <p id='n2432' class='pln'><a href='#n2432'>2432</a></p>
  2489. <p id='n2433' class='stm mis'><a href='#n2433'>2433</a></p>
  2490. <p id='n2434' class='stm mis'><a href='#n2434'>2434</a></p>
  2491. <p id='n2435' class='stm mis'><a href='#n2435'>2435</a></p>
  2492. <p id='n2436' class='stm mis'><a href='#n2436'>2436</a></p>
  2493. <p id='n2437' class='pln'><a href='#n2437'>2437</a></p>
  2494. <p id='n2438' class='stm mis'><a href='#n2438'>2438</a></p>
  2495. <p id='n2439' class='pln'><a href='#n2439'>2439</a></p>
  2496. <p id='n2440' class='stm mis'><a href='#n2440'>2440</a></p>
  2497. <p id='n2441' class='stm mis'><a href='#n2441'>2441</a></p>
  2498. <p id='n2442' class='stm mis'><a href='#n2442'>2442</a></p>
  2499. <p id='n2443' class='stm mis'><a href='#n2443'>2443</a></p>
  2500. <p id='n2444' class='stm mis'><a href='#n2444'>2444</a></p>
  2501. <p id='n2445' class='stm mis'><a href='#n2445'>2445</a></p>
  2502. <p id='n2446' class='stm mis'><a href='#n2446'>2446</a></p>
  2503. <p id='n2447' class='stm mis'><a href='#n2447'>2447</a></p>
  2504. <p id='n2448' class='pln'><a href='#n2448'>2448</a></p>
  2505. <p id='n2449' class='stm mis'><a href='#n2449'>2449</a></p>
  2506. <p id='n2450' class='stm mis'><a href='#n2450'>2450</a></p>
  2507. <p id='n2451' class='stm mis'><a href='#n2451'>2451</a></p>
  2508. <p id='n2452' class='stm mis'><a href='#n2452'>2452</a></p>
  2509. <p id='n2453' class='stm mis'><a href='#n2453'>2453</a></p>
  2510. <p id='n2454' class='stm mis'><a href='#n2454'>2454</a></p>
  2511. <p id='n2455' class='stm mis'><a href='#n2455'>2455</a></p>
  2512. <p id='n2456' class='stm mis'><a href='#n2456'>2456</a></p>
  2513. <p id='n2457' class='pln'><a href='#n2457'>2457</a></p>
  2514. <p id='n2458' class='stm mis'><a href='#n2458'>2458</a></p>
  2515. <p id='n2459' class='pln'><a href='#n2459'>2459</a></p>
  2516. <p id='n2460' class='stm mis'><a href='#n2460'>2460</a></p>
  2517. <p id='n2461' class='stm mis'><a href='#n2461'>2461</a></p>
  2518. <p id='n2462' class='stm mis'><a href='#n2462'>2462</a></p>
  2519. <p id='n2463' class='stm mis'><a href='#n2463'>2463</a></p>
  2520. <p id='n2464' class='stm mis'><a href='#n2464'>2464</a></p>
  2521. <p id='n2465' class='stm mis'><a href='#n2465'>2465</a></p>
  2522. <p id='n2466' class='stm mis'><a href='#n2466'>2466</a></p>
  2523. <p id='n2467' class='stm mis'><a href='#n2467'>2467</a></p>
  2524. <p id='n2468' class='pln'><a href='#n2468'>2468</a></p>
  2525. <p id='n2469' class='stm mis'><a href='#n2469'>2469</a></p>
  2526. <p id='n2470' class='pln'><a href='#n2470'>2470</a></p>
  2527. <p id='n2471' class='stm mis'><a href='#n2471'>2471</a></p>
  2528. <p id='n2472' class='stm mis'><a href='#n2472'>2472</a></p>
  2529. <p id='n2473' class='stm mis'><a href='#n2473'>2473</a></p>
  2530. <p id='n2474' class='stm mis'><a href='#n2474'>2474</a></p>
  2531. <p id='n2475' class='stm mis'><a href='#n2475'>2475</a></p>
  2532. <p id='n2476' class='stm mis'><a href='#n2476'>2476</a></p>
  2533. <p id='n2477' class='stm mis'><a href='#n2477'>2477</a></p>
  2534. <p id='n2478' class='pln'><a href='#n2478'>2478</a></p>
  2535. <p id='n2479' class='stm mis'><a href='#n2479'>2479</a></p>
  2536. <p id='n2480' class='stm mis'><a href='#n2480'>2480</a></p>
  2537. <p id='n2481' class='stm mis'><a href='#n2481'>2481</a></p>
  2538. <p id='n2482' class='stm mis'><a href='#n2482'>2482</a></p>
  2539. <p id='n2483' class='stm mis'><a href='#n2483'>2483</a></p>
  2540. <p id='n2484' class='pln'><a href='#n2484'>2484</a></p>
  2541. <p id='n2485' class='stm mis'><a href='#n2485'>2485</a></p>
  2542. <p id='n2486' class='stm mis'><a href='#n2486'>2486</a></p>
  2543. <p id='n2487' class='stm mis'><a href='#n2487'>2487</a></p>
  2544. <p id='n2488' class='pln'><a href='#n2488'>2488</a></p>
  2545. <p id='n2489' class='stm mis'><a href='#n2489'>2489</a></p>
  2546. <p id='n2490' class='stm mis'><a href='#n2490'>2490</a></p>
  2547. <p id='n2491' class='stm mis'><a href='#n2491'>2491</a></p>
  2548. <p id='n2492' class='pln'><a href='#n2492'>2492</a></p>
  2549. <p id='n2493' class='pln'><a href='#n2493'>2493</a></p>
  2550. <p id='n2494' class='stm mis'><a href='#n2494'>2494</a></p>
  2551. <p id='n2495' class='pln'><a href='#n2495'>2495</a></p>
  2552. <p id='n2496' class='pln'><a href='#n2496'>2496</a></p>
  2553. <p id='n2497' class='stm mis'><a href='#n2497'>2497</a></p>
  2554. <p id='n2498' class='pln'><a href='#n2498'>2498</a></p>
  2555. <p id='n2499' class='pln'><a href='#n2499'>2499</a></p>
  2556. <p id='n2500' class='stm mis'><a href='#n2500'>2500</a></p>
  2557. <p id='n2501' class='stm mis'><a href='#n2501'>2501</a></p>
  2558. <p id='n2502' class='stm mis'><a href='#n2502'>2502</a></p>
  2559. <p id='n2503' class='stm mis'><a href='#n2503'>2503</a></p>
  2560. <p id='n2504' class='pln'><a href='#n2504'>2504</a></p>
  2561. <p id='n2505' class='pln'><a href='#n2505'>2505</a></p>
  2562. <p id='n2506' class='pln'><a href='#n2506'>2506</a></p>
  2563. <p id='n2507' class='stm mis'><a href='#n2507'>2507</a></p>
  2564. <p id='n2508' class='stm mis'><a href='#n2508'>2508</a></p>
  2565. <p id='n2509' class='pln'><a href='#n2509'>2509</a></p>
  2566. <p id='n2510' class='stm mis'><a href='#n2510'>2510</a></p>
  2567. <p id='n2511' class='stm mis'><a href='#n2511'>2511</a></p>
  2568. <p id='n2512' class='pln'><a href='#n2512'>2512</a></p>
  2569. <p id='n2513' class='stm mis'><a href='#n2513'>2513</a></p>
  2570. <p id='n2514' class='stm mis'><a href='#n2514'>2514</a></p>
  2571. <p id='n2515' class='pln'><a href='#n2515'>2515</a></p>
  2572. <p id='n2516' class='pln'><a href='#n2516'>2516</a></p>
  2573. <p id='n2517' class='pln'><a href='#n2517'>2517</a></p>
  2574. <p id='n2518' class='pln'><a href='#n2518'>2518</a></p>
  2575. <p id='n2519' class='pln'><a href='#n2519'>2519</a></p>
  2576. <p id='n2520' class='pln'><a href='#n2520'>2520</a></p>
  2577. <p id='n2521' class='pln'><a href='#n2521'>2521</a></p>
  2578. <p id='n2522' class='pln'><a href='#n2522'>2522</a></p>
  2579. <p id='n2523' class='pln'><a href='#n2523'>2523</a></p>
  2580. <p id='n2524' class='pln'><a href='#n2524'>2524</a></p>
  2581. <p id='n2525' class='pln'><a href='#n2525'>2525</a></p>
  2582. <p id='n2526' class='pln'><a href='#n2526'>2526</a></p>
  2583. <p id='n2527' class='stm mis'><a href='#n2527'>2527</a></p>
  2584. <p id='n2528' class='pln'><a href='#n2528'>2528</a></p>
  2585. <p id='n2529' class='stm mis'><a href='#n2529'>2529</a></p>
  2586. <p id='n2530' class='pln'><a href='#n2530'>2530</a></p>
  2587. <p id='n2531' class='pln'><a href='#n2531'>2531</a></p>
  2588. <p id='n2532' class='stm run hide_run'><a href='#n2532'>2532</a></p>
  2589. <p id='n2533' class='pln'><a href='#n2533'>2533</a></p>
  2590. <p id='n2534' class='pln'><a href='#n2534'>2534</a></p>
  2591. <p id='n2535' class='stm run hide_run'><a href='#n2535'>2535</a></p>
  2592. <p id='n2536' class='stm run hide_run'><a href='#n2536'>2536</a></p>
  2593. <p id='n2537' class='pln'><a href='#n2537'>2537</a></p>
  2594. <p id='n2538' class='stm run hide_run'><a href='#n2538'>2538</a></p>
  2595. <p id='n2539' class='stm mis'><a href='#n2539'>2539</a></p>
  2596. <p id='n2540' class='pln'><a href='#n2540'>2540</a></p>
  2597. <p id='n2541' class='stm run hide_run'><a href='#n2541'>2541</a></p>
  2598. <p id='n2542' class='stm mis'><a href='#n2542'>2542</a></p>
  2599. <p id='n2543' class='pln'><a href='#n2543'>2543</a></p>
  2600. <p id='n2544' class='stm run hide_run'><a href='#n2544'>2544</a></p>
  2601. <p id='n2545' class='stm mis'><a href='#n2545'>2545</a></p>
  2602. <p id='n2546' class='stm mis'><a href='#n2546'>2546</a></p>
  2603. <p id='n2547' class='stm mis'><a href='#n2547'>2547</a></p>
  2604. <p id='n2548' class='stm mis'><a href='#n2548'>2548</a></p>
  2605. <p id='n2549' class='stm mis'><a href='#n2549'>2549</a></p>
  2606. <p id='n2550' class='stm mis'><a href='#n2550'>2550</a></p>
  2607. <p id='n2551' class='pln'><a href='#n2551'>2551</a></p>
  2608. <p id='n2552' class='stm mis'><a href='#n2552'>2552</a></p>
  2609. <p id='n2553' class='stm mis'><a href='#n2553'>2553</a></p>
  2610. <p id='n2554' class='stm mis'><a href='#n2554'>2554</a></p>
  2611. <p id='n2555' class='stm mis'><a href='#n2555'>2555</a></p>
  2612. <p id='n2556' class='stm mis'><a href='#n2556'>2556</a></p>
  2613. <p id='n2557' class='stm mis'><a href='#n2557'>2557</a></p>
  2614. <p id='n2558' class='stm mis'><a href='#n2558'>2558</a></p>
  2615. <p id='n2559' class='stm mis'><a href='#n2559'>2559</a></p>
  2616. <p id='n2560' class='stm mis'><a href='#n2560'>2560</a></p>
  2617. <p id='n2561' class='pln'><a href='#n2561'>2561</a></p>
  2618. <p id='n2562' class='stm mis'><a href='#n2562'>2562</a></p>
  2619. <p id='n2563' class='stm mis'><a href='#n2563'>2563</a></p>
  2620. <p id='n2564' class='stm mis'><a href='#n2564'>2564</a></p>
  2621. <p id='n2565' class='stm mis'><a href='#n2565'>2565</a></p>
  2622. <p id='n2566' class='stm mis'><a href='#n2566'>2566</a></p>
  2623. <p id='n2567' class='stm mis'><a href='#n2567'>2567</a></p>
  2624. <p id='n2568' class='stm mis'><a href='#n2568'>2568</a></p>
  2625. <p id='n2569' class='stm mis'><a href='#n2569'>2569</a></p>
  2626. <p id='n2570' class='pln'><a href='#n2570'>2570</a></p>
  2627. <p id='n2571' class='stm mis'><a href='#n2571'>2571</a></p>
  2628. <p id='n2572' class='stm mis'><a href='#n2572'>2572</a></p>
  2629. <p id='n2573' class='stm mis'><a href='#n2573'>2573</a></p>
  2630. <p id='n2574' class='stm mis'><a href='#n2574'>2574</a></p>
  2631. <p id='n2575' class='stm mis'><a href='#n2575'>2575</a></p>
  2632. <p id='n2576' class='stm mis'><a href='#n2576'>2576</a></p>
  2633. <p id='n2577' class='stm mis'><a href='#n2577'>2577</a></p>
  2634. <p id='n2578' class='stm mis'><a href='#n2578'>2578</a></p>
  2635. <p id='n2579' class='pln'><a href='#n2579'>2579</a></p>
  2636. <p id='n2580' class='pln'><a href='#n2580'>2580</a></p>
  2637. <p id='n2581' class='stm mis'><a href='#n2581'>2581</a></p>
  2638. <p id='n2582' class='pln'><a href='#n2582'>2582</a></p>
  2639. <p id='n2583' class='stm mis'><a href='#n2583'>2583</a></p>
  2640. <p id='n2584' class='stm mis'><a href='#n2584'>2584</a></p>
  2641. <p id='n2585' class='stm mis'><a href='#n2585'>2585</a></p>
  2642. <p id='n2586' class='stm mis'><a href='#n2586'>2586</a></p>
  2643. <p id='n2587' class='stm mis'><a href='#n2587'>2587</a></p>
  2644. <p id='n2588' class='pln'><a href='#n2588'>2588</a></p>
  2645. <p id='n2589' class='stm mis'><a href='#n2589'>2589</a></p>
  2646. <p id='n2590' class='stm mis'><a href='#n2590'>2590</a></p>
  2647. <p id='n2591' class='pln'><a href='#n2591'>2591</a></p>
  2648. <p id='n2592' class='stm mis'><a href='#n2592'>2592</a></p>
  2649. <p id='n2593' class='pln'><a href='#n2593'>2593</a></p>
  2650. <p id='n2594' class='pln'><a href='#n2594'>2594</a></p>
  2651. <p id='n2595' class='pln'><a href='#n2595'>2595</a></p>
  2652. <p id='n2596' class='pln'><a href='#n2596'>2596</a></p>
  2653. <p id='n2597' class='pln'><a href='#n2597'>2597</a></p>
  2654. <p id='n2598' class='pln'><a href='#n2598'>2598</a></p>
  2655. <p id='n2599' class='pln'><a href='#n2599'>2599</a></p>
  2656. <p id='n2600' class='pln'><a href='#n2600'>2600</a></p>
  2657. <p id='n2601' class='pln'><a href='#n2601'>2601</a></p>
  2658. <p id='n2602' class='pln'><a href='#n2602'>2602</a></p>
  2659. <p id='n2603' class='pln'><a href='#n2603'>2603</a></p>
  2660. <p id='n2604' class='stm mis'><a href='#n2604'>2604</a></p>
  2661. <p id='n2605' class='pln'><a href='#n2605'>2605</a></p>
  2662. <p id='n2606' class='pln'><a href='#n2606'>2606</a></p>
  2663. <p id='n2607' class='stm run hide_run'><a href='#n2607'>2607</a></p>
  2664. <p id='n2608' class='pln'><a href='#n2608'>2608</a></p>
  2665. <p id='n2609' class='pln'><a href='#n2609'>2609</a></p>
  2666. <p id='n2610' class='stm run hide_run'><a href='#n2610'>2610</a></p>
  2667. <p id='n2611' class='stm run hide_run'><a href='#n2611'>2611</a></p>
  2668. <p id='n2612' class='stm run hide_run'><a href='#n2612'>2612</a></p>
  2669. <p id='n2613' class='pln'><a href='#n2613'>2613</a></p>
  2670. <p id='n2614' class='stm run hide_run'><a href='#n2614'>2614</a></p>
  2671. <p id='n2615' class='pln'><a href='#n2615'>2615</a></p>
  2672. <p id='n2616' class='stm mis'><a href='#n2616'>2616</a></p>
  2673. <p id='n2617' class='pln'><a href='#n2617'>2617</a></p>
  2674. <p id='n2618' class='stm run hide_run'><a href='#n2618'>2618</a></p>
  2675. <p id='n2619' class='pln'><a href='#n2619'>2619</a></p>
  2676. <p id='n2620' class='stm mis'><a href='#n2620'>2620</a></p>
  2677. <p id='n2621' class='pln'><a href='#n2621'>2621</a></p>
  2678. <p id='n2622' class='stm run hide_run'><a href='#n2622'>2622</a></p>
  2679. <p id='n2623' class='stm mis'><a href='#n2623'>2623</a></p>
  2680. <p id='n2624' class='stm mis'><a href='#n2624'>2624</a></p>
  2681. <p id='n2625' class='stm mis'><a href='#n2625'>2625</a></p>
  2682. <p id='n2626' class='stm mis'><a href='#n2626'>2626</a></p>
  2683. <p id='n2627' class='stm mis'><a href='#n2627'>2627</a></p>
  2684. <p id='n2628' class='pln'><a href='#n2628'>2628</a></p>
  2685. <p id='n2629' class='stm mis'><a href='#n2629'>2629</a></p>
  2686. <p id='n2630' class='pln'><a href='#n2630'>2630</a></p>
  2687. <p id='n2631' class='pln'><a href='#n2631'>2631</a></p>
  2688. <p id='n2632' class='pln'><a href='#n2632'>2632</a></p>
  2689. <p id='n2633' class='pln'><a href='#n2633'>2633</a></p>
  2690. <p id='n2634' class='pln'><a href='#n2634'>2634</a></p>
  2691. <p id='n2635' class='stm mis'><a href='#n2635'>2635</a></p>
  2692. <p id='n2636' class='stm mis'><a href='#n2636'>2636</a></p>
  2693. <p id='n2637' class='stm mis'><a href='#n2637'>2637</a></p>
  2694. <p id='n2638' class='stm mis'><a href='#n2638'>2638</a></p>
  2695. <p id='n2639' class='stm mis'><a href='#n2639'>2639</a></p>
  2696. <p id='n2640' class='stm mis'><a href='#n2640'>2640</a></p>
  2697. <p id='n2641' class='stm mis'><a href='#n2641'>2641</a></p>
  2698. <p id='n2642' class='pln'><a href='#n2642'>2642</a></p>
  2699. <p id='n2643' class='stm mis'><a href='#n2643'>2643</a></p>
  2700. <p id='n2644' class='stm mis'><a href='#n2644'>2644</a></p>
  2701. <p id='n2645' class='stm mis'><a href='#n2645'>2645</a></p>
  2702. <p id='n2646' class='stm mis'><a href='#n2646'>2646</a></p>
  2703. <p id='n2647' class='stm mis'><a href='#n2647'>2647</a></p>
  2704. <p id='n2648' class='stm mis'><a href='#n2648'>2648</a></p>
  2705. <p id='n2649' class='stm mis'><a href='#n2649'>2649</a></p>
  2706. <p id='n2650' class='stm mis'><a href='#n2650'>2650</a></p>
  2707. <p id='n2651' class='stm mis'><a href='#n2651'>2651</a></p>
  2708. <p id='n2652' class='stm mis'><a href='#n2652'>2652</a></p>
  2709. <p id='n2653' class='pln'><a href='#n2653'>2653</a></p>
  2710. <p id='n2654' class='stm mis'><a href='#n2654'>2654</a></p>
  2711. <p id='n2655' class='stm mis'><a href='#n2655'>2655</a></p>
  2712. <p id='n2656' class='stm mis'><a href='#n2656'>2656</a></p>
  2713. <p id='n2657' class='stm mis'><a href='#n2657'>2657</a></p>
  2714. <p id='n2658' class='stm mis'><a href='#n2658'>2658</a></p>
  2715. <p id='n2659' class='stm mis'><a href='#n2659'>2659</a></p>
  2716. <p id='n2660' class='stm mis'><a href='#n2660'>2660</a></p>
  2717. <p id='n2661' class='pln'><a href='#n2661'>2661</a></p>
  2718. <p id='n2662' class='stm mis'><a href='#n2662'>2662</a></p>
  2719. <p id='n2663' class='stm mis'><a href='#n2663'>2663</a></p>
  2720. <p id='n2664' class='stm mis'><a href='#n2664'>2664</a></p>
  2721. <p id='n2665' class='stm mis'><a href='#n2665'>2665</a></p>
  2722. <p id='n2666' class='stm mis'><a href='#n2666'>2666</a></p>
  2723. <p id='n2667' class='stm mis'><a href='#n2667'>2667</a></p>
  2724. <p id='n2668' class='stm mis'><a href='#n2668'>2668</a></p>
  2725. <p id='n2669' class='stm mis'><a href='#n2669'>2669</a></p>
  2726. <p id='n2670' class='pln'><a href='#n2670'>2670</a></p>
  2727. <p id='n2671' class='stm mis'><a href='#n2671'>2671</a></p>
  2728. <p id='n2672' class='stm mis'><a href='#n2672'>2672</a></p>
  2729. <p id='n2673' class='pln'><a href='#n2673'>2673</a></p>
  2730. <p id='n2674' class='stm mis'><a href='#n2674'>2674</a></p>
  2731. <p id='n2675' class='stm mis'><a href='#n2675'>2675</a></p>
  2732. <p id='n2676' class='stm mis'><a href='#n2676'>2676</a></p>
  2733. <p id='n2677' class='pln'><a href='#n2677'>2677</a></p>
  2734. <p id='n2678' class='pln'><a href='#n2678'>2678</a></p>
  2735. <p id='n2679' class='stm run hide_run'><a href='#n2679'>2679</a></p>
  2736. <p id='n2680' class='pln'><a href='#n2680'>2680</a></p>
  2737. <p id='n2681' class='pln'><a href='#n2681'>2681</a></p>
  2738. <p id='n2682' class='stm run hide_run'><a href='#n2682'>2682</a></p>
  2739. <p id='n2683' class='stm run hide_run'><a href='#n2683'>2683</a></p>
  2740. <p id='n2684' class='pln'><a href='#n2684'>2684</a></p>
  2741. <p id='n2685' class='stm run hide_run'><a href='#n2685'>2685</a></p>
  2742. <p id='n2686' class='pln'><a href='#n2686'>2686</a></p>
  2743. <p id='n2687' class='stm run hide_run'><a href='#n2687'>2687</a></p>
  2744. <p id='n2688' class='pln'><a href='#n2688'>2688</a></p>
  2745. <p id='n2689' class='stm run hide_run'><a href='#n2689'>2689</a></p>
  2746. <p id='n2690' class='stm run hide_run'><a href='#n2690'>2690</a></p>
  2747. <p id='n2691' class='stm run hide_run'><a href='#n2691'>2691</a></p>
  2748. <p id='n2692' class='stm mis'><a href='#n2692'>2692</a></p>
  2749. <p id='n2693' class='stm mis'><a href='#n2693'>2693</a></p>
  2750. <p id='n2694' class='stm run hide_run'><a href='#n2694'>2694</a></p>
  2751. <p id='n2695' class='pln'><a href='#n2695'>2695</a></p>
  2752. <p id='n2696' class='stm run hide_run'><a href='#n2696'>2696</a></p>
  2753. <p id='n2697' class='pln'><a href='#n2697'>2697</a></p>
  2754. <p id='n2698' class='stm run hide_run'><a href='#n2698'>2698</a></p>
  2755. <p id='n2699' class='pln'><a href='#n2699'>2699</a></p>
  2756. <p id='n2700' class='pln'><a href='#n2700'>2700</a></p>
  2757. <p id='n2701' class='pln'><a href='#n2701'>2701</a></p>
  2758. <p id='n2702' class='stm run hide_run'><a href='#n2702'>2702</a></p>
  2759. <p id='n2703' class='stm run hide_run'><a href='#n2703'>2703</a></p>
  2760. <p id='n2704' class='stm mis'><a href='#n2704'>2704</a></p>
  2761. <p id='n2705' class='stm mis'><a href='#n2705'>2705</a></p>
  2762. <p id='n2706' class='stm run hide_run'><a href='#n2706'>2706</a></p>
  2763. <p id='n2707' class='pln'><a href='#n2707'>2707</a></p>
  2764. <p id='n2708' class='pln'><a href='#n2708'>2708</a></p>
  2765. <p id='n2709' class='pln'><a href='#n2709'>2709</a></p>
  2766. <p id='n2710' class='stm run hide_run'><a href='#n2710'>2710</a></p>
  2767. <p id='n2711' class='stm run hide_run'><a href='#n2711'>2711</a></p>
  2768. <p id='n2712' class='stm mis'><a href='#n2712'>2712</a></p>
  2769. <p id='n2713' class='stm mis'><a href='#n2713'>2713</a></p>
  2770. <p id='n2714' class='stm run hide_run'><a href='#n2714'>2714</a></p>
  2771. <p id='n2715' class='pln'><a href='#n2715'>2715</a></p>
  2772. <p id='n2716' class='pln'><a href='#n2716'>2716</a></p>
  2773. <p id='n2717' class='pln'><a href='#n2717'>2717</a></p>
  2774. <p id='n2718' class='stm run hide_run'><a href='#n2718'>2718</a></p>
  2775. <p id='n2719' class='stm run hide_run'><a href='#n2719'>2719</a></p>
  2776. <p id='n2720' class='stm mis'><a href='#n2720'>2720</a></p>
  2777. <p id='n2721' class='stm mis'><a href='#n2721'>2721</a></p>
  2778. <p id='n2722' class='stm run hide_run'><a href='#n2722'>2722</a></p>
  2779. <p id='n2723' class='pln'><a href='#n2723'>2723</a></p>
  2780. <p id='n2724' class='stm run hide_run'><a href='#n2724'>2724</a></p>
  2781. <p id='n2725' class='pln'><a href='#n2725'>2725</a></p>
  2782. <p id='n2726' class='pln'><a href='#n2726'>2726</a></p>
  2783. <p id='n2727' class='pln'><a href='#n2727'>2727</a></p>
  2784. <p id='n2728' class='pln'><a href='#n2728'>2728</a></p>
  2785. <p id='n2729' class='pln'><a href='#n2729'>2729</a></p>
  2786. <p id='n2730' class='pln'><a href='#n2730'>2730</a></p>
  2787. <p id='n2731' class='pln'><a href='#n2731'>2731</a></p>
  2788. <p id='n2732' class='pln'><a href='#n2732'>2732</a></p>
  2789. <p id='n2733' class='pln'><a href='#n2733'>2733</a></p>
  2790. <p id='n2734' class='pln'><a href='#n2734'>2734</a></p>
  2791. <p id='n2735' class='stm run hide_run'><a href='#n2735'>2735</a></p>
  2792. <p id='n2736' class='pln'><a href='#n2736'>2736</a></p>
  2793. <p id='n2737' class='pln'><a href='#n2737'>2737</a></p>
  2794. <p id='n2738' class='stm run hide_run'><a href='#n2738'>2738</a></p>
  2795. <p id='n2739' class='pln'><a href='#n2739'>2739</a></p>
  2796. <p id='n2740' class='pln'><a href='#n2740'>2740</a></p>
  2797. <p id='n2741' class='pln'><a href='#n2741'>2741</a></p>
  2798. <p id='n2742' class='pln'><a href='#n2742'>2742</a></p>
  2799. <p id='n2743' class='pln'><a href='#n2743'>2743</a></p>
  2800. <p id='n2744' class='pln'><a href='#n2744'>2744</a></p>
  2801. <p id='n2745' class='pln'><a href='#n2745'>2745</a></p>
  2802. <p id='n2746' class='pln'><a href='#n2746'>2746</a></p>
  2803. <p id='n2747' class='stm run hide_run'><a href='#n2747'>2747</a></p>
  2804. <p id='n2748' class='stm run hide_run'><a href='#n2748'>2748</a></p>
  2805. <p id='n2749' class='pln'><a href='#n2749'>2749</a></p>
  2806. <p id='n2750' class='stm run hide_run'><a href='#n2750'>2750</a></p>
  2807. <p id='n2751' class='stm run hide_run'><a href='#n2751'>2751</a></p>
  2808. <p id='n2752' class='pln'><a href='#n2752'>2752</a></p>
  2809. <p id='n2753' class='stm run hide_run'><a href='#n2753'>2753</a></p>
  2810. <p id='n2754' class='pln'><a href='#n2754'>2754</a></p>
  2811. <p id='n2755' class='stm run hide_run'><a href='#n2755'>2755</a></p>
  2812. <p id='n2756' class='pln'><a href='#n2756'>2756</a></p>
  2813. <p id='n2757' class='stm run hide_run'><a href='#n2757'>2757</a></p>
  2814. <p id='n2758' class='pln'><a href='#n2758'>2758</a></p>
  2815. <p id='n2759' class='stm run hide_run'><a href='#n2759'>2759</a></p>
  2816. <p id='n2760' class='pln'><a href='#n2760'>2760</a></p>
  2817. <p id='n2761' class='stm run hide_run'><a href='#n2761'>2761</a></p>
  2818. <p id='n2762' class='stm run hide_run'><a href='#n2762'>2762</a></p>
  2819. <p id='n2763' class='stm run hide_run'><a href='#n2763'>2763</a></p>
  2820. <p id='n2764' class='stm mis'><a href='#n2764'>2764</a></p>
  2821. <p id='n2765' class='stm mis'><a href='#n2765'>2765</a></p>
  2822. <p id='n2766' class='pln'><a href='#n2766'>2766</a></p>
  2823. <p id='n2767' class='pln'><a href='#n2767'>2767</a></p>
  2824. <p id='n2768' class='stm run hide_run'><a href='#n2768'>2768</a></p>
  2825. <p id='n2769' class='pln'><a href='#n2769'>2769</a></p>
  2826. <p id='n2770' class='stm run hide_run'><a href='#n2770'>2770</a></p>
  2827. <p id='n2771' class='stm run hide_run'><a href='#n2771'>2771</a></p>
  2828. <p id='n2772' class='pln'><a href='#n2772'>2772</a></p>
  2829. <p id='n2773' class='stm run hide_run'><a href='#n2773'>2773</a></p>
  2830. <p id='n2774' class='pln'><a href='#n2774'>2774</a></p>
  2831. <p id='n2775' class='stm run hide_run'><a href='#n2775'>2775</a></p>
  2832. <p id='n2776' class='stm run hide_run'><a href='#n2776'>2776</a></p>
  2833. <p id='n2777' class='stm run hide_run'><a href='#n2777'>2777</a></p>
  2834. <p id='n2778' class='stm run hide_run'><a href='#n2778'>2778</a></p>
  2835. <p id='n2779' class='stm run hide_run'><a href='#n2779'>2779</a></p>
  2836. <p id='n2780' class='stm run hide_run'><a href='#n2780'>2780</a></p>
  2837. <p id='n2781' class='stm mis'><a href='#n2781'>2781</a></p>
  2838. <p id='n2782' class='stm mis'><a href='#n2782'>2782</a></p>
  2839. <p id='n2783' class='stm mis'><a href='#n2783'>2783</a></p>
  2840. <p id='n2784' class='pln'><a href='#n2784'>2784</a></p>
  2841. <p id='n2785' class='stm run hide_run'><a href='#n2785'>2785</a></p>
  2842. <p id='n2786' class='stm run hide_run'><a href='#n2786'>2786</a></p>
  2843. <p id='n2787' class='stm run hide_run'><a href='#n2787'>2787</a></p>
  2844. <p id='n2788' class='pln'><a href='#n2788'>2788</a></p>
  2845. <p id='n2789' class='stm run hide_run'><a href='#n2789'>2789</a></p>
  2846. <p id='n2790' class='stm run hide_run'><a href='#n2790'>2790</a></p>
  2847. <p id='n2791' class='stm run hide_run'><a href='#n2791'>2791</a></p>
  2848. <p id='n2792' class='stm run hide_run'><a href='#n2792'>2792</a></p>
  2849. <p id='n2793' class='stm run hide_run'><a href='#n2793'>2793</a></p>
  2850. <p id='n2794' class='stm mis'><a href='#n2794'>2794</a></p>
  2851. <p id='n2795' class='stm mis'><a href='#n2795'>2795</a></p>
  2852. <p id='n2796' class='stm mis'><a href='#n2796'>2796</a></p>
  2853. <p id='n2797' class='pln'><a href='#n2797'>2797</a></p>
  2854. <p id='n2798' class='stm run hide_run'><a href='#n2798'>2798</a></p>
  2855. <p id='n2799' class='stm run hide_run'><a href='#n2799'>2799</a></p>
  2856. <p id='n2800' class='pln'><a href='#n2800'>2800</a></p>
  2857. <p id='n2801' class='stm run hide_run'><a href='#n2801'>2801</a></p>
  2858. <p id='n2802' class='pln'><a href='#n2802'>2802</a></p>
  2859. <p id='n2803' class='pln'><a href='#n2803'>2803</a></p>
  2860. <p id='n2804' class='pln'><a href='#n2804'>2804</a></p>
  2861. <p id='n2805' class='pln'><a href='#n2805'>2805</a></p>
  2862. <p id='n2806' class='pln'><a href='#n2806'>2806</a></p>
  2863. <p id='n2807' class='pln'><a href='#n2807'>2807</a></p>
  2864. <p id='n2808' class='pln'><a href='#n2808'>2808</a></p>
  2865. <p id='n2809' class='pln'><a href='#n2809'>2809</a></p>
  2866. <p id='n2810' class='pln'><a href='#n2810'>2810</a></p>
  2867. <p id='n2811' class='pln'><a href='#n2811'>2811</a></p>
  2868. <p id='n2812' class='stm run hide_run'><a href='#n2812'>2812</a></p>
  2869. <p id='n2813' class='pln'><a href='#n2813'>2813</a></p>
  2870. <p id='n2814' class='stm run hide_run'><a href='#n2814'>2814</a></p>
  2871. <p id='n2815' class='pln'><a href='#n2815'>2815</a></p>
  2872. <p id='n2816' class='stm run hide_run'><a href='#n2816'>2816</a></p>
  2873. <p id='n2817' class='pln'><a href='#n2817'>2817</a></p>
  2874. <p id='n2818' class='stm run hide_run'><a href='#n2818'>2818</a></p>
  2875. <p id='n2819' class='pln'><a href='#n2819'>2819</a></p>
  2876. <p id='n2820' class='stm run hide_run'><a href='#n2820'>2820</a></p>
  2877. <p id='n2821' class='stm run hide_run'><a href='#n2821'>2821</a></p>
  2878. <p id='n2822' class='stm run hide_run'><a href='#n2822'>2822</a></p>
  2879. <p id='n2823' class='stm mis'><a href='#n2823'>2823</a></p>
  2880. <p id='n2824' class='stm mis'><a href='#n2824'>2824</a></p>
  2881. <p id='n2825' class='pln'><a href='#n2825'>2825</a></p>
  2882. <p id='n2826' class='stm run hide_run'><a href='#n2826'>2826</a></p>
  2883. <p id='n2827' class='stm run hide_run'><a href='#n2827'>2827</a></p>
  2884. <p id='n2828' class='pln'><a href='#n2828'>2828</a></p>
  2885. <p id='n2829' class='pln'><a href='#n2829'>2829</a></p>
  2886. <p id='n2830' class='stm run hide_run'><a href='#n2830'>2830</a></p>
  2887. <p id='n2831' class='stm run hide_run'><a href='#n2831'>2831</a></p>
  2888. <p id='n2832' class='stm mis'><a href='#n2832'>2832</a></p>
  2889. <p id='n2833' class='stm mis'><a href='#n2833'>2833</a></p>
  2890. <p id='n2834' class='stm run hide_run'><a href='#n2834'>2834</a></p>
  2891. <p id='n2835' class='stm run hide_run'><a href='#n2835'>2835</a></p>
  2892. <p id='n2836' class='pln'><a href='#n2836'>2836</a></p>
  2893. <p id='n2837' class='pln'><a href='#n2837'>2837</a></p>
  2894. <p id='n2838' class='stm run hide_run'><a href='#n2838'>2838</a></p>
  2895. <p id='n2839' class='stm run hide_run'><a href='#n2839'>2839</a></p>
  2896. <p id='n2840' class='stm mis'><a href='#n2840'>2840</a></p>
  2897. <p id='n2841' class='stm mis'><a href='#n2841'>2841</a></p>
  2898. <p id='n2842' class='stm run hide_run'><a href='#n2842'>2842</a></p>
  2899. <p id='n2843' class='pln'><a href='#n2843'>2843</a></p>
  2900. <p id='n2844' class='pln'><a href='#n2844'>2844</a></p>
  2901. <p id='n2845' class='stm run hide_run'><a href='#n2845'>2845</a></p>
  2902. <p id='n2846' class='stm run hide_run'><a href='#n2846'>2846</a></p>
  2903. <p id='n2847' class='stm run hide_run'><a href='#n2847'>2847</a></p>
  2904. <p id='n2848' class='stm run hide_run'><a href='#n2848'>2848</a></p>
  2905. <p id='n2849' class='pln'><a href='#n2849'>2849</a></p>
  2906. <p id='n2850' class='stm run hide_run'><a href='#n2850'>2850</a></p>
  2907. <p id='n2851' class='stm run hide_run'><a href='#n2851'>2851</a></p>
  2908. <p id='n2852' class='pln'><a href='#n2852'>2852</a></p>
  2909. <p id='n2853' class='stm run hide_run'><a href='#n2853'>2853</a></p>
  2910. <p id='n2854' class='pln'><a href='#n2854'>2854</a></p>
  2911. <p id='n2855' class='pln'><a href='#n2855'>2855</a></p>
  2912. <p id='n2856' class='pln'><a href='#n2856'>2856</a></p>
  2913. <p id='n2857' class='pln'><a href='#n2857'>2857</a></p>
  2914. <p id='n2858' class='pln'><a href='#n2858'>2858</a></p>
  2915. <p id='n2859' class='pln'><a href='#n2859'>2859</a></p>
  2916. <p id='n2860' class='pln'><a href='#n2860'>2860</a></p>
  2917. <p id='n2861' class='pln'><a href='#n2861'>2861</a></p>
  2918. <p id='n2862' class='pln'><a href='#n2862'>2862</a></p>
  2919. <p id='n2863' class='pln'><a href='#n2863'>2863</a></p>
  2920. <p id='n2864' class='stm run hide_run'><a href='#n2864'>2864</a></p>
  2921. <p id='n2865' class='pln'><a href='#n2865'>2865</a></p>
  2922. <p id='n2866' class='stm run hide_run'><a href='#n2866'>2866</a></p>
  2923. <p id='n2867' class='pln'><a href='#n2867'>2867</a></p>
  2924. <p id='n2868' class='pln'><a href='#n2868'>2868</a></p>
  2925. <p id='n2869' class='stm run hide_run'><a href='#n2869'>2869</a></p>
  2926. <p id='n2870' class='stm run hide_run'><a href='#n2870'>2870</a></p>
  2927. <p id='n2871' class='stm run hide_run'><a href='#n2871'>2871</a></p>
  2928. <p id='n2872' class='pln'><a href='#n2872'>2872</a></p>
  2929. <p id='n2873' class='stm run hide_run'><a href='#n2873'>2873</a></p>
  2930. <p id='n2874' class='stm mis'><a href='#n2874'>2874</a></p>
  2931. <p id='n2875' class='pln'><a href='#n2875'>2875</a></p>
  2932. <p id='n2876' class='stm run hide_run'><a href='#n2876'>2876</a></p>
  2933. <p id='n2877' class='pln'><a href='#n2877'>2877</a></p>
  2934. <p id='n2878' class='stm mis'><a href='#n2878'>2878</a></p>
  2935. <p id='n2879' class='pln'><a href='#n2879'>2879</a></p>
  2936. <p id='n2880' class='stm run hide_run'><a href='#n2880'>2880</a></p>
  2937. <p id='n2881' class='pln'><a href='#n2881'>2881</a></p>
  2938. <p id='n2882' class='stm mis'><a href='#n2882'>2882</a></p>
  2939. <p id='n2883' class='pln'><a href='#n2883'>2883</a></p>
  2940. <p id='n2884' class='stm run hide_run'><a href='#n2884'>2884</a></p>
  2941. <p id='n2885' class='pln'><a href='#n2885'>2885</a></p>
  2942. <p id='n2886' class='stm mis'><a href='#n2886'>2886</a></p>
  2943. <p id='n2887' class='stm mis'><a href='#n2887'>2887</a></p>
  2944. <p id='n2888' class='stm mis'><a href='#n2888'>2888</a></p>
  2945. <p id='n2889' class='stm mis'><a href='#n2889'>2889</a></p>
  2946. <p id='n2890' class='stm mis'><a href='#n2890'>2890</a></p>
  2947. <p id='n2891' class='pln'><a href='#n2891'>2891</a></p>
  2948. <p id='n2892' class='stm mis'><a href='#n2892'>2892</a></p>
  2949. <p id='n2893' class='stm mis'><a href='#n2893'>2893</a></p>
  2950. <p id='n2894' class='stm mis'><a href='#n2894'>2894</a></p>
  2951. <p id='n2895' class='stm mis'><a href='#n2895'>2895</a></p>
  2952. <p id='n2896' class='pln'><a href='#n2896'>2896</a></p>
  2953. <p id='n2897' class='stm run hide_run'><a href='#n2897'>2897</a></p>
  2954. <p id='n2898' class='pln'><a href='#n2898'>2898</a></p>
  2955. <p id='n2899' class='stm mis'><a href='#n2899'>2899</a></p>
  2956. <p id='n2900' class='stm mis'><a href='#n2900'>2900</a></p>
  2957. <p id='n2901' class='stm mis'><a href='#n2901'>2901</a></p>
  2958. <p id='n2902' class='stm mis'><a href='#n2902'>2902</a></p>
  2959. <p id='n2903' class='stm mis'><a href='#n2903'>2903</a></p>
  2960. <p id='n2904' class='stm mis'><a href='#n2904'>2904</a></p>
  2961. <p id='n2905' class='pln'><a href='#n2905'>2905</a></p>
  2962. <p id='n2906' class='stm mis'><a href='#n2906'>2906</a></p>
  2963. <p id='n2907' class='pln'><a href='#n2907'>2907</a></p>
  2964. <p id='n2908' class='stm run hide_run'><a href='#n2908'>2908</a></p>
  2965. <p id='n2909' class='stm mis'><a href='#n2909'>2909</a></p>
  2966. <p id='n2910' class='stm mis'><a href='#n2910'>2910</a></p>
  2967. <p id='n2911' class='stm mis'><a href='#n2911'>2911</a></p>
  2968. <p id='n2912' class='stm mis'><a href='#n2912'>2912</a></p>
  2969. <p id='n2913' class='stm mis'><a href='#n2913'>2913</a></p>
  2970. <p id='n2914' class='stm mis'><a href='#n2914'>2914</a></p>
  2971. <p id='n2915' class='stm mis'><a href='#n2915'>2915</a></p>
  2972. <p id='n2916' class='stm mis'><a href='#n2916'>2916</a></p>
  2973. <p id='n2917' class='stm mis'><a href='#n2917'>2917</a></p>
  2974. <p id='n2918' class='stm mis'><a href='#n2918'>2918</a></p>
  2975. <p id='n2919' class='pln'><a href='#n2919'>2919</a></p>
  2976. <p id='n2920' class='stm run hide_run'><a href='#n2920'>2920</a></p>
  2977. <p id='n2921' class='stm mis'><a href='#n2921'>2921</a></p>
  2978. <p id='n2922' class='stm mis'><a href='#n2922'>2922</a></p>
  2979. <p id='n2923' class='stm mis'><a href='#n2923'>2923</a></p>
  2980. <p id='n2924' class='stm mis'><a href='#n2924'>2924</a></p>
  2981. <p id='n2925' class='pln'><a href='#n2925'>2925</a></p>
  2982. <p id='n2926' class='stm mis'><a href='#n2926'>2926</a></p>
  2983. <p id='n2927' class='stm mis'><a href='#n2927'>2927</a></p>
  2984. <p id='n2928' class='pln'><a href='#n2928'>2928</a></p>
  2985. <p id='n2929' class='pln'><a href='#n2929'>2929</a></p>
  2986. <p id='n2930' class='stm mis'><a href='#n2930'>2930</a></p>
  2987. <p id='n2931' class='pln'><a href='#n2931'>2931</a></p>
  2988. <p id='n2932' class='stm mis'><a href='#n2932'>2932</a></p>
  2989. <p id='n2933' class='stm mis'><a href='#n2933'>2933</a></p>
  2990. <p id='n2934' class='stm mis'><a href='#n2934'>2934</a></p>
  2991. <p id='n2935' class='stm mis'><a href='#n2935'>2935</a></p>
  2992. <p id='n2936' class='stm mis'><a href='#n2936'>2936</a></p>
  2993. <p id='n2937' class='stm mis'><a href='#n2937'>2937</a></p>
  2994. <p id='n2938' class='stm mis'><a href='#n2938'>2938</a></p>
  2995. <p id='n2939' class='pln'><a href='#n2939'>2939</a></p>
  2996. <p id='n2940' class='pln'><a href='#n2940'>2940</a></p>
  2997. <p id='n2941' class='stm mis'><a href='#n2941'>2941</a></p>
  2998. <p id='n2942' class='stm mis'><a href='#n2942'>2942</a></p>
  2999. <p id='n2943' class='stm mis'><a href='#n2943'>2943</a></p>
  3000. <p id='n2944' class='pln'><a href='#n2944'>2944</a></p>
  3001. <p id='n2945' class='stm mis'><a href='#n2945'>2945</a></p>
  3002. <p id='n2946' class='stm mis'><a href='#n2946'>2946</a></p>
  3003. <p id='n2947' class='pln'><a href='#n2947'>2947</a></p>
  3004. <p id='n2948' class='stm mis'><a href='#n2948'>2948</a></p>
  3005. <p id='n2949' class='stm mis'><a href='#n2949'>2949</a></p>
  3006. <p id='n2950' class='stm mis'><a href='#n2950'>2950</a></p>
  3007. <p id='n2951' class='pln'><a href='#n2951'>2951</a></p>
  3008. <p id='n2952' class='stm mis'><a href='#n2952'>2952</a></p>
  3009. <p id='n2953' class='stm mis'><a href='#n2953'>2953</a></p>
  3010. <p id='n2954' class='stm mis'><a href='#n2954'>2954</a></p>
  3011. <p id='n2955' class='pln'><a href='#n2955'>2955</a></p>
  3012. <p id='n2956' class='stm mis'><a href='#n2956'>2956</a></p>
  3013. <p id='n2957' class='stm mis'><a href='#n2957'>2957</a></p>
  3014. <p id='n2958' class='stm mis'><a href='#n2958'>2958</a></p>
  3015. <p id='n2959' class='pln'><a href='#n2959'>2959</a></p>
  3016. <p id='n2960' class='stm mis'><a href='#n2960'>2960</a></p>
  3017. <p id='n2961' class='stm mis'><a href='#n2961'>2961</a></p>
  3018. <p id='n2962' class='stm mis'><a href='#n2962'>2962</a></p>
  3019. <p id='n2963' class='pln'><a href='#n2963'>2963</a></p>
  3020. <p id='n2964' class='stm mis'><a href='#n2964'>2964</a></p>
  3021. <p id='n2965' class='stm mis'><a href='#n2965'>2965</a></p>
  3022. <p id='n2966' class='stm mis'><a href='#n2966'>2966</a></p>
  3023. <p id='n2967' class='pln'><a href='#n2967'>2967</a></p>
  3024. <p id='n2968' class='stm mis'><a href='#n2968'>2968</a></p>
  3025. <p id='n2969' class='pln'><a href='#n2969'>2969</a></p>
  3026. <p id='n2970' class='pln'><a href='#n2970'>2970</a></p>
  3027. <p id='n2971' class='pln'><a href='#n2971'>2971</a></p>
  3028. <p id='n2972' class='pln'><a href='#n2972'>2972</a></p>
  3029. <p id='n2973' class='pln'><a href='#n2973'>2973</a></p>
  3030. <p id='n2974' class='pln'><a href='#n2974'>2974</a></p>
  3031. <p id='n2975' class='pln'><a href='#n2975'>2975</a></p>
  3032. <p id='n2976' class='pln'><a href='#n2976'>2976</a></p>
  3033. <p id='n2977' class='pln'><a href='#n2977'>2977</a></p>
  3034. <p id='n2978' class='pln'><a href='#n2978'>2978</a></p>
  3035. <p id='n2979' class='pln'><a href='#n2979'>2979</a></p>
  3036. <p id='n2980' class='pln'><a href='#n2980'>2980</a></p>
  3037. <p id='n2981' class='stm run hide_run'><a href='#n2981'>2981</a></p>
  3038. <p id='n2982' class='pln'><a href='#n2982'>2982</a></p>
  3039. <p id='n2983' class='pln'><a href='#n2983'>2983</a></p>
  3040. <p id='n2984' class='stm run hide_run'><a href='#n2984'>2984</a></p>
  3041. <p id='n2985' class='stm run hide_run'><a href='#n2985'>2985</a></p>
  3042. <p id='n2986' class='pln'><a href='#n2986'>2986</a></p>
  3043. <p id='n2987' class='stm run hide_run'><a href='#n2987'>2987</a></p>
  3044. <p id='n2988' class='pln'><a href='#n2988'>2988</a></p>
  3045. <p id='n2989' class='stm mis'><a href='#n2989'>2989</a></p>
  3046. <p id='n2990' class='pln'><a href='#n2990'>2990</a></p>
  3047. <p id='n2991' class='stm run hide_run'><a href='#n2991'>2991</a></p>
  3048. <p id='n2992' class='pln'><a href='#n2992'>2992</a></p>
  3049. <p id='n2993' class='stm run hide_run'><a href='#n2993'>2993</a></p>
  3050. <p id='n2994' class='pln'><a href='#n2994'>2994</a></p>
  3051. <p id='n2995' class='stm run hide_run'><a href='#n2995'>2995</a></p>
  3052. <p id='n2996' class='stm run hide_run'><a href='#n2996'>2996</a></p>
  3053. <p id='n2997' class='stm run hide_run'><a href='#n2997'>2997</a></p>
  3054. <p id='n2998' class='stm mis'><a href='#n2998'>2998</a></p>
  3055. <p id='n2999' class='stm mis'><a href='#n2999'>2999</a></p>
  3056. <p id='n3000' class='pln'><a href='#n3000'>3000</a></p>
  3057. <p id='n3001' class='stm run hide_run'><a href='#n3001'>3001</a></p>
  3058. <p id='n3002' class='stm run hide_run'><a href='#n3002'>3002</a></p>
  3059. <p id='n3003' class='stm run hide_run'><a href='#n3003'>3003</a></p>
  3060. <p id='n3004' class='stm run hide_run'><a href='#n3004'>3004</a></p>
  3061. <p id='n3005' class='pln'><a href='#n3005'>3005</a></p>
  3062. <p id='n3006' class='pln'><a href='#n3006'>3006</a></p>
  3063. <p id='n3007' class='pln'><a href='#n3007'>3007</a></p>
  3064. <p id='n3008' class='pln'><a href='#n3008'>3008</a></p>
  3065. <p id='n3009' class='pln'><a href='#n3009'>3009</a></p>
  3066. <p id='n3010' class='stm run hide_run'><a href='#n3010'>3010</a></p>
  3067. <p id='n3011' class='stm run hide_run'><a href='#n3011'>3011</a></p>
  3068. <p id='n3012' class='stm run hide_run'><a href='#n3012'>3012</a></p>
  3069. <p id='n3013' class='stm run hide_run'><a href='#n3013'>3013</a></p>
  3070. <p id='n3014' class='stm run hide_run'><a href='#n3014'>3014</a></p>
  3071. <p id='n3015' class='stm mis'><a href='#n3015'>3015</a></p>
  3072. <p id='n3016' class='stm mis'><a href='#n3016'>3016</a></p>
  3073. <p id='n3017' class='stm mis'><a href='#n3017'>3017</a></p>
  3074. <p id='n3018' class='stm run hide_run'><a href='#n3018'>3018</a></p>
  3075. <p id='n3019' class='stm run hide_run'><a href='#n3019'>3019</a></p>
  3076. <p id='n3020' class='stm run hide_run'><a href='#n3020'>3020</a></p>
  3077. <p id='n3021' class='stm run hide_run'><a href='#n3021'>3021</a></p>
  3078. <p id='n3022' class='stm mis'><a href='#n3022'>3022</a></p>
  3079. <p id='n3023' class='stm mis'><a href='#n3023'>3023</a></p>
  3080. <p id='n3024' class='stm mis'><a href='#n3024'>3024</a></p>
  3081. <p id='n3025' class='stm run hide_run'><a href='#n3025'>3025</a></p>
  3082. <p id='n3026' class='stm run hide_run'><a href='#n3026'>3026</a></p>
  3083. <p id='n3027' class='stm mis'><a href='#n3027'>3027</a></p>
  3084. <p id='n3028' class='stm mis'><a href='#n3028'>3028</a></p>
  3085. <p id='n3029' class='stm mis'><a href='#n3029'>3029</a></p>
  3086. <p id='n3030' class='pln'><a href='#n3030'>3030</a></p>
  3087. <p id='n3031' class='pln'><a href='#n3031'>3031</a></p>
  3088. <p id='n3032' class='pln'><a href='#n3032'>3032</a></p>
  3089. <p id='n3033' class='pln'><a href='#n3033'>3033</a></p>
  3090. <p id='n3034' class='pln'><a href='#n3034'>3034</a></p>
  3091. <p id='n3035' class='pln'><a href='#n3035'>3035</a></p>
  3092. <p id='n3036' class='stm mis'><a href='#n3036'>3036</a></p>
  3093. <p id='n3037' class='stm mis'><a href='#n3037'>3037</a></p>
  3094. <p id='n3038' class='stm mis'><a href='#n3038'>3038</a></p>
  3095. <p id='n3039' class='stm mis'><a href='#n3039'>3039</a></p>
  3096. <p id='n3040' class='stm mis'><a href='#n3040'>3040</a></p>
  3097. <p id='n3041' class='stm mis'><a href='#n3041'>3041</a></p>
  3098. <p id='n3042' class='pln'><a href='#n3042'>3042</a></p>
  3099. <p id='n3043' class='stm mis'><a href='#n3043'>3043</a></p>
  3100. <p id='n3044' class='stm mis'><a href='#n3044'>3044</a></p>
  3101. <p id='n3045' class='stm mis'><a href='#n3045'>3045</a></p>
  3102. <p id='n3046' class='pln'><a href='#n3046'>3046</a></p>
  3103. <p id='n3047' class='stm mis'><a href='#n3047'>3047</a></p>
  3104. <p id='n3048' class='pln'><a href='#n3048'>3048</a></p>
  3105. <p id='n3049' class='stm mis'><a href='#n3049'>3049</a></p>
  3106. <p id='n3050' class='stm mis'><a href='#n3050'>3050</a></p>
  3107. <p id='n3051' class='stm mis'><a href='#n3051'>3051</a></p>
  3108. <p id='n3052' class='pln'><a href='#n3052'>3052</a></p>
  3109. <p id='n3053' class='stm mis'><a href='#n3053'>3053</a></p>
  3110. <p id='n3054' class='stm mis'><a href='#n3054'>3054</a></p>
  3111. <p id='n3055' class='pln'><a href='#n3055'>3055</a></p>
  3112. <p id='n3056' class='pln'><a href='#n3056'>3056</a></p>
  3113. <p id='n3057' class='pln'><a href='#n3057'>3057</a></p>
  3114. <p id='n3058' class='pln'><a href='#n3058'>3058</a></p>
  3115. <p id='n3059' class='pln'><a href='#n3059'>3059</a></p>
  3116. <p id='n3060' class='stm mis'><a href='#n3060'>3060</a></p>
  3117. <p id='n3061' class='stm mis'><a href='#n3061'>3061</a></p>
  3118. <p id='n3062' class='stm mis'><a href='#n3062'>3062</a></p>
  3119. <p id='n3063' class='stm mis'><a href='#n3063'>3063</a></p>
  3120. <p id='n3064' class='stm mis'><a href='#n3064'>3064</a></p>
  3121. <p id='n3065' class='pln'><a href='#n3065'>3065</a></p>
  3122. <p id='n3066' class='pln'><a href='#n3066'>3066</a></p>
  3123. <p id='n3067' class='stm mis'><a href='#n3067'>3067</a></p>
  3124. <p id='n3068' class='pln'><a href='#n3068'>3068</a></p>
  3125. <p id='n3069' class='pln'><a href='#n3069'>3069</a></p>
  3126. <p id='n3070' class='pln'><a href='#n3070'>3070</a></p>
  3127. <p id='n3071' class='pln'><a href='#n3071'>3071</a></p>
  3128. <p id='n3072' class='pln'><a href='#n3072'>3072</a></p>
  3129. <p id='n3073' class='pln'><a href='#n3073'>3073</a></p>
  3130. <p id='n3074' class='stm mis'><a href='#n3074'>3074</a></p>
  3131. <p id='n3075' class='stm mis'><a href='#n3075'>3075</a></p>
  3132. <p id='n3076' class='stm mis'><a href='#n3076'>3076</a></p>
  3133. <p id='n3077' class='stm mis'><a href='#n3077'>3077</a></p>
  3134. <p id='n3078' class='stm mis'><a href='#n3078'>3078</a></p>
  3135. <p id='n3079' class='stm mis'><a href='#n3079'>3079</a></p>
  3136. <p id='n3080' class='stm mis'><a href='#n3080'>3080</a></p>
  3137. <p id='n3081' class='pln'><a href='#n3081'>3081</a></p>
  3138. <p id='n3082' class='stm mis'><a href='#n3082'>3082</a></p>
  3139. <p id='n3083' class='pln'><a href='#n3083'>3083</a></p>
  3140. <p id='n3084' class='stm mis'><a href='#n3084'>3084</a></p>
  3141. <p id='n3085' class='stm mis'><a href='#n3085'>3085</a></p>
  3142. <p id='n3086' class='pln'><a href='#n3086'>3086</a></p>
  3143. <p id='n3087' class='pln'><a href='#n3087'>3087</a></p>
  3144. <p id='n3088' class='pln'><a href='#n3088'>3088</a></p>
  3145. <p id='n3089' class='pln'><a href='#n3089'>3089</a></p>
  3146. <p id='n3090' class='pln'><a href='#n3090'>3090</a></p>
  3147. <p id='n3091' class='pln'><a href='#n3091'>3091</a></p>
  3148. <p id='n3092' class='stm mis'><a href='#n3092'>3092</a></p>
  3149. <p id='n3093' class='stm mis'><a href='#n3093'>3093</a></p>
  3150. <p id='n3094' class='stm mis'><a href='#n3094'>3094</a></p>
  3151. <p id='n3095' class='stm mis'><a href='#n3095'>3095</a></p>
  3152. <p id='n3096' class='stm mis'><a href='#n3096'>3096</a></p>
  3153. <p id='n3097' class='pln'><a href='#n3097'>3097</a></p>
  3154. <p id='n3098' class='stm run hide_run'><a href='#n3098'>3098</a></p>
  3155. <p id='n3099' class='pln'><a href='#n3099'>3099</a></p>
  3156. <p id='n3100' class='pln'><a href='#n3100'>3100</a></p>
  3157. <p id='n3101' class='stm run hide_run'><a href='#n3101'>3101</a></p>
  3158. <p id='n3102' class='stm run hide_run'><a href='#n3102'>3102</a></p>
  3159. <p id='n3103' class='pln'><a href='#n3103'>3103</a></p>
  3160. <p id='n3104' class='stm run hide_run'><a href='#n3104'>3104</a></p>
  3161. <p id='n3105' class='pln'><a href='#n3105'>3105</a></p>
  3162. <p id='n3106' class='stm mis'><a href='#n3106'>3106</a></p>
  3163. <p id='n3107' class='pln'><a href='#n3107'>3107</a></p>
  3164. <p id='n3108' class='stm run hide_run'><a href='#n3108'>3108</a></p>
  3165. <p id='n3109' class='stm mis'><a href='#n3109'>3109</a></p>
  3166. <p id='n3110' class='stm mis'><a href='#n3110'>3110</a></p>
  3167. <p id='n3111' class='stm mis'><a href='#n3111'>3111</a></p>
  3168. <p id='n3112' class='stm mis'><a href='#n3112'>3112</a></p>
  3169. <p id='n3113' class='stm mis'><a href='#n3113'>3113</a></p>
  3170. <p id='n3114' class='stm mis'><a href='#n3114'>3114</a></p>
  3171. <p id='n3115' class='stm mis'><a href='#n3115'>3115</a></p>
  3172. <p id='n3116' class='pln'><a href='#n3116'>3116</a></p>
  3173. <p id='n3117' class='stm mis'><a href='#n3117'>3117</a></p>
  3174. <p id='n3118' class='pln'><a href='#n3118'>3118</a></p>
  3175. <p id='n3119' class='stm mis'><a href='#n3119'>3119</a></p>
  3176. <p id='n3120' class='stm mis'><a href='#n3120'>3120</a></p>
  3177. <p id='n3121' class='stm mis'><a href='#n3121'>3121</a></p>
  3178. <p id='n3122' class='stm mis'><a href='#n3122'>3122</a></p>
  3179. <p id='n3123' class='stm mis'><a href='#n3123'>3123</a></p>
  3180. <p id='n3124' class='stm mis'><a href='#n3124'>3124</a></p>
  3181. <p id='n3125' class='stm mis'><a href='#n3125'>3125</a></p>
  3182. <p id='n3126' class='stm mis'><a href='#n3126'>3126</a></p>
  3183. <p id='n3127' class='stm mis'><a href='#n3127'>3127</a></p>
  3184. <p id='n3128' class='stm mis'><a href='#n3128'>3128</a></p>
  3185. <p id='n3129' class='stm mis'><a href='#n3129'>3129</a></p>
  3186. <p id='n3130' class='pln'><a href='#n3130'>3130</a></p>
  3187. <p id='n3131' class='stm mis'><a href='#n3131'>3131</a></p>
  3188. <p id='n3132' class='stm mis'><a href='#n3132'>3132</a></p>
  3189. <p id='n3133' class='stm mis'><a href='#n3133'>3133</a></p>
  3190. <p id='n3134' class='stm mis'><a href='#n3134'>3134</a></p>
  3191. <p id='n3135' class='stm mis'><a href='#n3135'>3135</a></p>
  3192. <p id='n3136' class='pln'><a href='#n3136'>3136</a></p>
  3193. <p id='n3137' class='stm mis'><a href='#n3137'>3137</a></p>
  3194. <p id='n3138' class='stm mis'><a href='#n3138'>3138</a></p>
  3195. <p id='n3139' class='stm mis'><a href='#n3139'>3139</a></p>
  3196. <p id='n3140' class='stm mis'><a href='#n3140'>3140</a></p>
  3197. <p id='n3141' class='stm mis'><a href='#n3141'>3141</a></p>
  3198. <p id='n3142' class='pln'><a href='#n3142'>3142</a></p>
  3199. <p id='n3143' class='stm mis'><a href='#n3143'>3143</a></p>
  3200. <p id='n3144' class='stm mis'><a href='#n3144'>3144</a></p>
  3201. <p id='n3145' class='stm mis'><a href='#n3145'>3145</a></p>
  3202. <p id='n3146' class='stm mis'><a href='#n3146'>3146</a></p>
  3203. <p id='n3147' class='stm mis'><a href='#n3147'>3147</a></p>
  3204. <p id='n3148' class='stm mis'><a href='#n3148'>3148</a></p>
  3205. <p id='n3149' class='stm mis'><a href='#n3149'>3149</a></p>
  3206. <p id='n3150' class='stm mis'><a href='#n3150'>3150</a></p>
  3207. <p id='n3151' class='pln'><a href='#n3151'>3151</a></p>
  3208. <p id='n3152' class='stm mis'><a href='#n3152'>3152</a></p>
  3209. <p id='n3153' class='stm mis'><a href='#n3153'>3153</a></p>
  3210. <p id='n3154' class='pln'><a href='#n3154'>3154</a></p>
  3211. <p id='n3155' class='pln'><a href='#n3155'>3155</a></p>
  3212. <p id='n3156' class='stm mis'><a href='#n3156'>3156</a></p>
  3213. <p id='n3157' class='pln'><a href='#n3157'>3157</a></p>
  3214. <p id='n3158' class='stm mis'><a href='#n3158'>3158</a></p>
  3215. <p id='n3159' class='stm mis'><a href='#n3159'>3159</a></p>
  3216. <p id='n3160' class='stm mis'><a href='#n3160'>3160</a></p>
  3217. <p id='n3161' class='stm mis'><a href='#n3161'>3161</a></p>
  3218. <p id='n3162' class='stm mis'><a href='#n3162'>3162</a></p>
  3219. <p id='n3163' class='stm mis'><a href='#n3163'>3163</a></p>
  3220. <p id='n3164' class='stm mis'><a href='#n3164'>3164</a></p>
  3221. <p id='n3165' class='pln'><a href='#n3165'>3165</a></p>
  3222. <p id='n3166' class='stm mis'><a href='#n3166'>3166</a></p>
  3223. <p id='n3167' class='pln'><a href='#n3167'>3167</a></p>
  3224. <p id='n3168' class='pln'><a href='#n3168'>3168</a></p>
  3225. <p id='n3169' class='pln'><a href='#n3169'>3169</a></p>
  3226. <p id='n3170' class='pln'><a href='#n3170'>3170</a></p>
  3227. <p id='n3171' class='pln'><a href='#n3171'>3171</a></p>
  3228. <p id='n3172' class='pln'><a href='#n3172'>3172</a></p>
  3229. <p id='n3173' class='pln'><a href='#n3173'>3173</a></p>
  3230. <p id='n3174' class='pln'><a href='#n3174'>3174</a></p>
  3231. <p id='n3175' class='pln'><a href='#n3175'>3175</a></p>
  3232. <p id='n3176' class='stm mis'><a href='#n3176'>3176</a></p>
  3233. <p id='n3177' class='pln'><a href='#n3177'>3177</a></p>
  3234. <p id='n3178' class='pln'><a href='#n3178'>3178</a></p>
  3235. <p id='n3179' class='stm run hide_run'><a href='#n3179'>3179</a></p>
  3236. <p id='n3180' class='stm run hide_run'><a href='#n3180'>3180</a></p>
  3237. <p id='n3181' class='pln'><a href='#n3181'>3181</a></p>
  3238. <p id='n3182' class='stm run hide_run'><a href='#n3182'>3182</a></p>
  3239. <p id='n3183' class='pln'><a href='#n3183'>3183</a></p>
  3240. <p id='n3184' class='stm run hide_run'><a href='#n3184'>3184</a></p>
  3241. <p id='n3185' class='pln'><a href='#n3185'>3185</a></p>
  3242. <p id='n3186' class='stm run hide_run'><a href='#n3186'>3186</a></p>
  3243. <p id='n3187' class='pln'><a href='#n3187'>3187</a></p>
  3244. <p id='n3188' class='stm run hide_run'><a href='#n3188'>3188</a></p>
  3245. <p id='n3189' class='pln'><a href='#n3189'>3189</a></p>
  3246. <p id='n3190' class='stm run hide_run'><a href='#n3190'>3190</a></p>
  3247. <p id='n3191' class='stm run hide_run'><a href='#n3191'>3191</a></p>
  3248. <p id='n3192' class='stm run hide_run'><a href='#n3192'>3192</a></p>
  3249. <p id='n3193' class='stm run hide_run'><a href='#n3193'>3193</a></p>
  3250. <p id='n3194' class='pln'><a href='#n3194'>3194</a></p>
  3251. <p id='n3195' class='stm run hide_run'><a href='#n3195'>3195</a></p>
  3252. <p id='n3196' class='pln'><a href='#n3196'>3196</a></p>
  3253. <p id='n3197' class='stm run hide_run'><a href='#n3197'>3197</a></p>
  3254. <p id='n3198' class='stm run hide_run'><a href='#n3198'>3198</a></p>
  3255. <p id='n3199' class='stm run hide_run'><a href='#n3199'>3199</a></p>
  3256. <p id='n3200' class='stm run hide_run'><a href='#n3200'>3200</a></p>
  3257. <p id='n3201' class='stm run hide_run'><a href='#n3201'>3201</a></p>
  3258. <p id='n3202' class='stm run hide_run'><a href='#n3202'>3202</a></p>
  3259. <p id='n3203' class='stm run hide_run'><a href='#n3203'>3203</a></p>
  3260. <p id='n3204' class='stm run hide_run'><a href='#n3204'>3204</a></p>
  3261. <p id='n3205' class='stm run hide_run'><a href='#n3205'>3205</a></p>
  3262. <p id='n3206' class='pln'><a href='#n3206'>3206</a></p>
  3263. <p id='n3207' class='stm run hide_run'><a href='#n3207'>3207</a></p>
  3264. <p id='n3208' class='pln'><a href='#n3208'>3208</a></p>
  3265. <p id='n3209' class='stm run hide_run'><a href='#n3209'>3209</a></p>
  3266. <p id='n3210' class='stm run hide_run'><a href='#n3210'>3210</a></p>
  3267. <p id='n3211' class='stm run hide_run'><a href='#n3211'>3211</a></p>
  3268. <p id='n3212' class='stm run hide_run'><a href='#n3212'>3212</a></p>
  3269. <p id='n3213' class='stm run hide_run'><a href='#n3213'>3213</a></p>
  3270. <p id='n3214' class='stm run hide_run'><a href='#n3214'>3214</a></p>
  3271. <p id='n3215' class='stm run hide_run'><a href='#n3215'>3215</a></p>
  3272. <p id='n3216' class='stm run hide_run'><a href='#n3216'>3216</a></p>
  3273. <p id='n3217' class='pln'><a href='#n3217'>3217</a></p>
  3274. <p id='n3218' class='stm run hide_run'><a href='#n3218'>3218</a></p>
  3275. <p id='n3219' class='stm run hide_run'><a href='#n3219'>3219</a></p>
  3276. <p id='n3220' class='stm run hide_run'><a href='#n3220'>3220</a></p>
  3277. <p id='n3221' class='stm mis'><a href='#n3221'>3221</a></p>
  3278. <p id='n3222' class='stm mis'><a href='#n3222'>3222</a></p>
  3279. <p id='n3223' class='stm run hide_run'><a href='#n3223'>3223</a></p>
  3280. <p id='n3224' class='pln'><a href='#n3224'>3224</a></p>
  3281. <p id='n3225' class='stm run hide_run'><a href='#n3225'>3225</a></p>
  3282. <p id='n3226' class='pln'><a href='#n3226'>3226</a></p>
  3283. <p id='n3227' class='stm run hide_run'><a href='#n3227'>3227</a></p>
  3284. <p id='n3228' class='stm run hide_run'><a href='#n3228'>3228</a></p>
  3285. <p id='n3229' class='stm run hide_run'><a href='#n3229'>3229</a></p>
  3286. <p id='n3230' class='stm run hide_run'><a href='#n3230'>3230</a></p>
  3287. <p id='n3231' class='stm mis'><a href='#n3231'>3231</a></p>
  3288. <p id='n3232' class='stm mis'><a href='#n3232'>3232</a></p>
  3289. <p id='n3233' class='stm mis'><a href='#n3233'>3233</a></p>
  3290. <p id='n3234' class='pln'><a href='#n3234'>3234</a></p>
  3291. <p id='n3235' class='stm run hide_run'><a href='#n3235'>3235</a></p>
  3292. <p id='n3236' class='stm run hide_run'><a href='#n3236'>3236</a></p>
  3293. <p id='n3237' class='stm run hide_run'><a href='#n3237'>3237</a></p>
  3294. <p id='n3238' class='stm run hide_run'><a href='#n3238'>3238</a></p>
  3295. <p id='n3239' class='pln'><a href='#n3239'>3239</a></p>
  3296. <p id='n3240' class='stm run hide_run'><a href='#n3240'>3240</a></p>
  3297. <p id='n3241' class='stm run hide_run'><a href='#n3241'>3241</a></p>
  3298. <p id='n3242' class='pln'><a href='#n3242'>3242</a></p>
  3299. <p id='n3243' class='stm run hide_run'><a href='#n3243'>3243</a></p>
  3300. <p id='n3244' class='stm run hide_run'><a href='#n3244'>3244</a></p>
  3301. <p id='n3245' class='pln'><a href='#n3245'>3245</a></p>
  3302. <p id='n3246' class='stm run hide_run'><a href='#n3246'>3246</a></p>
  3303. <p id='n3247' class='stm run hide_run'><a href='#n3247'>3247</a></p>
  3304. <p id='n3248' class='stm mis'><a href='#n3248'>3248</a></p>
  3305. <p id='n3249' class='pln'><a href='#n3249'>3249</a></p>
  3306. <p id='n3250' class='stm run hide_run'><a href='#n3250'>3250</a></p>
  3307. <p id='n3251' class='stm run hide_run'><a href='#n3251'>3251</a></p>
  3308. <p id='n3252' class='stm mis'><a href='#n3252'>3252</a></p>
  3309. <p id='n3253' class='stm mis'><a href='#n3253'>3253</a></p>
  3310. <p id='n3254' class='stm mis'><a href='#n3254'>3254</a></p>
  3311. <p id='n3255' class='pln'><a href='#n3255'>3255</a></p>
  3312. <p id='n3256' class='stm mis'><a href='#n3256'>3256</a></p>
  3313. <p id='n3257' class='stm mis'><a href='#n3257'>3257</a></p>
  3314. <p id='n3258' class='pln'><a href='#n3258'>3258</a></p>
  3315. <p id='n3259' class='pln'><a href='#n3259'>3259</a></p>
  3316. <p id='n3260' class='stm run hide_run'><a href='#n3260'>3260</a></p>
  3317. <p id='n3261' class='stm run hide_run'><a href='#n3261'>3261</a></p>
  3318. <p id='n3262' class='stm mis'><a href='#n3262'>3262</a></p>
  3319. <p id='n3263' class='stm mis'><a href='#n3263'>3263</a></p>
  3320. <p id='n3264' class='stm mis'><a href='#n3264'>3264</a></p>
  3321. <p id='n3265' class='pln'><a href='#n3265'>3265</a></p>
  3322. <p id='n3266' class='stm run hide_run'><a href='#n3266'>3266</a></p>
  3323. <p id='n3267' class='stm run hide_run'><a href='#n3267'>3267</a></p>
  3324. <p id='n3268' class='stm run hide_run'><a href='#n3268'>3268</a></p>
  3325. <p id='n3269' class='pln'><a href='#n3269'>3269</a></p>
  3326. <p id='n3270' class='pln'><a href='#n3270'>3270</a></p>
  3327. <p id='n3271' class='pln'><a href='#n3271'>3271</a></p>
  3328. <p id='n3272' class='stm run hide_run'><a href='#n3272'>3272</a></p>
  3329. <p id='n3273' class='pln'><a href='#n3273'>3273</a></p>
  3330. <p id='n3274' class='stm run hide_run'><a href='#n3274'>3274</a></p>
  3331. <p id='n3275' class='stm run hide_run'><a href='#n3275'>3275</a></p>
  3332. <p id='n3276' class='pln'><a href='#n3276'>3276</a></p>
  3333. <p id='n3277' class='stm run hide_run'><a href='#n3277'>3277</a></p>
  3334. <p id='n3278' class='pln'><a href='#n3278'>3278</a></p>
  3335. <p id='n3279' class='pln'><a href='#n3279'>3279</a></p>
  3336. <p id='n3280' class='pln'><a href='#n3280'>3280</a></p>
  3337. <p id='n3281' class='pln'><a href='#n3281'>3281</a></p>
  3338. <p id='n3282' class='pln'><a href='#n3282'>3282</a></p>
  3339. <p id='n3283' class='pln'><a href='#n3283'>3283</a></p>
  3340. <p id='n3284' class='pln'><a href='#n3284'>3284</a></p>
  3341. <p id='n3285' class='stm run hide_run'><a href='#n3285'>3285</a></p>
  3342. <p id='n3286' class='pln'><a href='#n3286'>3286</a></p>
  3343. <p id='n3287' class='stm run hide_run'><a href='#n3287'>3287</a></p>
  3344. <p id='n3288' class='pln'><a href='#n3288'>3288</a></p>
  3345. <p id='n3289' class='pln'><a href='#n3289'>3289</a></p>
  3346. <p id='n3290' class='stm run hide_run'><a href='#n3290'>3290</a></p>
  3347. <p id='n3291' class='pln'><a href='#n3291'>3291</a></p>
  3348. <p id='n3292' class='pln'><a href='#n3292'>3292</a></p>
  3349. <p id='n3293' class='stm run hide_run'><a href='#n3293'>3293</a></p>
  3350. <p id='n3294' class='stm run hide_run'><a href='#n3294'>3294</a></p>
  3351. <p id='n3295' class='stm run hide_run'><a href='#n3295'>3295</a></p>
  3352. <p id='n3296' class='stm run hide_run'><a href='#n3296'>3296</a></p>
  3353. <p id='n3297' class='stm run hide_run'><a href='#n3297'>3297</a></p>
  3354. <p id='n3298' class='pln'><a href='#n3298'>3298</a></p>
  3355. <p id='n3299' class='stm run hide_run'><a href='#n3299'>3299</a></p>
  3356. <p id='n3300' class='pln'><a href='#n3300'>3300</a></p>
  3357. <p id='n3301' class='stm run hide_run'><a href='#n3301'>3301</a></p>
  3358. <p id='n3302' class='pln'><a href='#n3302'>3302</a></p>
  3359. <p id='n3303' class='stm run hide_run'><a href='#n3303'>3303</a></p>
  3360. <p id='n3304' class='pln'><a href='#n3304'>3304</a></p>
  3361. <p id='n3305' class='stm mis'><a href='#n3305'>3305</a></p>
  3362. <p id='n3306' class='pln'><a href='#n3306'>3306</a></p>
  3363. <p id='n3307' class='stm run hide_run'><a href='#n3307'>3307</a></p>
  3364. <p id='n3308' class='stm run hide_run'><a href='#n3308'>3308</a></p>
  3365. <p id='n3309' class='stm run hide_run'><a href='#n3309'>3309</a></p>
  3366. <p id='n3310' class='stm mis'><a href='#n3310'>3310</a></p>
  3367. <p id='n3311' class='stm mis'><a href='#n3311'>3311</a></p>
  3368. <p id='n3312' class='stm run hide_run'><a href='#n3312'>3312</a></p>
  3369. <p id='n3313' class='pln'><a href='#n3313'>3313</a></p>
  3370. <p id='n3314' class='stm run hide_run'><a href='#n3314'>3314</a></p>
  3371. <p id='n3315' class='pln'><a href='#n3315'>3315</a></p>
  3372. <p id='n3316' class='pln'><a href='#n3316'>3316</a></p>
  3373. <p id='n3317' class='stm run hide_run'><a href='#n3317'>3317</a></p>
  3374. <p id='n3318' class='stm run hide_run'><a href='#n3318'>3318</a></p>
  3375. <p id='n3319' class='stm run hide_run'><a href='#n3319'>3319</a></p>
  3376. <p id='n3320' class='stm mis'><a href='#n3320'>3320</a></p>
  3377. <p id='n3321' class='stm mis'><a href='#n3321'>3321</a></p>
  3378. <p id='n3322' class='stm mis'><a href='#n3322'>3322</a></p>
  3379. <p id='n3323' class='pln'><a href='#n3323'>3323</a></p>
  3380. <p id='n3324' class='stm run hide_run'><a href='#n3324'>3324</a></p>
  3381. <p id='n3325' class='stm run hide_run'><a href='#n3325'>3325</a></p>
  3382. <p id='n3326' class='stm mis'><a href='#n3326'>3326</a></p>
  3383. <p id='n3327' class='stm mis'><a href='#n3327'>3327</a></p>
  3384. <p id='n3328' class='stm run hide_run'><a href='#n3328'>3328</a></p>
  3385. <p id='n3329' class='pln'><a href='#n3329'>3329</a></p>
  3386. <p id='n3330' class='stm run hide_run'><a href='#n3330'>3330</a></p>
  3387. <p id='n3331' class='stm run hide_run'><a href='#n3331'>3331</a></p>
  3388. <p id='n3332' class='stm mis'><a href='#n3332'>3332</a></p>
  3389. <p id='n3333' class='stm mis'><a href='#n3333'>3333</a></p>
  3390. <p id='n3334' class='stm run hide_run'><a href='#n3334'>3334</a></p>
  3391. <p id='n3335' class='pln'><a href='#n3335'>3335</a></p>
  3392. <p id='n3336' class='stm run hide_run'><a href='#n3336'>3336</a></p>
  3393. <p id='n3337' class='stm run hide_run'><a href='#n3337'>3337</a></p>
  3394. <p id='n3338' class='stm mis'><a href='#n3338'>3338</a></p>
  3395. <p id='n3339' class='stm mis'><a href='#n3339'>3339</a></p>
  3396. <p id='n3340' class='stm run hide_run'><a href='#n3340'>3340</a></p>
  3397. <p id='n3341' class='pln'><a href='#n3341'>3341</a></p>
  3398. <p id='n3342' class='stm run hide_run'><a href='#n3342'>3342</a></p>
  3399. <p id='n3343' class='pln'><a href='#n3343'>3343</a></p>
  3400. <p id='n3344' class='pln'><a href='#n3344'>3344</a></p>
  3401. <p id='n3345' class='pln'><a href='#n3345'>3345</a></p>
  3402. <p id='n3346' class='pln'><a href='#n3346'>3346</a></p>
  3403. <p id='n3347' class='pln'><a href='#n3347'>3347</a></p>
  3404. <p id='n3348' class='pln'><a href='#n3348'>3348</a></p>
  3405. <p id='n3349' class='pln'><a href='#n3349'>3349</a></p>
  3406. <p id='n3350' class='pln'><a href='#n3350'>3350</a></p>
  3407. <p id='n3351' class='pln'><a href='#n3351'>3351</a></p>
  3408. <p id='n3352' class='pln'><a href='#n3352'>3352</a></p>
  3409. <p id='n3353' class='pln'><a href='#n3353'>3353</a></p>
  3410. <p id='n3354' class='stm run hide_run'><a href='#n3354'>3354</a></p>
  3411. <p id='n3355' class='pln'><a href='#n3355'>3355</a></p>
  3412. <p id='n3356' class='pln'><a href='#n3356'>3356</a></p>
  3413. <p id='n3357' class='stm run hide_run'><a href='#n3357'>3357</a></p>
  3414. <p id='n3358' class='stm run hide_run'><a href='#n3358'>3358</a></p>
  3415. <p id='n3359' class='pln'><a href='#n3359'>3359</a></p>
  3416. <p id='n3360' class='stm run hide_run'><a href='#n3360'>3360</a></p>
  3417. <p id='n3361' class='stm run hide_run'><a href='#n3361'>3361</a></p>
  3418. <p id='n3362' class='pln'><a href='#n3362'>3362</a></p>
  3419. <p id='n3363' class='stm run hide_run'><a href='#n3363'>3363</a></p>
  3420. <p id='n3364' class='pln'><a href='#n3364'>3364</a></p>
  3421. <p id='n3365' class='stm run hide_run'><a href='#n3365'>3365</a></p>
  3422. <p id='n3366' class='pln'><a href='#n3366'>3366</a></p>
  3423. <p id='n3367' class='stm run hide_run'><a href='#n3367'>3367</a></p>
  3424. <p id='n3368' class='pln'><a href='#n3368'>3368</a></p>
  3425. <p id='n3369' class='stm run hide_run'><a href='#n3369'>3369</a></p>
  3426. <p id='n3370' class='pln'><a href='#n3370'>3370</a></p>
  3427. <p id='n3371' class='stm run hide_run'><a href='#n3371'>3371</a></p>
  3428. <p id='n3372' class='pln'><a href='#n3372'>3372</a></p>
  3429. <p id='n3373' class='stm run hide_run'><a href='#n3373'>3373</a></p>
  3430. <p id='n3374' class='pln'><a href='#n3374'>3374</a></p>
  3431. <p id='n3375' class='stm run hide_run'><a href='#n3375'>3375</a></p>
  3432. <p id='n3376' class='pln'><a href='#n3376'>3376</a></p>
  3433. <p id='n3377' class='stm run hide_run'><a href='#n3377'>3377</a></p>
  3434. <p id='n3378' class='pln'><a href='#n3378'>3378</a></p>
  3435. <p id='n3379' class='stm run hide_run'><a href='#n3379'>3379</a></p>
  3436. <p id='n3380' class='pln'><a href='#n3380'>3380</a></p>
  3437. <p id='n3381' class='stm run hide_run'><a href='#n3381'>3381</a></p>
  3438. <p id='n3382' class='pln'><a href='#n3382'>3382</a></p>
  3439. <p id='n3383' class='stm run hide_run'><a href='#n3383'>3383</a></p>
  3440. <p id='n3384' class='pln'><a href='#n3384'>3384</a></p>
  3441. <p id='n3385' class='stm run hide_run'><a href='#n3385'>3385</a></p>
  3442. <p id='n3386' class='stm run hide_run'><a href='#n3386'>3386</a></p>
  3443. <p id='n3387' class='stm mis'><a href='#n3387'>3387</a></p>
  3444. <p id='n3388' class='stm mis'><a href='#n3388'>3388</a></p>
  3445. <p id='n3389' class='pln'><a href='#n3389'>3389</a></p>
  3446. <p id='n3390' class='stm run hide_run'><a href='#n3390'>3390</a></p>
  3447. <p id='n3391' class='stm run hide_run'><a href='#n3391'>3391</a></p>
  3448. <p id='n3392' class='pln'><a href='#n3392'>3392</a></p>
  3449. <p id='n3393' class='stm run hide_run'><a href='#n3393'>3393</a></p>
  3450. <p id='n3394' class='pln'><a href='#n3394'>3394</a></p>
  3451. <p id='n3395' class='pln'><a href='#n3395'>3395</a></p>
  3452. <p id='n3396' class='stm run hide_run'><a href='#n3396'>3396</a></p>
  3453. <p id='n3397' class='stm run hide_run'><a href='#n3397'>3397</a></p>
  3454. <p id='n3398' class='stm run hide_run'><a href='#n3398'>3398</a></p>
  3455. <p id='n3399' class='stm run hide_run'><a href='#n3399'>3399</a></p>
  3456. <p id='n3400' class='stm mis'><a href='#n3400'>3400</a></p>
  3457. <p id='n3401' class='stm mis'><a href='#n3401'>3401</a></p>
  3458. <p id='n3402' class='stm mis'><a href='#n3402'>3402</a></p>
  3459. <p id='n3403' class='pln'><a href='#n3403'>3403</a></p>
  3460. <p id='n3404' class='pln'><a href='#n3404'>3404</a></p>
  3461. <p id='n3405' class='stm run hide_run'><a href='#n3405'>3405</a></p>
  3462. <p id='n3406' class='stm run hide_run'><a href='#n3406'>3406</a></p>
  3463. <p id='n3407' class='stm run hide_run'><a href='#n3407'>3407</a></p>
  3464. <p id='n3408' class='stm run hide_run'><a href='#n3408'>3408</a></p>
  3465. <p id='n3409' class='stm run hide_run'><a href='#n3409'>3409</a></p>
  3466. <p id='n3410' class='pln'><a href='#n3410'>3410</a></p>
  3467. <p id='n3411' class='stm run hide_run'><a href='#n3411'>3411</a></p>
  3468. <p id='n3412' class='stm run hide_run'><a href='#n3412'>3412</a></p>
  3469. <p id='n3413' class='stm run hide_run'><a href='#n3413'>3413</a></p>
  3470. <p id='n3414' class='pln'><a href='#n3414'>3414</a></p>
  3471. <p id='n3415' class='pln'><a href='#n3415'>3415</a></p>
  3472. <p id='n3416' class='stm run hide_run'><a href='#n3416'>3416</a></p>
  3473. <p id='n3417' class='stm run hide_run'><a href='#n3417'>3417</a></p>
  3474. <p id='n3418' class='stm run hide_run'><a href='#n3418'>3418</a></p>
  3475. <p id='n3419' class='stm run hide_run'><a href='#n3419'>3419</a></p>
  3476. <p id='n3420' class='stm run hide_run'><a href='#n3420'>3420</a></p>
  3477. <p id='n3421' class='stm run hide_run'><a href='#n3421'>3421</a></p>
  3478. <p id='n3422' class='pln'><a href='#n3422'>3422</a></p>
  3479. <p id='n3423' class='pln'><a href='#n3423'>3423</a></p>
  3480. <p id='n3424' class='pln'><a href='#n3424'>3424</a></p>
  3481. <p id='n3425' class='stm run hide_run'><a href='#n3425'>3425</a></p>
  3482. <p id='n3426' class='stm run hide_run'><a href='#n3426'>3426</a></p>
  3483. <p id='n3427' class='stm run hide_run'><a href='#n3427'>3427</a></p>
  3484. <p id='n3428' class='stm run hide_run'><a href='#n3428'>3428</a></p>
  3485. <p id='n3429' class='stm run hide_run'><a href='#n3429'>3429</a></p>
  3486. <p id='n3430' class='stm run hide_run'><a href='#n3430'>3430</a></p>
  3487. <p id='n3431' class='pln'><a href='#n3431'>3431</a></p>
  3488. <p id='n3432' class='pln'><a href='#n3432'>3432</a></p>
  3489. <p id='n3433' class='stm run hide_run'><a href='#n3433'>3433</a></p>
  3490. <p id='n3434' class='stm run hide_run'><a href='#n3434'>3434</a></p>
  3491. <p id='n3435' class='stm run hide_run'><a href='#n3435'>3435</a></p>
  3492. <p id='n3436' class='stm mis'><a href='#n3436'>3436</a></p>
  3493. <p id='n3437' class='pln'><a href='#n3437'>3437</a></p>
  3494. <p id='n3438' class='stm run hide_run'><a href='#n3438'>3438</a></p>
  3495. <p id='n3439' class='stm run hide_run'><a href='#n3439'>3439</a></p>
  3496. <p id='n3440' class='stm run hide_run'><a href='#n3440'>3440</a></p>
  3497. <p id='n3441' class='stm run hide_run'><a href='#n3441'>3441</a></p>
  3498. <p id='n3442' class='stm mis'><a href='#n3442'>3442</a></p>
  3499. <p id='n3443' class='stm mis'><a href='#n3443'>3443</a></p>
  3500. <p id='n3444' class='stm mis'><a href='#n3444'>3444</a></p>
  3501. <p id='n3445' class='stm run hide_run'><a href='#n3445'>3445</a></p>
  3502. <p id='n3446' class='pln'><a href='#n3446'>3446</a></p>
  3503. <p id='n3447' class='pln'><a href='#n3447'>3447</a></p>
  3504. <p id='n3448' class='pln'><a href='#n3448'>3448</a></p>
  3505. <p id='n3449' class='pln'><a href='#n3449'>3449</a></p>
  3506. <p id='n3450' class='stm run hide_run'><a href='#n3450'>3450</a></p>
  3507. <p id='n3451' class='stm run hide_run'><a href='#n3451'>3451</a></p>
  3508. <p id='n3452' class='stm run hide_run'><a href='#n3452'>3452</a></p>
  3509. <p id='n3453' class='stm mis'><a href='#n3453'>3453</a></p>
  3510. <p id='n3454' class='pln'><a href='#n3454'>3454</a></p>
  3511. <p id='n3455' class='pln'><a href='#n3455'>3455</a></p>
  3512. <p id='n3456' class='stm run hide_run'><a href='#n3456'>3456</a></p>
  3513. <p id='n3457' class='pln'><a href='#n3457'>3457</a></p>
  3514. <p id='n3458' class='pln'><a href='#n3458'>3458</a></p>
  3515. <p id='n3459' class='stm run hide_run'><a href='#n3459'>3459</a></p>
  3516. <p id='n3460' class='pln'><a href='#n3460'>3460</a></p>
  3517. <p id='n3461' class='stm run hide_run'><a href='#n3461'>3461</a></p>
  3518. <p id='n3462' class='pln'><a href='#n3462'>3462</a></p>
  3519. <p id='n3463' class='stm run hide_run'><a href='#n3463'>3463</a></p>
  3520. <p id='n3464' class='stm run hide_run'><a href='#n3464'>3464</a></p>
  3521. <p id='n3465' class='stm mis'><a href='#n3465'>3465</a></p>
  3522. <p id='n3466' class='stm mis'><a href='#n3466'>3466</a></p>
  3523. <p id='n3467' class='pln'><a href='#n3467'>3467</a></p>
  3524. <p id='n3468' class='pln'><a href='#n3468'>3468</a></p>
  3525. <p id='n3469' class='stm run hide_run'><a href='#n3469'>3469</a></p>
  3526. <p id='n3470' class='pln'><a href='#n3470'>3470</a></p>
  3527. <p id='n3471' class='pln'><a href='#n3471'>3471</a></p>
  3528. <p id='n3472' class='pln'><a href='#n3472'>3472</a></p>
  3529. <p id='n3473' class='pln'><a href='#n3473'>3473</a></p>
  3530. <p id='n3474' class='pln'><a href='#n3474'>3474</a></p>
  3531. <p id='n3475' class='pln'><a href='#n3475'>3475</a></p>
  3532. <p id='n3476' class='pln'><a href='#n3476'>3476</a></p>
  3533. <p id='n3477' class='pln'><a href='#n3477'>3477</a></p>
  3534. <p id='n3478' class='stm run hide_run'><a href='#n3478'>3478</a></p>
  3535. <p id='n3479' class='stm run hide_run'><a href='#n3479'>3479</a></p>
  3536. <p id='n3480' class='stm run hide_run'><a href='#n3480'>3480</a></p>
  3537. <p id='n3481' class='pln'><a href='#n3481'>3481</a></p>
  3538. <p id='n3482' class='stm run hide_run'><a href='#n3482'>3482</a></p>
  3539. <p id='n3483' class='stm run hide_run'><a href='#n3483'>3483</a></p>
  3540. <p id='n3484' class='stm run hide_run'><a href='#n3484'>3484</a></p>
  3541. <p id='n3485' class='stm mis'><a href='#n3485'>3485</a></p>
  3542. <p id='n3486' class='stm mis'><a href='#n3486'>3486</a></p>
  3543. <p id='n3487' class='pln'><a href='#n3487'>3487</a></p>
  3544. <p id='n3488' class='stm run hide_run'><a href='#n3488'>3488</a></p>
  3545. <p id='n3489' class='stm run hide_run'><a href='#n3489'>3489</a></p>
  3546. <p id='n3490' class='stm run hide_run'><a href='#n3490'>3490</a></p>
  3547. <p id='n3491' class='pln'><a href='#n3491'>3491</a></p>
  3548. <p id='n3492' class='stm run hide_run'><a href='#n3492'>3492</a></p>
  3549. <p id='n3493' class='pln'><a href='#n3493'>3493</a></p>
  3550. <p id='n3494' class='stm run hide_run'><a href='#n3494'>3494</a></p>
  3551. <p id='n3495' class='stm run hide_run'><a href='#n3495'>3495</a></p>
  3552. <p id='n3496' class='stm run hide_run'><a href='#n3496'>3496</a></p>
  3553. <p id='n3497' class='stm run hide_run'><a href='#n3497'>3497</a></p>
  3554. <p id='n3498' class='stm run hide_run'><a href='#n3498'>3498</a></p>
  3555. <p id='n3499' class='pln'><a href='#n3499'>3499</a></p>
  3556. <p id='n3500' class='stm run hide_run'><a href='#n3500'>3500</a></p>
  3557. <p id='n3501' class='pln'><a href='#n3501'>3501</a></p>
  3558. <p id='n3502' class='stm run hide_run'><a href='#n3502'>3502</a></p>
  3559. <p id='n3503' class='stm run hide_run'><a href='#n3503'>3503</a></p>
  3560. <p id='n3504' class='stm run hide_run'><a href='#n3504'>3504</a></p>
  3561. <p id='n3505' class='pln'><a href='#n3505'>3505</a></p>
  3562. <p id='n3506' class='pln'><a href='#n3506'>3506</a></p>
  3563. <p id='n3507' class='pln'><a href='#n3507'>3507</a></p>
  3564. <p id='n3508' class='pln'><a href='#n3508'>3508</a></p>
  3565. <p id='n3509' class='pln'><a href='#n3509'>3509</a></p>
  3566. <p id='n3510' class='pln'><a href='#n3510'>3510</a></p>
  3567. <p id='n3511' class='pln'><a href='#n3511'>3511</a></p>
  3568. <p id='n3512' class='stm run hide_run'><a href='#n3512'>3512</a></p>
  3569. <p id='n3513' class='pln'><a href='#n3513'>3513</a></p>
  3570. <p id='n3514' class='stm run hide_run'><a href='#n3514'>3514</a></p>
  3571. <p id='n3515' class='pln'><a href='#n3515'>3515</a></p>
  3572. <p id='n3516' class='pln'><a href='#n3516'>3516</a></p>
  3573. <p id='n3517' class='pln'><a href='#n3517'>3517</a></p>
  3574. <p id='n3518' class='pln'><a href='#n3518'>3518</a></p>
  3575. <p id='n3519' class='pln'><a href='#n3519'>3519</a></p>
  3576. <p id='n3520' class='stm run hide_run'><a href='#n3520'>3520</a></p>
  3577. <p id='n3521' class='pln'><a href='#n3521'>3521</a></p>
  3578. <p id='n3522' class='stm run hide_run'><a href='#n3522'>3522</a></p>
  3579. <p id='n3523' class='stm run hide_run'><a href='#n3523'>3523</a></p>
  3580. <p id='n3524' class='pln'><a href='#n3524'>3524</a></p>
  3581. <p id='n3525' class='stm run hide_run'><a href='#n3525'>3525</a></p>
  3582. <p id='n3526' class='pln'><a href='#n3526'>3526</a></p>
  3583. <p id='n3527' class='stm run hide_run'><a href='#n3527'>3527</a></p>
  3584. <p id='n3528' class='pln'><a href='#n3528'>3528</a></p>
  3585. <p id='n3529' class='stm run hide_run'><a href='#n3529'>3529</a></p>
  3586. <p id='n3530' class='pln'><a href='#n3530'>3530</a></p>
  3587. <p id='n3531' class='stm mis'><a href='#n3531'>3531</a></p>
  3588. <p id='n3532' class='pln'><a href='#n3532'>3532</a></p>
  3589. <p id='n3533' class='pln'><a href='#n3533'>3533</a></p>
  3590. <p id='n3534' class='pln'><a href='#n3534'>3534</a></p>
  3591. <p id='n3535' class='stm run hide_run'><a href='#n3535'>3535</a></p>
  3592. <p id='n3536' class='stm run hide_run'><a href='#n3536'>3536</a></p>
  3593. <p id='n3537' class='stm run hide_run'><a href='#n3537'>3537</a></p>
  3594. <p id='n3538' class='stm run hide_run'><a href='#n3538'>3538</a></p>
  3595. <p id='n3539' class='stm run hide_run'><a href='#n3539'>3539</a></p>
  3596. <p id='n3540' class='stm mis'><a href='#n3540'>3540</a></p>
  3597. <p id='n3541' class='stm mis'><a href='#n3541'>3541</a></p>
  3598. <p id='n3542' class='stm mis'><a href='#n3542'>3542</a></p>
  3599. <p id='n3543' class='pln'><a href='#n3543'>3543</a></p>
  3600. <p id='n3544' class='stm run hide_run'><a href='#n3544'>3544</a></p>
  3601. <p id='n3545' class='stm run hide_run'><a href='#n3545'>3545</a></p>
  3602. <p id='n3546' class='stm run hide_run'><a href='#n3546'>3546</a></p>
  3603. <p id='n3547' class='stm run hide_run'><a href='#n3547'>3547</a></p>
  3604. <p id='n3548' class='stm run hide_run'><a href='#n3548'>3548</a></p>
  3605. <p id='n3549' class='stm run hide_run'><a href='#n3549'>3549</a></p>
  3606. <p id='n3550' class='stm run hide_run'><a href='#n3550'>3550</a></p>
  3607. <p id='n3551' class='stm run hide_run'><a href='#n3551'>3551</a></p>
  3608. <p id='n3552' class='pln'><a href='#n3552'>3552</a></p>
  3609. <p id='n3553' class='pln'><a href='#n3553'>3553</a></p>
  3610. <p id='n3554' class='pln'><a href='#n3554'>3554</a></p>
  3611. <p id='n3555' class='pln'><a href='#n3555'>3555</a></p>
  3612. <p id='n3556' class='pln'><a href='#n3556'>3556</a></p>
  3613. <p id='n3557' class='pln'><a href='#n3557'>3557</a></p>
  3614. <p id='n3558' class='pln'><a href='#n3558'>3558</a></p>
  3615. <p id='n3559' class='stm run hide_run'><a href='#n3559'>3559</a></p>
  3616. <p id='n3560' class='pln'><a href='#n3560'>3560</a></p>
  3617. <p id='n3561' class='stm run hide_run'><a href='#n3561'>3561</a></p>
  3618. <p id='n3562' class='stm run hide_run'><a href='#n3562'>3562</a></p>
  3619. <p id='n3563' class='stm run hide_run'><a href='#n3563'>3563</a></p>
  3620. <p id='n3564' class='stm mis'><a href='#n3564'>3564</a></p>
  3621. <p id='n3565' class='stm mis'><a href='#n3565'>3565</a></p>
  3622. <p id='n3566' class='pln'><a href='#n3566'>3566</a></p>
  3623. <p id='n3567' class='stm run hide_run'><a href='#n3567'>3567</a></p>
  3624. <p id='n3568' class='stm run hide_run'><a href='#n3568'>3568</a></p>
  3625. <p id='n3569' class='stm run hide_run'><a href='#n3569'>3569</a></p>
  3626. <p id='n3570' class='stm run hide_run'><a href='#n3570'>3570</a></p>
  3627. <p id='n3571' class='stm mis'><a href='#n3571'>3571</a></p>
  3628. <p id='n3572' class='stm mis'><a href='#n3572'>3572</a></p>
  3629. <p id='n3573' class='pln'><a href='#n3573'>3573</a></p>
  3630. <p id='n3574' class='stm run hide_run'><a href='#n3574'>3574</a></p>
  3631. <p id='n3575' class='stm run hide_run'><a href='#n3575'>3575</a></p>
  3632. <p id='n3576' class='pln'><a href='#n3576'>3576</a></p>
  3633. <p id='n3577' class='stm run hide_run'><a href='#n3577'>3577</a></p>
  3634. <p id='n3578' class='pln'><a href='#n3578'>3578</a></p>
  3635. <p id='n3579' class='stm run hide_run'><a href='#n3579'>3579</a></p>
  3636. <p id='n3580' class='stm run hide_run'><a href='#n3580'>3580</a></p>
  3637. <p id='n3581' class='stm run hide_run'><a href='#n3581'>3581</a></p>
  3638. <p id='n3582' class='stm run hide_run'><a href='#n3582'>3582</a></p>
  3639. <p id='n3583' class='stm run hide_run'><a href='#n3583'>3583</a></p>
  3640. <p id='n3584' class='stm mis'><a href='#n3584'>3584</a></p>
  3641. <p id='n3585' class='stm run hide_run'><a href='#n3585'>3585</a></p>
  3642. <p id='n3586' class='stm run hide_run'><a href='#n3586'>3586</a></p>
  3643. <p id='n3587' class='stm run hide_run'><a href='#n3587'>3587</a></p>
  3644. <p id='n3588' class='stm run hide_run'><a href='#n3588'>3588</a></p>
  3645. <p id='n3589' class='stm run hide_run'><a href='#n3589'>3589</a></p>
  3646. <p id='n3590' class='stm mis'><a href='#n3590'>3590</a></p>
  3647. <p id='n3591' class='stm run hide_run'><a href='#n3591'>3591</a></p>
  3648. <p id='n3592' class='pln'><a href='#n3592'>3592</a></p>
  3649. <p id='n3593' class='stm run hide_run'><a href='#n3593'>3593</a></p>
  3650. <p id='n3594' class='stm run hide_run'><a href='#n3594'>3594</a></p>
  3651. <p id='n3595' class='pln'><a href='#n3595'>3595</a></p>
  3652. <p id='n3596' class='stm run hide_run'><a href='#n3596'>3596</a></p>
  3653. <p id='n3597' class='stm run hide_run'><a href='#n3597'>3597</a></p>
  3654. <p id='n3598' class='stm run hide_run'><a href='#n3598'>3598</a></p>
  3655. <p id='n3599' class='stm mis'><a href='#n3599'>3599</a></p>
  3656. <p id='n3600' class='stm mis'><a href='#n3600'>3600</a></p>
  3657. <p id='n3601' class='pln'><a href='#n3601'>3601</a></p>
  3658. <p id='n3602' class='stm run hide_run'><a href='#n3602'>3602</a></p>
  3659. <p id='n3603' class='stm run hide_run'><a href='#n3603'>3603</a></p>
  3660. <p id='n3604' class='pln'><a href='#n3604'>3604</a></p>
  3661. <p id='n3605' class='stm run hide_run'><a href='#n3605'>3605</a></p>
  3662. <p id='n3606' class='stm run hide_run'><a href='#n3606'>3606</a></p>
  3663. <p id='n3607' class='stm mis'><a href='#n3607'>3607</a></p>
  3664. <p id='n3608' class='stm run hide_run'><a href='#n3608'>3608</a></p>
  3665. <p id='n3609' class='pln'><a href='#n3609'>3609</a></p>
  3666. <p id='n3610' class='stm run hide_run'><a href='#n3610'>3610</a></p>
  3667. <p id='n3611' class='stm run hide_run'><a href='#n3611'>3611</a></p>
  3668. <p id='n3612' class='stm mis'><a href='#n3612'>3612</a></p>
  3669. <p id='n3613' class='stm run hide_run'><a href='#n3613'>3613</a></p>
  3670. <p id='n3614' class='pln'><a href='#n3614'>3614</a></p>
  3671. <p id='n3615' class='stm run hide_run'><a href='#n3615'>3615</a></p>
  3672. <p id='n3616' class='stm run hide_run'><a href='#n3616'>3616</a></p>
  3673. <p id='n3617' class='stm run hide_run'><a href='#n3617'>3617</a></p>
  3674. <p id='n3618' class='pln'><a href='#n3618'>3618</a></p>
  3675. <p id='n3619' class='stm mis'><a href='#n3619'>3619</a></p>
  3676. <p id='n3620' class='pln'><a href='#n3620'>3620</a></p>
  3677. <p id='n3621' class='stm run hide_run'><a href='#n3621'>3621</a></p>
  3678. <p id='n3622' class='pln'><a href='#n3622'>3622</a></p>
  3679. <p id='n3623' class='pln'><a href='#n3623'>3623</a></p>
  3680. <p id='n3624' class='pln'><a href='#n3624'>3624</a></p>
  3681. <p id='n3625' class='pln'><a href='#n3625'>3625</a></p>
  3682. <p id='n3626' class='pln'><a href='#n3626'>3626</a></p>
  3683. <p id='n3627' class='pln'><a href='#n3627'>3627</a></p>
  3684. <p id='n3628' class='stm run hide_run'><a href='#n3628'>3628</a></p>
  3685. <p id='n3629' class='pln'><a href='#n3629'>3629</a></p>
  3686. <p id='n3630' class='stm run hide_run'><a href='#n3630'>3630</a></p>
  3687. <p id='n3631' class='stm run hide_run'><a href='#n3631'>3631</a></p>
  3688. <p id='n3632' class='pln'><a href='#n3632'>3632</a></p>
  3689. <p id='n3633' class='stm run hide_run'><a href='#n3633'>3633</a></p>
  3690. <p id='n3634' class='stm run hide_run'><a href='#n3634'>3634</a></p>
  3691. <p id='n3635' class='stm run hide_run'><a href='#n3635'>3635</a></p>
  3692. <p id='n3636' class='stm mis'><a href='#n3636'>3636</a></p>
  3693. <p id='n3637' class='stm mis'><a href='#n3637'>3637</a></p>
  3694. <p id='n3638' class='pln'><a href='#n3638'>3638</a></p>
  3695. <p id='n3639' class='stm run hide_run'><a href='#n3639'>3639</a></p>
  3696. <p id='n3640' class='stm run hide_run'><a href='#n3640'>3640</a></p>
  3697. <p id='n3641' class='pln'><a href='#n3641'>3641</a></p>
  3698. <p id='n3642' class='stm run hide_run'><a href='#n3642'>3642</a></p>
  3699. <p id='n3643' class='stm run hide_run'><a href='#n3643'>3643</a></p>
  3700. <p id='n3644' class='stm mis'><a href='#n3644'>3644</a></p>
  3701. <p id='n3645' class='stm run hide_run'><a href='#n3645'>3645</a></p>
  3702. <p id='n3646' class='pln'><a href='#n3646'>3646</a></p>
  3703. <p id='n3647' class='stm run hide_run'><a href='#n3647'>3647</a></p>
  3704. <p id='n3648' class='stm run hide_run'><a href='#n3648'>3648</a></p>
  3705. <p id='n3649' class='stm mis'><a href='#n3649'>3649</a></p>
  3706. <p id='n3650' class='stm run hide_run'><a href='#n3650'>3650</a></p>
  3707. <p id='n3651' class='pln'><a href='#n3651'>3651</a></p>
  3708. <p id='n3652' class='stm run hide_run'><a href='#n3652'>3652</a></p>
  3709. <p id='n3653' class='stm run hide_run'><a href='#n3653'>3653</a></p>
  3710. <p id='n3654' class='stm mis'><a href='#n3654'>3654</a></p>
  3711. <p id='n3655' class='stm run hide_run'><a href='#n3655'>3655</a></p>
  3712. <p id='n3656' class='stm run hide_run'><a href='#n3656'>3656</a></p>
  3713. <p id='n3657' class='pln'><a href='#n3657'>3657</a></p>
  3714. <p id='n3658' class='stm run hide_run'><a href='#n3658'>3658</a></p>
  3715. <p id='n3659' class='stm run hide_run'><a href='#n3659'>3659</a></p>
  3716. <p id='n3660' class='stm mis'><a href='#n3660'>3660</a></p>
  3717. <p id='n3661' class='stm run hide_run'><a href='#n3661'>3661</a></p>
  3718. <p id='n3662' class='pln'><a href='#n3662'>3662</a></p>
  3719. <p id='n3663' class='stm run hide_run'><a href='#n3663'>3663</a></p>
  3720. <p id='n3664' class='stm run hide_run'><a href='#n3664'>3664</a></p>
  3721. <p id='n3665' class='pln'><a href='#n3665'>3665</a></p>
  3722. <p id='n3666' class='stm run hide_run'><a href='#n3666'>3666</a></p>
  3723. <p id='n3667' class='pln'><a href='#n3667'>3667</a></p>
  3724. <p id='n3668' class='pln'><a href='#n3668'>3668</a></p>
  3725. <p id='n3669' class='pln'><a href='#n3669'>3669</a></p>
  3726. <p id='n3670' class='pln'><a href='#n3670'>3670</a></p>
  3727. <p id='n3671' class='pln'><a href='#n3671'>3671</a></p>
  3728. <p id='n3672' class='pln'><a href='#n3672'>3672</a></p>
  3729. <p id='n3673' class='pln'><a href='#n3673'>3673</a></p>
  3730. <p id='n3674' class='pln'><a href='#n3674'>3674</a></p>
  3731. <p id='n3675' class='pln'><a href='#n3675'>3675</a></p>
  3732. <p id='n3676' class='pln'><a href='#n3676'>3676</a></p>
  3733. <p id='n3677' class='stm run hide_run'><a href='#n3677'>3677</a></p>
  3734. <p id='n3678' class='pln'><a href='#n3678'>3678</a></p>
  3735. <p id='n3679' class='stm run hide_run'><a href='#n3679'>3679</a></p>
  3736. <p id='n3680' class='stm run hide_run'><a href='#n3680'>3680</a></p>
  3737. <p id='n3681' class='pln'><a href='#n3681'>3681</a></p>
  3738. <p id='n3682' class='pln'><a href='#n3682'>3682</a></p>
  3739. <p id='n3683' class='pln'><a href='#n3683'>3683</a></p>
  3740. <p id='n3684' class='pln'><a href='#n3684'>3684</a></p>
  3741. <p id='n3685' class='pln'><a href='#n3685'>3685</a></p>
  3742. <p id='n3686' class='stm run hide_run'><a href='#n3686'>3686</a></p>
  3743. <p id='n3687' class='pln'><a href='#n3687'>3687</a></p>
  3744. <p id='n3688' class='stm run hide_run'><a href='#n3688'>3688</a></p>
  3745. <p id='n3689' class='pln'><a href='#n3689'>3689</a></p>
  3746. <p id='n3690' class='stm run hide_run'><a href='#n3690'>3690</a></p>
  3747. <p id='n3691' class='stm run hide_run'><a href='#n3691'>3691</a></p>
  3748. <p id='n3692' class='stm run hide_run'><a href='#n3692'>3692</a></p>
  3749. <p id='n3693' class='stm run hide_run'><a href='#n3693'>3693</a></p>
  3750. <p id='n3694' class='stm run hide_run'><a href='#n3694'>3694</a></p>
  3751. <p id='n3695' class='stm run hide_run'><a href='#n3695'>3695</a></p>
  3752. <p id='n3696' class='stm run hide_run'><a href='#n3696'>3696</a></p>
  3753. <p id='n3697' class='stm run hide_run'><a href='#n3697'>3697</a></p>
  3754. <p id='n3698' class='stm run hide_run'><a href='#n3698'>3698</a></p>
  3755. <p id='n3699' class='stm run hide_run'><a href='#n3699'>3699</a></p>
  3756. <p id='n3700' class='stm run hide_run'><a href='#n3700'>3700</a></p>
  3757. <p id='n3701' class='stm run hide_run'><a href='#n3701'>3701</a></p>
  3758. <p id='n3702' class='stm run hide_run'><a href='#n3702'>3702</a></p>
  3759. <p id='n3703' class='stm run hide_run'><a href='#n3703'>3703</a></p>
  3760. <p id='n3704' class='stm run hide_run'><a href='#n3704'>3704</a></p>
  3761. <p id='n3705' class='stm mis'><a href='#n3705'>3705</a></p>
  3762. <p id='n3706' class='stm run hide_run'><a href='#n3706'>3706</a></p>
  3763. <p id='n3707' class='pln'><a href='#n3707'>3707</a></p>
  3764. <p id='n3708' class='pln'><a href='#n3708'>3708</a></p>
  3765. <p id='n3709' class='pln'><a href='#n3709'>3709</a></p>
  3766. <p id='n3710' class='pln'><a href='#n3710'>3710</a></p>
  3767. <p id='n3711' class='pln'><a href='#n3711'>3711</a></p>
  3768. <p id='n3712' class='stm run hide_run'><a href='#n3712'>3712</a></p>
  3769. <p id='n3713' class='stm run hide_run'><a href='#n3713'>3713</a></p>
  3770. <p id='n3714' class='pln'><a href='#n3714'>3714</a></p>
  3771. <p id='n3715' class='stm run hide_run'><a href='#n3715'>3715</a></p>
  3772. <p id='n3716' class='stm run hide_run'><a href='#n3716'>3716</a></p>
  3773. <p id='n3717' class='stm run hide_run'><a href='#n3717'>3717</a></p>
  3774. <p id='n3718' class='pln'><a href='#n3718'>3718</a></p>
  3775. <p id='n3719' class='stm run hide_run'><a href='#n3719'>3719</a></p>
  3776. <p id='n3720' class='stm run hide_run'><a href='#n3720'>3720</a></p>
  3777. <p id='n3721' class='stm run hide_run'><a href='#n3721'>3721</a></p>
  3778. <p id='n3722' class='stm run hide_run'><a href='#n3722'>3722</a></p>
  3779. <p id='n3723' class='stm run hide_run'><a href='#n3723'>3723</a></p>
  3780. <p id='n3724' class='stm run hide_run'><a href='#n3724'>3724</a></p>
  3781. <p id='n3725' class='stm run hide_run'><a href='#n3725'>3725</a></p>
  3782. <p id='n3726' class='stm run hide_run'><a href='#n3726'>3726</a></p>
  3783. <p id='n3727' class='stm run hide_run'><a href='#n3727'>3727</a></p>
  3784. <p id='n3728' class='stm run hide_run'><a href='#n3728'>3728</a></p>
  3785. <p id='n3729' class='pln'><a href='#n3729'>3729</a></p>
  3786. <p id='n3730' class='pln'><a href='#n3730'>3730</a></p>
  3787. <p id='n3731' class='pln'><a href='#n3731'>3731</a></p>
  3788. <p id='n3732' class='pln'><a href='#n3732'>3732</a></p>
  3789. <p id='n3733' class='pln'><a href='#n3733'>3733</a></p>
  3790. <p id='n3734' class='pln'><a href='#n3734'>3734</a></p>
  3791. <p id='n3735' class='stm run hide_run'><a href='#n3735'>3735</a></p>
  3792. <p id='n3736' class='pln'><a href='#n3736'>3736</a></p>
  3793. <p id='n3737' class='pln'><a href='#n3737'>3737</a></p>
  3794. <p id='n3738' class='stm run hide_run'><a href='#n3738'>3738</a></p>
  3795. <p id='n3739' class='pln'><a href='#n3739'>3739</a></p>
  3796. <p id='n3740' class='pln'><a href='#n3740'>3740</a></p>
  3797. <p id='n3741' class='pln'><a href='#n3741'>3741</a></p>
  3798. <p id='n3742' class='stm mis'><a href='#n3742'>3742</a></p>
  3799. <p id='n3743' class='pln'><a href='#n3743'>3743</a></p>
  3800. <p id='n3744' class='pln'><a href='#n3744'>3744</a></p>
  3801. <p id='n3745' class='pln'><a href='#n3745'>3745</a></p>
  3802. <p id='n3746' class='pln'><a href='#n3746'>3746</a></p>
  3803. <p id='n3747' class='pln'><a href='#n3747'>3747</a></p>
  3804. <p id='n3748' class='pln'><a href='#n3748'>3748</a></p>
  3805. <p id='n3749' class='pln'><a href='#n3749'>3749</a></p>
  3806. <p id='n3750' class='pln'><a href='#n3750'>3750</a></p>
  3807. <p id='n3751' class='pln'><a href='#n3751'>3751</a></p>
  3808. <p id='n3752' class='pln'><a href='#n3752'>3752</a></p>
  3809. <p id='n3753' class='pln'><a href='#n3753'>3753</a></p>
  3810. <p id='n3754' class='pln'><a href='#n3754'>3754</a></p>
  3811. <p id='n3755' class='pln'><a href='#n3755'>3755</a></p>
  3812. <p id='n3756' class='pln'><a href='#n3756'>3756</a></p>
  3813. <p id='n3757' class='pln'><a href='#n3757'>3757</a></p>
  3814. <p id='n3758' class='pln'><a href='#n3758'>3758</a></p>
  3815. <p id='n3759' class='pln'><a href='#n3759'>3759</a></p>
  3816. <p id='n3760' class='pln'><a href='#n3760'>3760</a></p>
  3817. <p id='n3761' class='pln'><a href='#n3761'>3761</a></p>
  3818. <p id='n3762' class='pln'><a href='#n3762'>3762</a></p>
  3819. <p id='n3763' class='pln'><a href='#n3763'>3763</a></p>
  3820. <p id='n3764' class='pln'><a href='#n3764'>3764</a></p>
  3821. <p id='n3765' class='pln'><a href='#n3765'>3765</a></p>
  3822. <p id='n3766' class='pln'><a href='#n3766'>3766</a></p>
  3823. <p id='n3767' class='pln'><a href='#n3767'>3767</a></p>
  3824. <p id='n3768' class='pln'><a href='#n3768'>3768</a></p>
  3825. <p id='n3769' class='pln'><a href='#n3769'>3769</a></p>
  3826. <p id='n3770' class='pln'><a href='#n3770'>3770</a></p>
  3827. <p id='n3771' class='pln'><a href='#n3771'>3771</a></p>
  3828. <p id='n3772' class='pln'><a href='#n3772'>3772</a></p>
  3829. <p id='n3773' class='pln'><a href='#n3773'>3773</a></p>
  3830. <p id='n3774' class='pln'><a href='#n3774'>3774</a></p>
  3831. <p id='n3775' class='pln'><a href='#n3775'>3775</a></p>
  3832. <p id='n3776' class='pln'><a href='#n3776'>3776</a></p>
  3833. <p id='n3777' class='pln'><a href='#n3777'>3777</a></p>
  3834. <p id='n3778' class='pln'><a href='#n3778'>3778</a></p>
  3835. <p id='n3779' class='pln'><a href='#n3779'>3779</a></p>
  3836. <p id='n3780' class='pln'><a href='#n3780'>3780</a></p>
  3837. <p id='n3781' class='pln'><a href='#n3781'>3781</a></p>
  3838. <p id='n3782' class='pln'><a href='#n3782'>3782</a></p>
  3839. </td>
  3840. <td class='text' valign='top'>
  3841. <p id='t1' class='pln'><span class='com'>#!/usr/bin/env python</span><span class='strut'>&nbsp;</span></p>
  3842. <p id='t2' class='pln'><span class='com'># -*- coding: utf-8 -*-</span><span class='strut'>&nbsp;</span></p>
  3843. <p id='t3' class='pln'><span class='strut'>&nbsp;</span></p>
  3844. <p id='t4' class='stm run hide_run'><span class='key'>from</span> <span class='nam'>__future__</span> <span class='key'>import</span> <span class='nam'>absolute_import</span><span class='strut'>&nbsp;</span></p>
  3845. <p id='t5' class='pln'><span class='strut'>&nbsp;</span></p>
  3846. <p id='t6' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>base64</span><span class='strut'>&nbsp;</span></p>
  3847. <p id='t7' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>datetime</span><span class='strut'>&nbsp;</span></p>
  3848. <p id='t8' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>netrc</span><span class='strut'>&nbsp;</span></p>
  3849. <p id='t9' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>os</span><span class='strut'>&nbsp;</span></p>
  3850. <p id='t10' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>re</span><span class='strut'>&nbsp;</span></p>
  3851. <p id='t11' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>socket</span><span class='strut'>&nbsp;</span></p>
  3852. <p id='t12' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>time</span><span class='strut'>&nbsp;</span></p>
  3853. <p id='t13' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>email</span><span class='op'>.</span><span class='nam'>utils</span><span class='strut'>&nbsp;</span></p>
  3854. <p id='t14' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='strut'>&nbsp;</span></p>
  3855. <p id='t15' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>random</span><span class='strut'>&nbsp;</span></p>
  3856. <p id='t16' class='stm run hide_run'><span class='key'>import</span> <span class='nam'>math</span><span class='strut'>&nbsp;</span></p>
  3857. <p id='t17' class='pln'><span class='strut'>&nbsp;</span></p>
  3858. <p id='t18' class='stm run hide_run'><span class='key'>from</span> <span class='op'>.</span><span class='nam'>utils</span> <span class='key'>import</span> <span class='op'>*</span><span class='strut'>&nbsp;</span></p>
  3859. <p id='t19' class='pln'><span class='strut'>&nbsp;</span></p>
  3860. <p id='t20' class='pln'><span class='strut'>&nbsp;</span></p>
  3861. <p id='t21' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>InfoExtractor</span><span class='op'>(</span><span class='nam'>object</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3862. <p id='t22' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor class.</span><span class='strut'>&nbsp;</span></p>
  3863. <p id='t23' class='pln'><span class='strut'>&nbsp;</span></p>
  3864. <p id='t24' class='pln'><span class='str'>&nbsp; &nbsp; Information extractors are the classes that, given a URL, extract</span><span class='strut'>&nbsp;</span></p>
  3865. <p id='t25' class='pln'><span class='str'>&nbsp; &nbsp; information about the video (or videos) the URL refers to. This</span><span class='strut'>&nbsp;</span></p>
  3866. <p id='t26' class='pln'><span class='str'>&nbsp; &nbsp; information includes the real video URL, the video title, author and</span><span class='strut'>&nbsp;</span></p>
  3867. <p id='t27' class='pln'><span class='str'>&nbsp; &nbsp; others. The information is stored in a dictionary which is then</span><span class='strut'>&nbsp;</span></p>
  3868. <p id='t28' class='pln'><span class='str'>&nbsp; &nbsp; passed to the FileDownloader. The FileDownloader processes this</span><span class='strut'>&nbsp;</span></p>
  3869. <p id='t29' class='pln'><span class='str'>&nbsp; &nbsp; information possibly downloading the video to the file system, among</span><span class='strut'>&nbsp;</span></p>
  3870. <p id='t30' class='pln'><span class='str'>&nbsp; &nbsp; other possible outcomes.</span><span class='strut'>&nbsp;</span></p>
  3871. <p id='t31' class='pln'><span class='strut'>&nbsp;</span></p>
  3872. <p id='t32' class='pln'><span class='str'>&nbsp; &nbsp; The dictionaries must include the following fields:</span><span class='strut'>&nbsp;</span></p>
  3873. <p id='t33' class='pln'><span class='strut'>&nbsp;</span></p>
  3874. <p id='t34' class='pln'><span class='str'>&nbsp; &nbsp; id:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Video identifier.</span><span class='strut'>&nbsp;</span></p>
  3875. <p id='t35' class='pln'><span class='str'>&nbsp; &nbsp; url:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Final video URL.</span><span class='strut'>&nbsp;</span></p>
  3876. <p id='t36' class='pln'><span class='str'>&nbsp; &nbsp; title:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Video title, unescaped.</span><span class='strut'>&nbsp;</span></p>
  3877. <p id='t37' class='pln'><span class='str'>&nbsp; &nbsp; ext:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Video filename extension.</span><span class='strut'>&nbsp;</span></p>
  3878. <p id='t38' class='pln'><span class='str'>&nbsp; &nbsp; uploader:&nbsp; &nbsp; &nbsp;&nbsp; Full name of the video uploader.</span><span class='strut'>&nbsp;</span></p>
  3879. <p id='t39' class='pln'><span class='str'>&nbsp; &nbsp; upload_date:&nbsp; &nbsp; Video upload date (YYYYMMDD).</span><span class='strut'>&nbsp;</span></p>
  3880. <p id='t40' class='pln'><span class='strut'>&nbsp;</span></p>
  3881. <p id='t41' class='pln'><span class='str'>&nbsp; &nbsp; The following fields are optional:</span><span class='strut'>&nbsp;</span></p>
  3882. <p id='t42' class='pln'><span class='strut'>&nbsp;</span></p>
  3883. <p id='t43' class='pln'><span class='str'>&nbsp; &nbsp; format:&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; The video format, defaults to ext (used for --get-format)</span><span class='strut'>&nbsp;</span></p>
  3884. <p id='t44' class='pln'><span class='str'>&nbsp; &nbsp; thumbnail:&nbsp; &nbsp; &nbsp; Full URL to a video thumbnail image.</span><span class='strut'>&nbsp;</span></p>
  3885. <p id='t45' class='pln'><span class='str'>&nbsp; &nbsp; description:&nbsp; &nbsp; One-line video description.</span><span class='strut'>&nbsp;</span></p>
  3886. <p id='t46' class='pln'><span class='str'>&nbsp; &nbsp; uploader_id:&nbsp; &nbsp; Nickname or id of the video uploader.</span><span class='strut'>&nbsp;</span></p>
  3887. <p id='t47' class='pln'><span class='str'>&nbsp; &nbsp; player_url:&nbsp; &nbsp;&nbsp; SWF Player URL (used for rtmpdump).</span><span class='strut'>&nbsp;</span></p>
  3888. <p id='t48' class='pln'><span class='str'>&nbsp; &nbsp; subtitles:&nbsp; &nbsp; &nbsp; The .srt file contents.</span><span class='strut'>&nbsp;</span></p>
  3889. <p id='t49' class='pln'><span class='str'>&nbsp; &nbsp; urlhandle:&nbsp; &nbsp; &nbsp; [internal] The urlHandle to be used to download the file,</span><span class='strut'>&nbsp;</span></p>
  3890. <p id='t50' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; like returned by urllib.request.urlopen</span><span class='strut'>&nbsp;</span></p>
  3891. <p id='t51' class='pln'><span class='strut'>&nbsp;</span></p>
  3892. <p id='t52' class='pln'><span class='str'>&nbsp; &nbsp; The fields should all be Unicode strings.</span><span class='strut'>&nbsp;</span></p>
  3893. <p id='t53' class='pln'><span class='strut'>&nbsp;</span></p>
  3894. <p id='t54' class='pln'><span class='str'>&nbsp; &nbsp; Subclasses of this one should re-define the _real_initialize() and</span><span class='strut'>&nbsp;</span></p>
  3895. <p id='t55' class='pln'><span class='str'>&nbsp; &nbsp; _real_extract() methods and define a _VALID_URL regexp.</span><span class='strut'>&nbsp;</span></p>
  3896. <p id='t56' class='pln'><span class='str'>&nbsp; &nbsp; Probably, they should also be added to the list of extractors.</span><span class='strut'>&nbsp;</span></p>
  3897. <p id='t57' class='pln'><span class='strut'>&nbsp;</span></p>
  3898. <p id='t58' class='pln'><span class='str'>&nbsp; &nbsp; _real_extract() must return a *list* of information dictionaries as</span><span class='strut'>&nbsp;</span></p>
  3899. <p id='t59' class='pln'><span class='str'>&nbsp; &nbsp; described above.</span><span class='strut'>&nbsp;</span></p>
  3900. <p id='t60' class='pln'><span class='strut'>&nbsp;</span></p>
  3901. <p id='t61' class='pln'><span class='str'>&nbsp; &nbsp; Finally, the _WORKING attribute should be set to False for broken IEs</span><span class='strut'>&nbsp;</span></p>
  3902. <p id='t62' class='pln'><span class='str'>&nbsp; &nbsp; in order to warn the users and skip the tests.</span><span class='strut'>&nbsp;</span></p>
  3903. <p id='t63' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3904. <p id='t64' class='pln'><span class='strut'>&nbsp;</span></p>
  3905. <p id='t65' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_ready</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  3906. <p id='t66' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_downloader</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  3907. <p id='t67' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
  3908. <p id='t68' class='pln'><span class='strut'>&nbsp;</span></p>
  3909. <p id='t69' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3910. <p id='t70' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Constructor. Receives an optional downloader.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3911. <p id='t71' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_ready</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  3912. <p id='t72' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>set_downloader</span><span class='op'>(</span><span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3913. <p id='t73' class='pln'><span class='strut'>&nbsp;</span></p>
  3914. <p id='t74' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>suitable</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3915. <p id='t75' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Receives a URL and returns True if suitable for this IE.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3916. <p id='t76' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  3917. <p id='t77' class='pln'><span class='strut'>&nbsp;</span></p>
  3918. <p id='t78' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>working</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3919. <p id='t79' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Getter method for _WORKING.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3920. <p id='t80' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_WORKING</span><span class='strut'>&nbsp;</span></p>
  3921. <p id='t81' class='pln'><span class='strut'>&nbsp;</span></p>
  3922. <p id='t82' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>initialize</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3923. <p id='t83' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Initializes an instance (authentication, etc).&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3924. <p id='t84' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_ready</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3925. <p id='t85' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_real_initialize</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3926. <p id='t86' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_ready</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
  3927. <p id='t87' class='pln'><span class='strut'>&nbsp;</span></p>
  3928. <p id='t88' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3929. <p id='t89' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Extracts URL information and returns it in list of dicts.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3930. <p id='t90' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>initialize</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3931. <p id='t91' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3932. <p id='t92' class='pln'><span class='strut'>&nbsp;</span></p>
  3933. <p id='t93' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>set_downloader</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3934. <p id='t94' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Sets the downloader for this IE.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3935. <p id='t95' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span> <span class='op'>=</span> <span class='nam'>downloader</span><span class='strut'>&nbsp;</span></p>
  3936. <p id='t96' class='pln'><span class='strut'>&nbsp;</span></p>
  3937. <p id='t97' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_initialize</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3938. <p id='t98' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Real initialization process. Redefine in subclasses.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3939. <p id='t99' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
  3940. <p id='t100' class='pln'><span class='strut'>&nbsp;</span></p>
  3941. <p id='t101' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3942. <p id='t102' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Real extraction process. Redefine in subclasses.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3943. <p id='t103' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
  3944. <p id='t104' class='pln'><span class='strut'>&nbsp;</span></p>
  3945. <p id='t105' class='stm run hide_run'>&nbsp; &nbsp; <span class='op'>@</span><span class='nam'>property</span><span class='strut'>&nbsp;</span></p>
  3946. <p id='t106' class='pln'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>IE_NAME</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3947. <p id='t107' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>type</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>__name__</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  3948. <p id='t108' class='pln'><span class='strut'>&nbsp;</span></p>
  3949. <p id='t109' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url_or_request</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>note</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>errnote</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3950. <p id='t110' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>note</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3951. <p id='t111' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>note</span> <span class='op'>=</span> <span class='str'>u&#39;Downloading video webpage&#39;</span><span class='strut'>&nbsp;</span></p>
  3952. <p id='t112' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>note</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3953. <p id='t113' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3954. <p id='t114' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url_or_request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3955. <p id='t115' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage_bytes</span> <span class='op'>=</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3956. <p id='t116' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>,</span> <span class='str'>&#39;replace&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3957. <p id='t117' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3958. <p id='t118' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>errnote</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3959. <p id='t119' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>errnote</span> <span class='op'>=</span> <span class='str'>u&#39;Unable to download webpage&#39;</span><span class='strut'>&nbsp;</span></p>
  3960. <p id='t120' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ExtractorError</span><span class='op'>(</span><span class='str'>u&#39;%s: %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>errnote</span><span class='op'>,</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  3961. <p id='t121' class='pln'><span class='strut'>&nbsp;</span></p>
  3962. <p id='t122' class='pln'><span class='strut'>&nbsp;</span></p>
  3963. <p id='t123' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoutubeIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  3964. <p id='t124' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for youtube.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3965. <p id='t125' class='pln'><span class='strut'>&nbsp;</span></p>
  3966. <p id='t126' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&quot;&quot;&quot;^</span><span class='strut'>&nbsp;</span></p>
  3967. <p id='t127' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (</span><span class='strut'>&nbsp;</span></p>
  3968. <p id='t128' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:https?://)?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # http(s):// (optional)</span><span class='strut'>&nbsp;</span></p>
  3969. <p id='t129' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:youtu\.be/|(?:\w+\.)?youtube(?:-nocookie)?\.com/|</span><span class='strut'>&nbsp;</span></p>
  3970. <p id='t130' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tube\.majestyc\.net/)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # the various hostnames, with wildcard subdomains</span><span class='strut'>&nbsp;</span></p>
  3971. <p id='t131' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:.*?\#/)?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # handle anchor (#/) redirect urls</span><span class='strut'>&nbsp;</span></p>
  3972. <p id='t132' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?!view_play_list|my_playlists|artist|playlist)&nbsp; &nbsp; &nbsp; # ignore playlist URLs</span><span class='strut'>&nbsp;</span></p>
  3973. <p id='t133' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # the various things that can precede the ID:</span><span class='strut'>&nbsp;</span></p>
  3974. <p id='t134' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:(?:v|embed|e)/)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # v/ or embed/ or e/</span><span class='strut'>&nbsp;</span></p>
  3975. <p id='t135' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |(?:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # or the v= param in all its forms</span><span class='strut'>&nbsp;</span></p>
  3976. <p id='t136' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:watch(?:_popup)?(?:\.php)?)?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # preceding watch(_popup|.php) or nothing (like /?v=xxxx)</span><span class='strut'>&nbsp;</span></p>
  3977. <p id='t137' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:\?|\#!?)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # the params delimiter ? or # or #!</span><span class='strut'>&nbsp;</span></p>
  3978. <p id='t138' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?:.*?&amp;)?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # any other preceding param (like /?s=tuff&amp;v=xxxx)</span><span class='strut'>&nbsp;</span></p>
  3979. <p id='t139' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; v=</span><span class='strut'>&nbsp;</span></p>
  3980. <p id='t140' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; )</span><span class='strut'>&nbsp;</span></p>
  3981. <p id='t141' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; )?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # optional -&gt; youtube.com/xxxx is OK</span><span class='strut'>&nbsp;</span></p>
  3982. <p id='t142' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; )?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # all until now is optional -&gt; you can pass the naked ID</span><span class='strut'>&nbsp;</span></p>
  3983. <p id='t143' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ([0-9A-Za-z_-]+)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # here is it! the YouTube video ID</span><span class='strut'>&nbsp;</span></p>
  3984. <p id='t144' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (?(1).+)?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # if we found the ID, everything can follow</span><span class='strut'>&nbsp;</span></p>
  3985. <p id='t145' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; $&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  3986. <p id='t146' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_LANG_URL</span> <span class='op'>=</span> <span class='str'>r&#39;http://www.youtube.com/?hl=en&amp;persist_hl=1&amp;gl=US&amp;persist_gl=1&amp;opt_out_ackd=1&#39;</span><span class='strut'>&nbsp;</span></p>
  3987. <p id='t147' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_LOGIN_URL</span> <span class='op'>=</span> <span class='str'>&#39;https://www.youtube.com/signup?next=/&amp;gl=US&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  3988. <p id='t148' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_AGE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://www.youtube.com/verify_age?next_url=/&amp;gl=US&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  3989. <p id='t149' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_NEXT_URL_RE</span> <span class='op'>=</span> <span class='str'>r&#39;[\?&amp;]next_url=([^&amp;]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  3990. <p id='t150' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_NETRC_MACHINE</span> <span class='op'>=</span> <span class='str'>&#39;youtube&#39;</span><span class='strut'>&nbsp;</span></p>
  3991. <p id='t151' class='pln'>&nbsp; &nbsp; <span class='com'># Listed in order of quality</span><span class='strut'>&nbsp;</span></p>
  3992. <p id='t152' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_available_formats</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;38&#39;</span><span class='op'>,</span> <span class='str'>&#39;37&#39;</span><span class='op'>,</span> <span class='str'>&#39;46&#39;</span><span class='op'>,</span> <span class='str'>&#39;22&#39;</span><span class='op'>,</span> <span class='str'>&#39;45&#39;</span><span class='op'>,</span> <span class='str'>&#39;35&#39;</span><span class='op'>,</span> <span class='str'>&#39;44&#39;</span><span class='op'>,</span> <span class='str'>&#39;34&#39;</span><span class='op'>,</span> <span class='str'>&#39;18&#39;</span><span class='op'>,</span> <span class='str'>&#39;43&#39;</span><span class='op'>,</span> <span class='str'>&#39;6&#39;</span><span class='op'>,</span> <span class='str'>&#39;5&#39;</span><span class='op'>,</span> <span class='str'>&#39;17&#39;</span><span class='op'>,</span> <span class='str'>&#39;13&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  3993. <p id='t153' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_available_formats_prefer_free</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;38&#39;</span><span class='op'>,</span> <span class='str'>&#39;46&#39;</span><span class='op'>,</span> <span class='str'>&#39;37&#39;</span><span class='op'>,</span> <span class='str'>&#39;45&#39;</span><span class='op'>,</span> <span class='str'>&#39;22&#39;</span><span class='op'>,</span> <span class='str'>&#39;44&#39;</span><span class='op'>,</span> <span class='str'>&#39;35&#39;</span><span class='op'>,</span> <span class='str'>&#39;43&#39;</span><span class='op'>,</span> <span class='str'>&#39;34&#39;</span><span class='op'>,</span> <span class='str'>&#39;18&#39;</span><span class='op'>,</span> <span class='str'>&#39;6&#39;</span><span class='op'>,</span> <span class='str'>&#39;5&#39;</span><span class='op'>,</span> <span class='str'>&#39;17&#39;</span><span class='op'>,</span> <span class='str'>&#39;13&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  3994. <p id='t154' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_video_extensions</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  3995. <p id='t155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;13&#39;</span><span class='op'>:</span> <span class='str'>&#39;3gp&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  3996. <p id='t156' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;17&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  3997. <p id='t157' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;18&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  3998. <p id='t158' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;22&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  3999. <p id='t159' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;37&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4000. <p id='t160' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;38&#39;</span><span class='op'>:</span> <span class='str'>&#39;video&#39;</span><span class='op'>,</span> <span class='com'># You actually don&#39;t know if this will be MOV, AVI or whatever</span><span class='strut'>&nbsp;</span></p>
  4001. <p id='t161' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;43&#39;</span><span class='op'>:</span> <span class='str'>&#39;webm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4002. <p id='t162' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;44&#39;</span><span class='op'>:</span> <span class='str'>&#39;webm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4003. <p id='t163' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;45&#39;</span><span class='op'>:</span> <span class='str'>&#39;webm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4004. <p id='t164' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;46&#39;</span><span class='op'>:</span> <span class='str'>&#39;webm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4005. <p id='t165' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4006. <p id='t166' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_video_dimensions</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4007. <p id='t167' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;5&#39;</span><span class='op'>:</span> <span class='str'>&#39;240x400&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4008. <p id='t168' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;6&#39;</span><span class='op'>:</span> <span class='str'>&#39;???&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4009. <p id='t169' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;13&#39;</span><span class='op'>:</span> <span class='str'>&#39;???&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4010. <p id='t170' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;17&#39;</span><span class='op'>:</span> <span class='str'>&#39;144x176&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4011. <p id='t171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;18&#39;</span><span class='op'>:</span> <span class='str'>&#39;360x640&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4012. <p id='t172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;22&#39;</span><span class='op'>:</span> <span class='str'>&#39;720x1280&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4013. <p id='t173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;34&#39;</span><span class='op'>:</span> <span class='str'>&#39;360x640&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4014. <p id='t174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;35&#39;</span><span class='op'>:</span> <span class='str'>&#39;480x854&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4015. <p id='t175' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;37&#39;</span><span class='op'>:</span> <span class='str'>&#39;1080x1920&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4016. <p id='t176' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;38&#39;</span><span class='op'>:</span> <span class='str'>&#39;3072x4096&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4017. <p id='t177' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;43&#39;</span><span class='op'>:</span> <span class='str'>&#39;360x640&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4018. <p id='t178' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;44&#39;</span><span class='op'>:</span> <span class='str'>&#39;480x854&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4019. <p id='t179' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;45&#39;</span><span class='op'>:</span> <span class='str'>&#39;720x1280&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4020. <p id='t180' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;46&#39;</span><span class='op'>:</span> <span class='str'>&#39;1080x1920&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4021. <p id='t181' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4022. <p id='t182' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;youtube&#39;</span><span class='strut'>&nbsp;</span></p>
  4023. <p id='t183' class='pln'><span class='strut'>&nbsp;</span></p>
  4024. <p id='t184' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>suitable</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4025. <p id='t185' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Receives a URL and returns True if suitable for this IE.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4026. <p id='t186' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4027. <p id='t187' class='pln'><span class='strut'>&nbsp;</span></p>
  4028. <p id='t188' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_lang</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4029. <p id='t189' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to set language.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4030. <p id='t190' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Setting language&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4031. <p id='t191' class='pln'><span class='strut'>&nbsp;</span></p>
  4032. <p id='t192' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_login</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4033. <p id='t193' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to log in.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4034. <p id='t194' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Logging in&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4035. <p id='t195' class='pln'><span class='strut'>&nbsp;</span></p>
  4036. <p id='t196' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_age_confirmation</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4037. <p id='t197' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to confirm age.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4038. <p id='t198' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Confirming age&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4039. <p id='t199' class='pln'><span class='strut'>&nbsp;</span></p>
  4040. <p id='t200' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_video_webpage_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4041. <p id='t201' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download video webpage.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4042. <p id='t202' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] %s: Downloading video webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4043. <p id='t203' class='pln'><span class='strut'>&nbsp;</span></p>
  4044. <p id='t204' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_video_info_webpage_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4045. <p id='t205' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download video info webpage.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4046. <p id='t206' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] %s: Downloading video info webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4047. <p id='t207' class='pln'><span class='strut'>&nbsp;</span></p>
  4048. <p id='t208' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_video_subtitles_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4049. <p id='t209' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download video info webpage.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4050. <p id='t210' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] %s: Downloading video subtitles&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4051. <p id='t211' class='pln'><span class='strut'>&nbsp;</span></p>
  4052. <p id='t212' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_information_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4053. <p id='t213' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to extract video information.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4054. <p id='t214' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] %s: Extracting video information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4055. <p id='t215' class='pln'><span class='strut'>&nbsp;</span></p>
  4056. <p id='t216' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_unavailable_format</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4057. <p id='t217' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report extracted video URL.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4058. <p id='t218' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] %s: Format %s not available&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>format</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4059. <p id='t219' class='pln'><span class='strut'>&nbsp;</span></p>
  4060. <p id='t220' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_rtmp_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4061. <p id='t221' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Indicate the download will use the RTMP protocol.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4062. <p id='t222' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] RTMP download detected&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4063. <p id='t223' class='pln'><span class='strut'>&nbsp;</span></p>
  4064. <p id='t224' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_closed_captions_xml_to_srt</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>xml_string</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4065. <p id='t225' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  4066. <p id='t226' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>texts</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>r&#39;&lt;text start=&quot;([\d\.]+)&quot;( dur=&quot;([\d\.]+)&quot;)?&gt;([^&lt;]+)&lt;/text&gt;&#39;</span><span class='op'>,</span> <span class='nam'>xml_string</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>MULTILINE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4067. <p id='t227' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO parse xml instead of regex</span><span class='strut'>&nbsp;</span></p>
  4068. <p id='t228' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>n</span><span class='op'>,</span> <span class='op'>(</span><span class='nam'>start</span><span class='op'>,</span> <span class='nam'>dur_tag</span><span class='op'>,</span> <span class='nam'>dur</span><span class='op'>,</span> <span class='nam'>caption</span><span class='op'>)</span> <span class='key'>in</span> <span class='nam'>enumerate</span><span class='op'>(</span><span class='nam'>texts</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4069. <p id='t229' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>dur</span><span class='op'>:</span> <span class='nam'>dur</span> <span class='op'>=</span> <span class='str'>&#39;4&#39;</span><span class='strut'>&nbsp;</span></p>
  4070. <p id='t230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>start</span> <span class='op'>=</span> <span class='nam'>float</span><span class='op'>(</span><span class='nam'>start</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4071. <p id='t231' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>end</span> <span class='op'>=</span> <span class='nam'>start</span> <span class='op'>+</span> <span class='nam'>float</span><span class='op'>(</span><span class='nam'>dur</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4072. <p id='t232' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>start</span> <span class='op'>=</span> <span class='str'>&quot;%02i:%02i:%02i,%03i&quot;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>start</span><span class='op'>/</span><span class='op'>(</span><span class='num'>60</span><span class='op'>*</span><span class='num'>60</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>start</span><span class='op'>/</span><span class='num'>60</span><span class='op'>%</span><span class='num'>60</span><span class='op'>,</span> <span class='nam'>start</span><span class='op'>%</span><span class='num'>60</span><span class='op'>,</span> <span class='nam'>start</span><span class='op'>%</span><span class='num'>1</span><span class='op'>*</span><span class='num'>1000</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4073. <p id='t233' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>end</span> <span class='op'>=</span> <span class='str'>&quot;%02i:%02i:%02i,%03i&quot;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>end</span><span class='op'>/</span><span class='op'>(</span><span class='num'>60</span><span class='op'>*</span><span class='num'>60</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>end</span><span class='op'>/</span><span class='num'>60</span><span class='op'>%</span><span class='num'>60</span><span class='op'>,</span> <span class='nam'>end</span><span class='op'>%</span><span class='num'>60</span><span class='op'>,</span> <span class='nam'>end</span><span class='op'>%</span><span class='num'>1</span><span class='op'>*</span><span class='num'>1000</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4074. <p id='t234' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>caption</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>caption</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4075. <p id='t235' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>caption</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>caption</span><span class='op'>)</span> <span class='com'># double cycle, intentional</span><span class='strut'>&nbsp;</span></p>
  4076. <p id='t236' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt</span> <span class='op'>+=</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>n</span><span class='op'>+</span><span class='num'>1</span><span class='op'>)</span> <span class='op'>+</span> <span class='str'>&#39;\n&#39;</span><span class='strut'>&nbsp;</span></p>
  4077. <p id='t237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt</span> <span class='op'>+=</span> <span class='nam'>start</span> <span class='op'>+</span> <span class='str'>&#39; --&gt; &#39;</span> <span class='op'>+</span> <span class='nam'>end</span> <span class='op'>+</span> <span class='str'>&#39;\n&#39;</span><span class='strut'>&nbsp;</span></p>
  4078. <p id='t238' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt</span> <span class='op'>+=</span> <span class='nam'>caption</span> <span class='op'>+</span> <span class='str'>&#39;\n\n&#39;</span><span class='strut'>&nbsp;</span></p>
  4079. <p id='t239' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>srt</span><span class='strut'>&nbsp;</span></p>
  4080. <p id='t240' class='pln'><span class='strut'>&nbsp;</span></p>
  4081. <p id='t241' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_extract_subtitles</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4082. <p id='t242' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_video_subtitles_download</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4083. <p id='t243' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='str'>&#39;http://video.google.com/timedtext?hl=en&amp;type=list&amp;v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4084. <p id='t244' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4085. <p id='t245' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_list</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4086. <p id='t246' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4087. <p id='t247' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='str'>u&#39;WARNING: unable to download video subtitles: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4088. <p id='t248' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_lang_list</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>r&#39;name=&quot;([^&quot;]*)&quot;[^&gt;]+lang_code=&quot;([\w\-]+)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>srt_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4089. <p id='t249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_lang_list</span> <span class='op'>=</span> <span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>srt_lang_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4090. <p id='t250' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>srt_lang_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4091. <p id='t251' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='str'>u&#39;WARNING: video has no closed captions&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4092. <p id='t252' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;subtitleslang&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4093. <p id='t253' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_lang</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;subtitleslang&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4094. <p id='t254' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='str'>&#39;en&#39;</span> <span class='key'>in</span> <span class='nam'>srt_lang_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4095. <p id='t255' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_lang</span> <span class='op'>=</span> <span class='str'>&#39;en&#39;</span><span class='strut'>&nbsp;</span></p>
  4096. <p id='t256' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4097. <p id='t257' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_lang</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>srt_lang_list</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4098. <p id='t258' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>srt_lang</span> <span class='key'>in</span> <span class='nam'>srt_lang_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4099. <p id='t259' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='str'>u&#39;WARNING: no closed captions found in the specified language&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4100. <p id='t260' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='str'>&#39;http://www.youtube.com/api/timedtext?lang=%s&amp;name=%s&amp;v=%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>srt_lang</span><span class='op'>,</span> <span class='nam'>srt_lang_list</span><span class='op'>[</span><span class='nam'>srt_lang</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4101. <p id='t261' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4102. <p id='t262' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>srt_xml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4103. <p id='t263' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4104. <p id='t264' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='str'>u&#39;WARNING: unable to download video subtitles: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4105. <p id='t265' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>srt_xml</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4106. <p id='t266' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='str'>u&#39;WARNING: unable to download video subtitles&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4107. <p id='t267' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_closed_captions_xml_to_srt</span><span class='op'>(</span><span class='nam'>srt_xml</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4108. <p id='t268' class='pln'><span class='strut'>&nbsp;</span></p>
  4109. <p id='t269' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_print_formats</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>formats</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4110. <p id='t270' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;Available formats:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4111. <p id='t271' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4112. <p id='t272' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;%s\t:\t%s\t[%s]&#39;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_extensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='str'>&#39;flv&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_dimensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='str'>&#39;???&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4113. <p id='t273' class='pln'><span class='strut'>&nbsp;</span></p>
  4114. <p id='t274' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_initialize</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4115. <p id='t275' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4116. <p id='t276' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4117. <p id='t277' class='pln'><span class='strut'>&nbsp;</span></p>
  4118. <p id='t278' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4119. <p id='t279' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4120. <p id='t280' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>downloader_params</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='strut'>&nbsp;</span></p>
  4121. <p id='t281' class='pln'><span class='strut'>&nbsp;</span></p>
  4122. <p id='t282' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Attempt to use provided username and password or .netrc data</span><span class='strut'>&nbsp;</span></p>
  4123. <p id='t283' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>downloader_params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;username&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4124. <p id='t284' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>downloader_params</span><span class='op'>[</span><span class='str'>&#39;username&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4125. <p id='t285' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>downloader_params</span><span class='op'>[</span><span class='str'>&#39;password&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4126. <p id='t286' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>downloader_params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;usenetrc&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4127. <p id='t287' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4128. <p id='t288' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>netrc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>authenticators</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_NETRC_MACHINE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4129. <p id='t289' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>info</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4130. <p id='t290' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4131. <p id='t291' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4132. <p id='t292' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4133. <p id='t293' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>NetrcParseError</span><span class='op'>(</span><span class='str'>&#39;No authenticators for %s&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_NETRC_MACHINE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4134. <p id='t294' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>NetrcParseError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4135. <p id='t295' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: parsing .netrc: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4136. <p id='t296' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4137. <p id='t297' class='pln'><span class='strut'>&nbsp;</span></p>
  4138. <p id='t298' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Set language</span><span class='strut'>&nbsp;</span></p>
  4139. <p id='t299' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_LANG_URL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4140. <p id='t300' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4141. <p id='t301' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_lang</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4142. <p id='t302' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4143. <p id='t303' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4144. <p id='t304' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to set language: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4145. <p id='t305' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4146. <p id='t306' class='pln'><span class='strut'>&nbsp;</span></p>
  4147. <p id='t307' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># No authentication to be performed</span><span class='strut'>&nbsp;</span></p>
  4148. <p id='t308' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>username</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4149. <p id='t309' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4150. <p id='t310' class='pln'><span class='strut'>&nbsp;</span></p>
  4151. <p id='t311' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Log in</span><span class='strut'>&nbsp;</span></p>
  4152. <p id='t312' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>login_form</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4153. <p id='t313' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;current_form&#39;</span><span class='op'>:</span> <span class='str'>&#39;loginForm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4154. <p id='t314' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;next&#39;</span><span class='op'>:</span>&nbsp; &nbsp;&nbsp; <span class='str'>&#39;/&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4155. <p id='t315' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;action_login&#39;</span><span class='op'>:</span> <span class='str'>&#39;Log In&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4156. <p id='t316' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;username&#39;</span><span class='op'>:</span> <span class='nam'>username</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4157. <p id='t317' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;password&#39;</span><span class='op'>:</span> <span class='nam'>password</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4158. <p id='t318' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4159. <p id='t319' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_LOGIN_URL</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='nam'>login_form</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4160. <p id='t320' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4161. <p id='t321' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_login</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4162. <p id='t322' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>login_results</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4163. <p id='t323' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;(?i)&lt;form[^&gt;]* name=&quot;loginForm&quot;&#39;</span><span class='op'>,</span> <span class='nam'>login_results</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4164. <p id='t324' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to log in: bad username or password&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4165. <p id='t325' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4166. <p id='t326' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4167. <p id='t327' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to log in: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4168. <p id='t328' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4169. <p id='t329' class='pln'><span class='strut'>&nbsp;</span></p>
  4170. <p id='t330' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Confirm age</span><span class='strut'>&nbsp;</span></p>
  4171. <p id='t331' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>age_form</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4172. <p id='t332' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;next_url&#39;</span><span class='op'>:</span>&nbsp; &nbsp;&nbsp; <span class='str'>&#39;/&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4173. <p id='t333' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;action_confirm&#39;</span><span class='op'>:</span>&nbsp;&nbsp; <span class='str'>&#39;Confirm&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4174. <p id='t334' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4175. <p id='t335' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_AGE_URL</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='nam'>age_form</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4176. <p id='t336' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4177. <p id='t337' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_age_confirmation</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4178. <p id='t338' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>age_results</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4179. <p id='t339' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4180. <p id='t340' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to confirm age: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4181. <p id='t341' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4182. <p id='t342' class='pln'><span class='strut'>&nbsp;</span></p>
  4183. <p id='t343' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_extract_id</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4184. <p id='t344' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4185. <p id='t345' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4186. <p id='t346' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4187. <p id='t347' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4188. <p id='t348' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4189. <p id='t349' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  4190. <p id='t350' class='pln'><span class='strut'>&nbsp;</span></p>
  4191. <p id='t351' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4192. <p id='t352' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract original video URL from URL with redirection, like age verification, using next_url parameter</span><span class='strut'>&nbsp;</span></p>
  4193. <p id='t353' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_NEXT_URL_RE</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4194. <p id='t354' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4195. <p id='t355' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://www.youtube.com/&#39;</span> <span class='op'>+</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>lstrip</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4196. <p id='t356' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_extract_id</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4197. <p id='t357' class='pln'><span class='strut'>&nbsp;</span></p>
  4198. <p id='t358' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get video webpage</span><span class='strut'>&nbsp;</span></p>
  4199. <p id='t359' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_video_webpage_download</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4200. <p id='t360' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://www.youtube.com/watch?v=%s&amp;gl=US&amp;hl=en&amp;has_verified=1&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  4201. <p id='t361' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4202. <p id='t362' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4203. <p id='t363' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_webpage_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4204. <p id='t364' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4205. <p id='t365' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4206. <p id='t366' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4207. <p id='t367' class='pln'><span class='strut'>&nbsp;</span></p>
  4208. <p id='t368' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_webpage</span> <span class='op'>=</span> <span class='nam'>video_webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>,</span> <span class='str'>&#39;ignore&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4209. <p id='t369' class='pln'><span class='strut'>&nbsp;</span></p>
  4210. <p id='t370' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Attempt to extract SWF player URL</span><span class='strut'>&nbsp;</span></p>
  4211. <p id='t371' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;swfConfig.*?&quot;(http:\\/\\/.*?watch.*?-.*?\.swf)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4212. <p id='t372' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4213. <p id='t373' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>player_url</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='str'>r&#39;\\(.)&#39;</span><span class='op'>,</span> <span class='str'>r&#39;\1&#39;</span><span class='op'>,</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4214. <p id='t374' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4215. <p id='t375' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>player_url</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4216. <p id='t376' class='pln'><span class='strut'>&nbsp;</span></p>
  4217. <p id='t377' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get video info</span><span class='strut'>&nbsp;</span></p>
  4218. <p id='t378' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_video_info_webpage_download</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4219. <p id='t379' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>el_type</span> <span class='key'>in</span> <span class='op'>[</span><span class='str'>&#39;&amp;el=embedded&#39;</span><span class='op'>,</span> <span class='str'>&#39;&amp;el=detailpage&#39;</span><span class='op'>,</span> <span class='str'>&#39;&amp;el=vevo&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4220. <p id='t380' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info_url</span> <span class='op'>=</span> <span class='op'>(</span><span class='str'>&#39;http://www.youtube.com/get_video_info?&amp;video_id=%s%s&amp;ps=default&amp;eurl=&amp;gl=US&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  4221. <p id='t381' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>%</span> <span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>el_type</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4222. <p id='t382' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>video_info_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4223. <p id='t383' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4224. <p id='t384' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info_webpage_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4225. <p id='t385' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info_webpage</span> <span class='op'>=</span> <span class='nam'>video_info_webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>,</span> <span class='str'>&#39;ignore&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4226. <p id='t386' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info</span> <span class='op'>=</span> <span class='nam'>compat_parse_qs</span><span class='op'>(</span><span class='nam'>video_info_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4227. <p id='t387' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;token&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4228. <p id='t388' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  4229. <p id='t389' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4230. <p id='t390' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4231. <p id='t391' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4232. <p id='t392' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;token&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4233. <p id='t393' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;reason&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4234. <p id='t394' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: YouTube said: %s&#39;</span> <span class='op'>%</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;reason&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4235. <p id='t395' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4236. <p id='t396' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: &quot;token&quot; parameter not in video info for unknown reason&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4237. <p id='t397' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4238. <p id='t398' class='pln'><span class='strut'>&nbsp;</span></p>
  4239. <p id='t399' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Check for &quot;rental&quot; videos</span><span class='strut'>&nbsp;</span></p>
  4240. <p id='t400' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;ypc_video_rental_bar_text&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span> <span class='key'>and</span> <span class='str'>&#39;author&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4241. <p id='t401' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: &quot;rental&quot; videos not supported&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4242. <p id='t402' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4243. <p id='t403' class='pln'><span class='strut'>&nbsp;</span></p>
  4244. <p id='t404' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Start extracting information</span><span class='strut'>&nbsp;</span></p>
  4245. <p id='t405' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_information_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4246. <p id='t406' class='pln'><span class='strut'>&nbsp;</span></p>
  4247. <p id='t407' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># uploader</span><span class='strut'>&nbsp;</span></p>
  4248. <p id='t408' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;author&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4249. <p id='t409' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract uploader name&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4250. <p id='t410' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4251. <p id='t411' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;author&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4252. <p id='t412' class='pln'><span class='strut'>&nbsp;</span></p>
  4253. <p id='t413' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># uploader_id</span><span class='strut'>&nbsp;</span></p>
  4254. <p id='t414' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader_id</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4255. <p id='t415' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;link itemprop=&quot;url&quot; href=&quot;http://www.youtube.com/(?:user|channel)/([^&quot;]+)&quot;&gt;&#39;</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4256. <p id='t416' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4257. <p id='t417' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4258. <p id='t418' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4259. <p id='t419' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to extract uploader nickname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4260. <p id='t420' class='pln'><span class='strut'>&nbsp;</span></p>
  4261. <p id='t421' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># title</span><span class='strut'>&nbsp;</span></p>
  4262. <p id='t422' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;title&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4263. <p id='t423' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4264. <p id='t424' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4265. <p id='t425' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4266. <p id='t426' class='pln'><span class='strut'>&nbsp;</span></p>
  4267. <p id='t427' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># thumbnail image</span><span class='strut'>&nbsp;</span></p>
  4268. <p id='t428' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;thumbnail_url&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4269. <p id='t429' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to extract video thumbnail&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4270. <p id='t430' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  4271. <p id='t431' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span>&nbsp;&nbsp; <span class='com'># don&#39;t panic if we can&#39;t find it</span><span class='strut'>&nbsp;</span></p>
  4272. <p id='t432' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;thumbnail_url&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4273. <p id='t433' class='pln'><span class='strut'>&nbsp;</span></p>
  4274. <p id='t434' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># upload date</span><span class='strut'>&nbsp;</span></p>
  4275. <p id='t435' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4276. <p id='t436' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;id=&quot;eow-date.*?&gt;(.*?)&lt;/span&gt;&#39;</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4277. <p id='t437' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4278. <p id='t438' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='str'>&#39; &#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='str'>r&#39;[/,-]&#39;</span><span class='op'>,</span> <span class='str'>r&#39; &#39;</span><span class='op'>,</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4279. <p id='t439' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_expressions</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;%d %B %Y&#39;</span><span class='op'>,</span> <span class='str'>&#39;%B %d %Y&#39;</span><span class='op'>,</span> <span class='str'>&#39;%b %d %Y&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4280. <p id='t440' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>expression</span> <span class='key'>in</span> <span class='nam'>format_expressions</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4281. <p id='t441' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4282. <p id='t442' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>strptime</span><span class='op'>(</span><span class='nam'>upload_date</span><span class='op'>,</span> <span class='nam'>expression</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strftime</span><span class='op'>(</span><span class='str'>&#39;%Y%m%d&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4283. <p id='t443' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4284. <p id='t444' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
  4285. <p id='t445' class='pln'><span class='strut'>&nbsp;</span></p>
  4286. <p id='t446' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># description</span><span class='strut'>&nbsp;</span></p>
  4287. <p id='t447' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>get_element_by_id</span><span class='op'>(</span><span class='str'>&quot;eow-description&quot;</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4288. <p id='t448' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_description</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4289. <p id='t449' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>clean_html</span><span class='op'>(</span><span class='nam'>video_description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4290. <p id='t450' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4291. <p id='t451' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  4292. <p id='t452' class='pln'><span class='strut'>&nbsp;</span></p>
  4293. <p id='t453' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># closed captions</span><span class='strut'>&nbsp;</span></p>
  4294. <p id='t454' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_subtitles</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4295. <p id='t455' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;writesubtitles&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4296. <p id='t456' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>srt_error</span><span class='op'>,</span> <span class='nam'>video_subtitles</span><span class='op'>)</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_extract_subtitles</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4297. <p id='t457' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>srt_error</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4298. <p id='t458' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='nam'>srt_error</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4299. <p id='t459' class='pln'><span class='strut'>&nbsp;</span></p>
  4300. <p id='t460' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;length_seconds&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4301. <p id='t461' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to extract video duration&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4302. <p id='t462' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_duration</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  4303. <p id='t463' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4304. <p id='t464' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_duration</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;length_seconds&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4305. <p id='t465' class='pln'><span class='strut'>&nbsp;</span></p>
  4306. <p id='t466' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># token</span><span class='strut'>&nbsp;</span></p>
  4307. <p id='t467' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_token</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;token&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4308. <p id='t468' class='pln'><span class='strut'>&nbsp;</span></p>
  4309. <p id='t469' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Decide which formats to download</span><span class='strut'>&nbsp;</span></p>
  4310. <p id='t470' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req_format</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4311. <p id='t471' class='pln'><span class='strut'>&nbsp;</span></p>
  4312. <p id='t472' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;conn&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span> <span class='key'>and</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;conn&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;rtmp&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4313. <p id='t473' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_rtmp_download</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4314. <p id='t474' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;conn&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4315. <p id='t475' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='str'>&#39;url_encoded_fmt_stream_map&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span> <span class='key'>and</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;url_encoded_fmt_stream_map&#39;</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>&gt;=</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4316. <p id='t476' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_data_strs</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;url_encoded_fmt_stream_map&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;,&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4317. <p id='t477' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_data</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>compat_parse_qs</span><span class='op'>(</span><span class='nam'>uds</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>uds</span> <span class='key'>in</span> <span class='nam'>url_data_strs</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4318. <p id='t478' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_data</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>ud</span> <span class='key'>for</span> <span class='nam'>ud</span> <span class='key'>in</span> <span class='nam'>url_data</span> <span class='key'>if</span> <span class='str'>&#39;itag&#39;</span> <span class='key'>in</span> <span class='nam'>ud</span> <span class='key'>and</span> <span class='str'>&#39;url&#39;</span> <span class='key'>in</span> <span class='nam'>ud</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4319. <p id='t479' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_map</span> <span class='op'>=</span> <span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>ud</span><span class='op'>[</span><span class='str'>&#39;itag&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>ud</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;&amp;signature=&#39;</span> <span class='op'>+</span> <span class='nam'>ud</span><span class='op'>[</span><span class='str'>&#39;sig&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>ud</span> <span class='key'>in</span> <span class='nam'>url_data</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4320. <p id='t480' class='pln'><span class='strut'>&nbsp;</span></p>
  4321. <p id='t481' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_limit</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format_limit&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4322. <p id='t482' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>available_formats</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats_prefer_free</span> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;prefer_free_formats&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span> <span class='key'>else</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='strut'>&nbsp;</span></p>
  4323. <p id='t483' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>format_limit</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>format_limit</span> <span class='key'>in</span> <span class='nam'>available_formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4324. <p id='t484' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_list</span> <span class='op'>=</span> <span class='nam'>available_formats</span><span class='op'>[</span><span class='nam'>available_formats</span><span class='op'>.</span><span class='nam'>index</span><span class='op'>(</span><span class='nam'>format_limit</span><span class='op'>)</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4325. <p id='t485' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4326. <p id='t486' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_list</span> <span class='op'>=</span> <span class='nam'>available_formats</span><span class='strut'>&nbsp;</span></p>
  4327. <p id='t487' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>existing_formats</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>x</span> <span class='key'>for</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>format_list</span> <span class='key'>if</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>url_map</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4328. <p id='t488' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4329. <p id='t489' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no known formats available for video&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4330. <p id='t490' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4331. <p id='t491' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;listformats&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4332. <p id='t492' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_print_formats</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4333. <p id='t493' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4334. <p id='t494' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>req_format</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>req_format</span> <span class='op'>==</span> <span class='str'>&#39;best&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4335. <p id='t495' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span> <span class='com'># Best quality</span><span class='strut'>&nbsp;</span></p>
  4336. <p id='t496' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>req_format</span> <span class='op'>==</span> <span class='str'>&#39;worst&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4337. <p id='t497' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span> <span class='com'># worst quality</span><span class='strut'>&nbsp;</span></p>
  4338. <p id='t498' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>req_format</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&#39;-1&#39;</span><span class='op'>,</span> <span class='str'>&#39;all&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4339. <p id='t499' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>f</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>f</span><span class='op'>]</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>f</span> <span class='key'>in</span> <span class='nam'>existing_formats</span><span class='op'>]</span> <span class='com'># All formats</span><span class='strut'>&nbsp;</span></p>
  4340. <p id='t500' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4341. <p id='t501' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Specific formats. We pick the first in a slash-delimeted sequence.</span><span class='strut'>&nbsp;</span></p>
  4342. <p id='t502' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># For example, if &#39;1/2/3/4&#39; is requested and &#39;2&#39; and &#39;4&#39; are available, we pick &#39;2&#39;.</span><span class='strut'>&nbsp;</span></p>
  4343. <p id='t503' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req_formats</span> <span class='op'>=</span> <span class='nam'>req_format</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4344. <p id='t504' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4345. <p id='t505' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>rf</span> <span class='key'>in</span> <span class='nam'>req_formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4346. <p id='t506' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>rf</span> <span class='key'>in</span> <span class='nam'>url_map</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4347. <p id='t507' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>rf</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>rf</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4348. <p id='t508' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  4349. <p id='t509' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_url_list</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4350. <p id='t510' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: requested format not available&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4351. <p id='t511' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4352. <p id='t512' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4353. <p id='t513' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no conn or url_encoded_fmt_stream_map information found in video info&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4354. <p id='t514' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4355. <p id='t515' class='pln'><span class='strut'>&nbsp;</span></p>
  4356. <p id='t516' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4357. <p id='t517' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>format_param</span><span class='op'>,</span> <span class='nam'>video_real_url</span> <span class='key'>in</span> <span class='nam'>video_url_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4358. <p id='t518' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extension</span><span class='strut'>&nbsp;</span></p>
  4359. <p id='t519' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_extensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>format_param</span><span class='op'>,</span> <span class='str'>&#39;flv&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4360. <p id='t520' class='pln'><span class='strut'>&nbsp;</span></p>
  4361. <p id='t521' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_format</span> <span class='op'>=</span> <span class='str'>&#39;{0} - {1}&#39;</span><span class='op'>.</span><span class='nam'>format</span><span class='op'>(</span><span class='nam'>format_param</span> <span class='key'>if</span> <span class='nam'>format_param</span> <span class='key'>else</span> <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4362. <p id='t522' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_dimensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>format_param</span><span class='op'>,</span> <span class='str'>&#39;???&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4363. <p id='t523' class='pln'><span class='strut'>&nbsp;</span></p>
  4364. <p id='t524' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4365. <p id='t525' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4366. <p id='t526' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_real_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4367. <p id='t527' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4368. <p id='t528' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader_id&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4369. <p id='t529' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4370. <p id='t530' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4371. <p id='t531' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4372. <p id='t532' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span>&nbsp;&nbsp; <span class='nam'>video_format</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4373. <p id='t533' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_thumbnail</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4374. <p id='t534' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_description</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4375. <p id='t535' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span>&nbsp;&nbsp; <span class='nam'>player_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4376. <p id='t536' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;subtitles&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_subtitles</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4377. <p id='t537' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;duration&#39;</span><span class='op'>:</span>&nbsp; &nbsp;&nbsp; <span class='nam'>video_duration</span><span class='strut'>&nbsp;</span></p>
  4378. <p id='t538' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4379. <p id='t539' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>results</span><span class='strut'>&nbsp;</span></p>
  4380. <p id='t540' class='pln'><span class='strut'>&nbsp;</span></p>
  4381. <p id='t541' class='pln'><span class='strut'>&nbsp;</span></p>
  4382. <p id='t542' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MetacafeIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4383. <p id='t543' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for metacafe.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4384. <p id='t544' class='pln'><span class='strut'>&nbsp;</span></p>
  4385. <p id='t545' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?(?:www\.)?metacafe\.com/watch/([^/]+)/([^/]+)/.*&#39;</span><span class='strut'>&nbsp;</span></p>
  4386. <p id='t546' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_DISCLAIMER</span> <span class='op'>=</span> <span class='str'>&#39;http://www.metacafe.com/family_filter/&#39;</span><span class='strut'>&nbsp;</span></p>
  4387. <p id='t547' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_FILTER_POST</span> <span class='op'>=</span> <span class='str'>&#39;http://www.metacafe.com/f/index.php?inputType=filter&amp;controllerGroup=user&#39;</span><span class='strut'>&nbsp;</span></p>
  4388. <p id='t548' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;metacafe&#39;</span><span class='strut'>&nbsp;</span></p>
  4389. <p id='t549' class='pln'><span class='strut'>&nbsp;</span></p>
  4390. <p id='t550' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4391. <p id='t551' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4392. <p id='t552' class='pln'><span class='strut'>&nbsp;</span></p>
  4393. <p id='t553' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_disclaimer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4394. <p id='t554' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report disclaimer retrieval.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4395. <p id='t555' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[metacafe] Retrieving disclaimer&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4396. <p id='t556' class='pln'><span class='strut'>&nbsp;</span></p>
  4397. <p id='t557' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_age_confirmation</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4398. <p id='t558' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to confirm age.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4399. <p id='t559' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[metacafe] Confirming age&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4400. <p id='t560' class='pln'><span class='strut'>&nbsp;</span></p>
  4401. <p id='t561' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4402. <p id='t562' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4403. <p id='t563' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[metacafe] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4404. <p id='t564' class='pln'><span class='strut'>&nbsp;</span></p>
  4405. <p id='t565' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4406. <p id='t566' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4407. <p id='t567' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[metacafe] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4408. <p id='t568' class='pln'><span class='strut'>&nbsp;</span></p>
  4409. <p id='t569' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_initialize</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4410. <p id='t570' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve disclaimer</span><span class='strut'>&nbsp;</span></p>
  4411. <p id='t571' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_DISCLAIMER</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4412. <p id='t572' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4413. <p id='t573' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_disclaimer</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4414. <p id='t574' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>disclaimer</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4415. <p id='t575' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4416. <p id='t576' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to retrieve disclaimer: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4417. <p id='t577' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4418. <p id='t578' class='pln'><span class='strut'>&nbsp;</span></p>
  4419. <p id='t579' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Confirm age</span><span class='strut'>&nbsp;</span></p>
  4420. <p id='t580' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>disclaimer_form</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4421. <p id='t581' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;filters&#39;</span><span class='op'>:</span> <span class='str'>&#39;0&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4422. <p id='t582' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;submit&#39;</span><span class='op'>:</span> <span class='str'>&quot;Continue - I&#39;m over 18&quot;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4423. <p id='t583' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4424. <p id='t584' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_FILTER_POST</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='nam'>disclaimer_form</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4425. <p id='t585' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4426. <p id='t586' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_age_confirmation</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4427. <p id='t587' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>disclaimer</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4428. <p id='t588' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4429. <p id='t589' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to confirm age: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4430. <p id='t590' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4431. <p id='t591' class='pln'><span class='strut'>&nbsp;</span></p>
  4432. <p id='t592' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4433. <p id='t593' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract id and simplified title from URL</span><span class='strut'>&nbsp;</span></p>
  4434. <p id='t594' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4435. <p id='t595' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4436. <p id='t596' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4437. <p id='t597' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4438. <p id='t598' class='pln'><span class='strut'>&nbsp;</span></p>
  4439. <p id='t599' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4440. <p id='t600' class='pln'><span class='strut'>&nbsp;</span></p>
  4441. <p id='t601' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Check if video comes from YouTube</span><span class='strut'>&nbsp;</span></p>
  4442. <p id='t602' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj2</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r&#39;^yt-(.*)$&#39;</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4443. <p id='t603' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj2</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4444. <p id='t604' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://www.youtube.com/watch?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>mobj2</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4445. <p id='t605' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4446. <p id='t606' class='pln'><span class='strut'>&nbsp;</span></p>
  4447. <p id='t607' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  4448. <p id='t608' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='str'>&#39;http://www.metacafe.com/watch/%s/&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4449. <p id='t609' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4450. <p id='t610' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4451. <p id='t611' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4452. <p id='t612' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4453. <p id='t613' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4454. <p id='t614' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4455. <p id='t615' class='pln'><span class='strut'>&nbsp;</span></p>
  4456. <p id='t616' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract URL, uploader and title from webpage</span><span class='strut'>&nbsp;</span></p>
  4457. <p id='t617' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4458. <p id='t618' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;(?m)&amp;mediaURL=([^&amp;]+)&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4459. <p id='t619' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4460. <p id='t620' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mediaURL</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4461. <p id='t621' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>mediaURL</span><span class='op'>[</span><span class='op'>-</span><span class='num'>3</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4462. <p id='t622' class='pln'><span class='strut'>&nbsp;</span></p>
  4463. <p id='t623' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract gdaKey if available</span><span class='strut'>&nbsp;</span></p>
  4464. <p id='t624' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;(?m)&amp;gdaKey=(.*?)&amp;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4465. <p id='t625' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4466. <p id='t626' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>mediaURL</span><span class='strut'>&nbsp;</span></p>
  4467. <p id='t627' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4468. <p id='t628' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>gdaKey</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4469. <p id='t629' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>&#39;%s?__gda__=%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>mediaURL</span><span class='op'>,</span> <span class='nam'>gdaKey</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4470. <p id='t630' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4471. <p id='t631' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39; name=&quot;flashvars&quot; value=&quot;(.*?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4472. <p id='t632' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4473. <p id='t633' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4474. <p id='t634' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4475. <p id='t635' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>vardict</span> <span class='op'>=</span> <span class='nam'>compat_parse_qs</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4476. <p id='t636' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;mediaData&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>vardict</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4477. <p id='t637' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4478. <p id='t638' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4479. <p id='t639' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&quot;mediaURL&quot;:&quot;(http.*?)&quot;,&quot;key&quot;:&quot;(.*?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>vardict</span><span class='op'>[</span><span class='str'>&#39;mediaData&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4480. <p id='t640' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4481. <p id='t641' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4482. <p id='t642' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4483. <p id='t643' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mediaURL</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;\\/&#39;</span><span class='op'>,</span> <span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4484. <p id='t644' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>mediaURL</span><span class='op'>[</span><span class='op'>-</span><span class='num'>3</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4485. <p id='t645' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>&#39;%s?__gda__=%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>mediaURL</span><span class='op'>,</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4486. <p id='t646' class='pln'><span class='strut'>&nbsp;</span></p>
  4487. <p id='t647' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;(?im)&lt;title&gt;(.*) - Video&lt;/title&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4488. <p id='t648' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4489. <p id='t649' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4490. <p id='t650' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4491. <p id='t651' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4492. <p id='t652' class='pln'><span class='strut'>&nbsp;</span></p>
  4493. <p id='t653' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;submitter=(.*?);&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4494. <p id='t654' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4495. <p id='t655' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract uploader nickname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4496. <p id='t656' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4497. <p id='t657' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4498. <p id='t658' class='pln'><span class='strut'>&nbsp;</span></p>
  4499. <p id='t659' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4500. <p id='t660' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4501. <p id='t661' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4502. <p id='t662' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4503. <p id='t663' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4504. <p id='t664' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4505. <p id='t665' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4506. <p id='t666' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4507. <p id='t667' class='pln'><span class='strut'>&nbsp;</span></p>
  4508. <p id='t668' class='pln'><span class='strut'>&nbsp;</span></p>
  4509. <p id='t669' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DailymotionIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4510. <p id='t670' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for Dailymotion&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4511. <p id='t671' class='pln'><span class='strut'>&nbsp;</span></p>
  4512. <p id='t672' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?i)(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/video/([^/]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  4513. <p id='t673' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;dailymotion&#39;</span><span class='strut'>&nbsp;</span></p>
  4514. <p id='t674' class='pln'><span class='strut'>&nbsp;</span></p>
  4515. <p id='t675' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4516. <p id='t676' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4517. <p id='t677' class='pln'><span class='strut'>&nbsp;</span></p>
  4518. <p id='t678' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4519. <p id='t679' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4520. <p id='t680' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[dailymotion] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4521. <p id='t681' class='pln'><span class='strut'>&nbsp;</span></p>
  4522. <p id='t682' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4523. <p id='t683' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract id and simplified title from URL</span><span class='strut'>&nbsp;</span></p>
  4524. <p id='t684' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4525. <p id='t685' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4526. <p id='t686' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4527. <p id='t687' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4528. <p id='t688' class='pln'><span class='strut'>&nbsp;</span></p>
  4529. <p id='t689' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;_&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;?&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4530. <p id='t690' class='pln'><span class='strut'>&nbsp;</span></p>
  4531. <p id='t691' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='str'>&#39;mp4&#39;</span><span class='strut'>&nbsp;</span></p>
  4532. <p id='t692' class='pln'><span class='strut'>&nbsp;</span></p>
  4533. <p id='t693' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  4534. <p id='t694' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4535. <p id='t695' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span><span class='op'>.</span><span class='nam'>add_header</span><span class='op'>(</span><span class='str'>&#39;Cookie&#39;</span><span class='op'>,</span> <span class='str'>&#39;family_filter=off&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4536. <p id='t696' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4537. <p id='t697' class='pln'><span class='strut'>&nbsp;</span></p>
  4538. <p id='t698' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract URL, uploader and title from webpage</span><span class='strut'>&nbsp;</span></p>
  4539. <p id='t699' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4540. <p id='t700' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;\s*var flashvars = (.*)&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4541. <p id='t701' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4542. <p id='t702' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4543. <p id='t703' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4544. <p id='t704' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>flashvars</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4545. <p id='t705' class='pln'><span class='strut'>&nbsp;</span></p>
  4546. <p id='t706' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='op'>[</span><span class='str'>&#39;hd1080URL&#39;</span><span class='op'>,</span> <span class='str'>&#39;hd720URL&#39;</span><span class='op'>,</span> <span class='str'>&#39;hqURL&#39;</span><span class='op'>,</span> <span class='str'>&#39;sdURL&#39;</span><span class='op'>,</span> <span class='str'>&#39;ldURL&#39;</span><span class='op'>,</span> <span class='str'>&#39;video_url&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4547. <p id='t707' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>flashvars</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4548. <p id='t708' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>max_quality</span> <span class='op'>=</span> <span class='nam'>key</span><span class='strut'>&nbsp;</span></p>
  4549. <p id='t709' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[dailymotion] Using %s&#39;</span> <span class='op'>%</span> <span class='nam'>key</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4550. <p id='t710' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  4551. <p id='t711' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4552. <p id='t712' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4553. <p id='t713' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4554. <p id='t714' class='pln'><span class='strut'>&nbsp;</span></p>
  4555. <p id='t715' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&quot;&#39;</span> <span class='op'>+</span> <span class='nam'>max_quality</span> <span class='op'>+</span> <span class='str'>r&#39;&quot;:&quot;(.+?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>flashvars</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4556. <p id='t716' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4557. <p id='t717' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4558. <p id='t718' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4559. <p id='t719' class='pln'><span class='strut'>&nbsp;</span></p>
  4560. <p id='t720' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;\\/&#39;</span><span class='op'>,</span> <span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4561. <p id='t721' class='pln'><span class='strut'>&nbsp;</span></p>
  4562. <p id='t722' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO: support choosing qualities</span><span class='strut'>&nbsp;</span></p>
  4563. <p id='t723' class='pln'><span class='strut'>&nbsp;</span></p>
  4564. <p id='t724' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta property=&quot;og:title&quot; content=&quot;(?P&lt;title&gt;[^&quot;]*)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4565. <p id='t725' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4566. <p id='t726' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4567. <p id='t727' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4568. <p id='t728' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;title&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4569. <p id='t729' class='pln'><span class='strut'>&nbsp;</span></p>
  4570. <p id='t730' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4571. <p id='t731' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;(?im)&lt;span class=&quot;owner[^\&quot;]+?&quot;&gt;[^&lt;]+?&lt;a [^&gt;]+?&gt;([^&lt;]+?)&lt;/a&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4572. <p id='t732' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4573. <p id='t733' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># lookin for official user</span><span class='strut'>&nbsp;</span></p>
  4574. <p id='t734' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj_official</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;span rel=&quot;author&quot;[^&gt;]+?&gt;([^&lt;]+?)&lt;/span&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4575. <p id='t735' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj_official</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4576. <p id='t736' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to extract uploader nickname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4577. <p id='t737' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4578. <p id='t738' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj_official</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4579. <p id='t739' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4580. <p id='t740' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4581. <p id='t741' class='pln'><span class='strut'>&nbsp;</span></p>
  4582. <p id='t742' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_upload_date</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4583. <p id='t743' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;div class=&quot;[^&quot;]*uploaded_cont[^&quot;]*&quot; title=&quot;[^&quot;]*&quot;&gt;([0-9]{2})-([0-9]{2})-([0-9]{4})&lt;/div&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4584. <p id='t744' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4585. <p id='t745' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_upload_date</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>3</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4586. <p id='t746' class='pln'><span class='strut'>&nbsp;</span></p>
  4587. <p id='t747' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4588. <p id='t748' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4589. <p id='t749' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4590. <p id='t750' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4591. <p id='t751' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4592. <p id='t752' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4593. <p id='t753' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4594. <p id='t754' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4595. <p id='t755' class='pln'><span class='strut'>&nbsp;</span></p>
  4596. <p id='t756' class='pln'><span class='strut'>&nbsp;</span></p>
  4597. <p id='t757' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>PhotobucketIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4598. <p id='t758' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for photobucket.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4599. <p id='t759' class='pln'><span class='strut'>&nbsp;</span></p>
  4600. <p id='t760' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?(?:[a-z0-9]+\.)?photobucket\.com/.*[\?\&amp;]current=(.*\.flv)&#39;</span><span class='strut'>&nbsp;</span></p>
  4601. <p id='t761' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;photobucket&#39;</span><span class='strut'>&nbsp;</span></p>
  4602. <p id='t762' class='pln'><span class='strut'>&nbsp;</span></p>
  4603. <p id='t763' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4604. <p id='t764' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4605. <p id='t765' class='pln'><span class='strut'>&nbsp;</span></p>
  4606. <p id='t766' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4607. <p id='t767' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4608. <p id='t768' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[photobucket] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4609. <p id='t769' class='pln'><span class='strut'>&nbsp;</span></p>
  4610. <p id='t770' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4611. <p id='t771' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4612. <p id='t772' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[photobucket] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4613. <p id='t773' class='pln'><span class='strut'>&nbsp;</span></p>
  4614. <p id='t774' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4615. <p id='t775' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract id from URL</span><span class='strut'>&nbsp;</span></p>
  4616. <p id='t776' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4617. <p id='t777' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4618. <p id='t778' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4619. <p id='t779' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4620. <p id='t780' class='pln'><span class='strut'>&nbsp;</span></p>
  4621. <p id='t781' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4622. <p id='t782' class='pln'><span class='strut'>&nbsp;</span></p>
  4623. <p id='t783' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='str'>&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  4624. <p id='t784' class='pln'><span class='strut'>&nbsp;</span></p>
  4625. <p id='t785' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  4626. <p id='t786' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4627. <p id='t787' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4628. <p id='t788' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4629. <p id='t789' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4630. <p id='t790' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4631. <p id='t791' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4632. <p id='t792' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4633. <p id='t793' class='pln'><span class='strut'>&nbsp;</span></p>
  4634. <p id='t794' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract URL, uploader, and title from webpage</span><span class='strut'>&nbsp;</span></p>
  4635. <p id='t795' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4636. <p id='t796' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;link rel=&quot;video_src&quot; href=&quot;.*\?file=([^&quot;]+)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4637. <p id='t797' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4638. <p id='t798' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4639. <p id='t799' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4640. <p id='t800' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mediaURL</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4641. <p id='t801' class='pln'><span class='strut'>&nbsp;</span></p>
  4642. <p id='t802' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>mediaURL</span><span class='strut'>&nbsp;</span></p>
  4643. <p id='t803' class='pln'><span class='strut'>&nbsp;</span></p>
  4644. <p id='t804' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;title&gt;(.*) video by (.*) - Photobucket&lt;/title&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4645. <p id='t805' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4646. <p id='t806' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4647. <p id='t807' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4648. <p id='t808' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4649. <p id='t809' class='pln'><span class='strut'>&nbsp;</span></p>
  4650. <p id='t810' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4651. <p id='t811' class='pln'><span class='strut'>&nbsp;</span></p>
  4652. <p id='t812' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4653. <p id='t813' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4654. <p id='t814' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4655. <p id='t815' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4656. <p id='t816' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4657. <p id='t817' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4658. <p id='t818' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4659. <p id='t819' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4660. <p id='t820' class='pln'><span class='strut'>&nbsp;</span></p>
  4661. <p id='t821' class='pln'><span class='strut'>&nbsp;</span></p>
  4662. <p id='t822' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YahooIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4663. <p id='t823' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for video.yahoo.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4664. <p id='t824' class='pln'><span class='strut'>&nbsp;</span></p>
  4665. <p id='t825' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  4666. <p id='t826' class='pln'>&nbsp; &nbsp; <span class='com'># _VALID_URL matches all Yahoo! Video URLs</span><span class='strut'>&nbsp;</span></p>
  4667. <p id='t827' class='pln'>&nbsp; &nbsp; <span class='com'># _VPAGE_URL matches only the extractable &#39;/watch/&#39; URLs</span><span class='strut'>&nbsp;</span></p>
  4668. <p id='t828' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?(?:[a-z]+\.)?video\.yahoo\.com/(?:watch|network)/([0-9]+)(?:/|\?v=)([0-9]+)(?:[#\?].*)?&#39;</span><span class='strut'>&nbsp;</span></p>
  4669. <p id='t829' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VPAGE_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?video\.yahoo\.com/watch/([0-9]+)/([0-9]+)(?:[#\?].*)?&#39;</span><span class='strut'>&nbsp;</span></p>
  4670. <p id='t830' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;video.yahoo&#39;</span><span class='strut'>&nbsp;</span></p>
  4671. <p id='t831' class='pln'><span class='strut'>&nbsp;</span></p>
  4672. <p id='t832' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4673. <p id='t833' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4674. <p id='t834' class='pln'><span class='strut'>&nbsp;</span></p>
  4675. <p id='t835' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4676. <p id='t836' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4677. <p id='t837' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[video.yahoo] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4678. <p id='t838' class='pln'><span class='strut'>&nbsp;</span></p>
  4679. <p id='t839' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4680. <p id='t840' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4681. <p id='t841' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[video.yahoo] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4682. <p id='t842' class='pln'><span class='strut'>&nbsp;</span></p>
  4683. <p id='t843' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>new_video</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4684. <p id='t844' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract ID from URL</span><span class='strut'>&nbsp;</span></p>
  4685. <p id='t845' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4686. <p id='t846' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4687. <p id='t847' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4688. <p id='t848' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4689. <p id='t849' class='pln'><span class='strut'>&nbsp;</span></p>
  4690. <p id='t850' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4691. <p id='t851' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='str'>&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  4692. <p id='t852' class='pln'><span class='strut'>&nbsp;</span></p>
  4693. <p id='t853' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Rewrite valid but non-extractable URLs as</span><span class='strut'>&nbsp;</span></p>
  4694. <p id='t854' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># extractable English language /watch/ URLs</span><span class='strut'>&nbsp;</span></p>
  4695. <p id='t855' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VPAGE_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4696. <p id='t856' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4697. <p id='t857' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4698. <p id='t858' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4699. <p id='t859' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4700. <p id='t860' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4701. <p id='t861' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4702. <p id='t862' class='pln'><span class='strut'>&nbsp;</span></p>
  4703. <p id='t863' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;\(&quot;id&quot;, &quot;([0-9]+)&quot;\);&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4704. <p id='t864' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4705. <p id='t865' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to extract id field&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4706. <p id='t866' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4707. <p id='t867' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yahoo_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4708. <p id='t868' class='pln'><span class='strut'>&nbsp;</span></p>
  4709. <p id='t869' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;\(&quot;vid&quot;, &quot;([0-9]+)&quot;\);&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4710. <p id='t870' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4711. <p id='t871' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to extract vid field&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4712. <p id='t872' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4713. <p id='t873' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yahoo_vid</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4714. <p id='t874' class='pln'><span class='strut'>&nbsp;</span></p>
  4715. <p id='t875' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://video.yahoo.com/watch/%s/%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>yahoo_vid</span><span class='op'>,</span> <span class='nam'>yahoo_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4716. <p id='t876' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>new_video</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4717. <p id='t877' class='pln'><span class='strut'>&nbsp;</span></p>
  4718. <p id='t878' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  4719. <p id='t879' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4720. <p id='t880' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4721. <p id='t881' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4722. <p id='t882' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4723. <p id='t883' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4724. <p id='t884' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4725. <p id='t885' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4726. <p id='t886' class='pln'><span class='strut'>&nbsp;</span></p>
  4727. <p id='t887' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract uploader and title from webpage</span><span class='strut'>&nbsp;</span></p>
  4728. <p id='t888' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4729. <p id='t889' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;title&quot; content=&quot;(.*)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4730. <p id='t890' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4731. <p id='t891' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4732. <p id='t892' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4733. <p id='t893' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4734. <p id='t894' class='pln'><span class='strut'>&nbsp;</span></p>
  4735. <p id='t895' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;h2 class=&quot;ti-5&quot;&gt;&lt;a href=&quot;http://video\.yahoo\.com/(people|profile)/[0-9]+&quot; beacon=&quot;.*&quot;&gt;(.*)&lt;/a&gt;&lt;/h2&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4736. <p id='t896' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4737. <p id='t897' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video uploader&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4738. <p id='t898' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4739. <p id='t899' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4740. <p id='t900' class='pln'><span class='strut'>&nbsp;</span></p>
  4741. <p id='t901' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video thumbnail</span><span class='strut'>&nbsp;</span></p>
  4742. <p id='t902' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;link rel=&quot;image_src&quot; href=&quot;(.*)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4743. <p id='t903' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4744. <p id='t904' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video thumbnail&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4745. <p id='t905' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4746. <p id='t906' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4747. <p id='t907' class='pln'><span class='strut'>&nbsp;</span></p>
  4748. <p id='t908' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video description</span><span class='strut'>&nbsp;</span></p>
  4749. <p id='t909' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;description&quot; content=&quot;(.*)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4750. <p id='t910' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4751. <p id='t911' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video description&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4752. <p id='t912' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4753. <p id='t913' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4754. <p id='t914' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>video_description</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4755. <p id='t915' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='str'>&#39;No description available.&#39;</span><span class='strut'>&nbsp;</span></p>
  4756. <p id='t916' class='pln'><span class='strut'>&nbsp;</span></p>
  4757. <p id='t917' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video height and width</span><span class='strut'>&nbsp;</span></p>
  4758. <p id='t918' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;video_height&quot; content=&quot;([0-9]+)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4759. <p id='t919' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4760. <p id='t920' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video height&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4761. <p id='t921' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4762. <p id='t922' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yv_video_height</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4763. <p id='t923' class='pln'><span class='strut'>&nbsp;</span></p>
  4764. <p id='t924' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;video_width&quot; content=&quot;([0-9]+)&quot; /&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4765. <p id='t925' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4766. <p id='t926' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video width&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4767. <p id='t927' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4768. <p id='t928' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yv_video_width</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4769. <p id='t929' class='pln'><span class='strut'>&nbsp;</span></p>
  4770. <p id='t930' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video playlist to extract media URL</span><span class='strut'>&nbsp;</span></p>
  4771. <p id='t931' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># I&#39;m not completely sure what all these options are, but we</span><span class='strut'>&nbsp;</span></p>
  4772. <p id='t932' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># seem to need most of them, otherwise the server sends a 401.</span><span class='strut'>&nbsp;</span></p>
  4773. <p id='t933' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yv_lg</span> <span class='op'>=</span> <span class='str'>&#39;R0xx6idZnW2zlrKP8xxAIR&#39;</span>&nbsp; <span class='com'># not sure what this represents</span><span class='strut'>&nbsp;</span></p>
  4774. <p id='t934' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>yv_bitrate</span> <span class='op'>=</span> <span class='str'>&#39;700&#39;</span>&nbsp; <span class='com'># according to Wikipedia this is hard-coded</span><span class='strut'>&nbsp;</span></p>
  4775. <p id='t935' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='str'>&#39;http://cosmos.bcst.yahoo.com/up/yep/process/getPlaylistFOP.php?node_id=&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  4776. <p id='t936' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;&amp;tech=flash&amp;mode=playlist&amp;lg=&#39;</span> <span class='op'>+</span> <span class='nam'>yv_lg</span> <span class='op'>+</span> <span class='str'>&#39;&amp;bitrate=&#39;</span> <span class='op'>+</span> <span class='nam'>yv_bitrate</span> <span class='op'>+</span> <span class='str'>&#39;&amp;vidH=&#39;</span> <span class='op'>+</span> <span class='nam'>yv_video_height</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  4777. <p id='t937' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;&amp;vidW=&#39;</span> <span class='op'>+</span> <span class='nam'>yv_video_width</span> <span class='op'>+</span> <span class='str'>&#39;&amp;swf=as3&amp;rd=video.yahoo.com&amp;tk=null&amp;adsupported=v1,v2,&amp;eventid=1301797&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4778. <p id='t938' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4779. <p id='t939' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4780. <p id='t940' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4781. <p id='t941' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4782. <p id='t942' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4783. <p id='t943' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4784. <p id='t944' class='pln'><span class='strut'>&nbsp;</span></p>
  4785. <p id='t945' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract media URL from playlist XML</span><span class='strut'>&nbsp;</span></p>
  4786. <p id='t946' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;STREAM APP=&quot;(http://.*)&quot; FULLPATH=&quot;/?(/.*\.flv\?[^&quot;]*)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4787. <p id='t947' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4788. <p id='t948' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4789. <p id='t949' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4790. <p id='t950' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4791. <p id='t951' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>video_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4792. <p id='t952' class='pln'><span class='strut'>&nbsp;</span></p>
  4793. <p id='t953' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4794. <p id='t954' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4795. <p id='t955' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4796. <p id='t956' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4797. <p id='t957' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4798. <p id='t958' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4799. <p id='t959' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4800. <p id='t960' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_thumbnail</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4801. <p id='t961' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_description</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4802. <p id='t962' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4803. <p id='t963' class='pln'><span class='strut'>&nbsp;</span></p>
  4804. <p id='t964' class='pln'><span class='strut'>&nbsp;</span></p>
  4805. <p id='t965' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>VimeoIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4806. <p id='t966' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for vimeo.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4807. <p id='t967' class='pln'><span class='strut'>&nbsp;</span></p>
  4808. <p id='t968' class='pln'>&nbsp; &nbsp; <span class='com'># _VALID_URL matches Vimeo URLs</span><span class='strut'>&nbsp;</span></p>
  4809. <p id='t969' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:https?://)?(?:(?:www|player).)?vimeo\.com/(?:(?:groups|album)/[^/]+/)?(?:videos?/)?([0-9]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  4810. <p id='t970' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;vimeo&#39;</span><span class='strut'>&nbsp;</span></p>
  4811. <p id='t971' class='pln'><span class='strut'>&nbsp;</span></p>
  4812. <p id='t972' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4813. <p id='t973' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4814. <p id='t974' class='pln'><span class='strut'>&nbsp;</span></p>
  4815. <p id='t975' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4816. <p id='t976' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4817. <p id='t977' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[vimeo] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4818. <p id='t978' class='pln'><span class='strut'>&nbsp;</span></p>
  4819. <p id='t979' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4820. <p id='t980' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4821. <p id='t981' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[vimeo] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4822. <p id='t982' class='pln'><span class='strut'>&nbsp;</span></p>
  4823. <p id='t983' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>new_video</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4824. <p id='t984' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract ID from URL</span><span class='strut'>&nbsp;</span></p>
  4825. <p id='t985' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4826. <p id='t986' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4827. <p id='t987' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4828. <p id='t988' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4829. <p id='t989' class='pln'><span class='strut'>&nbsp;</span></p>
  4830. <p id='t990' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4831. <p id='t991' class='pln'><span class='strut'>&nbsp;</span></p>
  4832. <p id='t992' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve video webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  4833. <p id='t993' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>std_headers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4834. <p id='t994' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4835. <p id='t995' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4836. <p id='t996' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4837. <p id='t997' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4838. <p id='t998' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4839. <p id='t999' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4840. <p id='t1000' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4841. <p id='t1001' class='pln'><span class='strut'>&nbsp;</span></p>
  4842. <p id='t1002' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Now we begin extracting as much information as we can from what we</span><span class='strut'>&nbsp;</span></p>
  4843. <p id='t1003' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># retrieved. First we extract the information common to all extractors,</span><span class='strut'>&nbsp;</span></p>
  4844. <p id='t1004' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># and latter we extract those that are Vimeo specific.</span><span class='strut'>&nbsp;</span></p>
  4845. <p id='t1005' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4846. <p id='t1006' class='pln'><span class='strut'>&nbsp;</span></p>
  4847. <p id='t1007' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract the config JSON</span><span class='strut'>&nbsp;</span></p>
  4848. <p id='t1008' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4849. <p id='t1009' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>config</span> <span class='op'>=</span> <span class='nam'>webpage</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39; = {config:&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;,assets:&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4850. <p id='t1010' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>config</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>config</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4851. <p id='t1011' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4852. <p id='t1012' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract info section&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4853. <p id='t1013' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4854. <p id='t1014' class='pln'><span class='strut'>&nbsp;</span></p>
  4855. <p id='t1015' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract title</span><span class='strut'>&nbsp;</span></p>
  4856. <p id='t1016' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;title&quot;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4857. <p id='t1017' class='pln'><span class='strut'>&nbsp;</span></p>
  4858. <p id='t1018' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract uploader and uploader_id</span><span class='strut'>&nbsp;</span></p>
  4859. <p id='t1019' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;owner&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;name&quot;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4860. <p id='t1020' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader_id</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;owner&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;url&quot;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4861. <p id='t1021' class='pln'><span class='strut'>&nbsp;</span></p>
  4862. <p id='t1022' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video thumbnail</span><span class='strut'>&nbsp;</span></p>
  4863. <p id='t1023' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;thumbnail&quot;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4864. <p id='t1024' class='pln'><span class='strut'>&nbsp;</span></p>
  4865. <p id='t1025' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video description</span><span class='strut'>&nbsp;</span></p>
  4866. <p id='t1026' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>get_element_by_attribute</span><span class='op'>(</span><span class='str'>&quot;itemprop&quot;</span><span class='op'>,</span> <span class='str'>&quot;description&quot;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4867. <p id='t1027' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_description</span><span class='op'>:</span> <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>clean_html</span><span class='op'>(</span><span class='nam'>video_description</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4868. <p id='t1028' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span> <span class='nam'>video_description</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  4869. <p id='t1029' class='pln'><span class='strut'>&nbsp;</span></p>
  4870. <p id='t1030' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract upload date</span><span class='strut'>&nbsp;</span></p>
  4871. <p id='t1031' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_upload_date</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  4872. <p id='t1032' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta itemprop=&quot;dateCreated&quot; content=&quot;(\d{4})-(\d{2})-(\d{2})T&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4873. <p id='t1033' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4874. <p id='t1034' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_upload_date</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>3</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4875. <p id='t1035' class='pln'><span class='strut'>&nbsp;</span></p>
  4876. <p id='t1036' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Vimeo specific: extract request signature and timestamp</span><span class='strut'>&nbsp;</span></p>
  4877. <p id='t1037' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>sig</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;signature&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4878. <p id='t1038' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>timestamp</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;request&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;timestamp&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4879. <p id='t1039' class='pln'><span class='strut'>&nbsp;</span></p>
  4880. <p id='t1040' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Vimeo specific: extract video codec and quality information</span><span class='strut'>&nbsp;</span></p>
  4881. <p id='t1041' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># First consider quality, then codecs, then take everything</span><span class='strut'>&nbsp;</span></p>
  4882. <p id='t1042' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># TODO bind to format param</span><span class='strut'>&nbsp;</span></p>
  4883. <p id='t1043' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>codecs</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='str'>&#39;h264&#39;</span><span class='op'>,</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='str'>&#39;vp8&#39;</span><span class='op'>,</span> <span class='str'>&#39;flv&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='str'>&#39;vp6&#39;</span><span class='op'>,</span> <span class='str'>&#39;flv&#39;</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4884. <p id='t1044' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files</span> <span class='op'>=</span> <span class='op'>{</span> <span class='str'>&#39;hd&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>&#39;sd&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>&#39;other&#39;</span><span class='op'>:</span> <span class='op'>[</span><span class='op'>]</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4885. <p id='t1045' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>codec_name</span><span class='op'>,</span> <span class='nam'>codec_extension</span> <span class='key'>in</span> <span class='nam'>codecs</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4886. <p id='t1046' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>codec_name</span> <span class='key'>in</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;files&quot;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4887. <p id='t1047' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;hd&#39;</span> <span class='key'>in</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;files&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>codec_name</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4888. <p id='t1048' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files</span><span class='op'>[</span><span class='str'>&#39;hd&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>codec_name</span><span class='op'>,</span> <span class='nam'>codec_extension</span><span class='op'>,</span> <span class='str'>&#39;hd&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4889. <p id='t1049' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='str'>&#39;sd&#39;</span> <span class='key'>in</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;files&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>codec_name</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4890. <p id='t1050' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files</span><span class='op'>[</span><span class='str'>&#39;sd&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>codec_name</span><span class='op'>,</span> <span class='nam'>codec_extension</span><span class='op'>,</span> <span class='str'>&#39;sd&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4891. <p id='t1051' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4892. <p id='t1052' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files</span><span class='op'>[</span><span class='str'>&#39;other&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>codec_name</span><span class='op'>,</span> <span class='nam'>codec_extension</span><span class='op'>,</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&quot;video&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&quot;files&quot;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>codec_name</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4893. <p id='t1053' class='pln'><span class='strut'>&nbsp;</span></p>
  4894. <p id='t1054' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>quality</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&#39;hd&#39;</span><span class='op'>,</span> <span class='str'>&#39;sd&#39;</span><span class='op'>,</span> <span class='str'>&#39;other&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4895. <p id='t1055' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>files</span><span class='op'>[</span><span class='nam'>quality</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>&gt;</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4896. <p id='t1056' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_quality</span> <span class='op'>=</span> <span class='nam'>files</span><span class='op'>[</span><span class='nam'>quality</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4897. <p id='t1057' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_codec</span> <span class='op'>=</span> <span class='nam'>files</span><span class='op'>[</span><span class='nam'>quality</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4898. <p id='t1058' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>files</span><span class='op'>[</span><span class='nam'>quality</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4899. <p id='t1059' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[vimeo] %s: Downloading %s file at %s quality&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>video_codec</span><span class='op'>.</span><span class='nam'>upper</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>video_quality</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4900. <p id='t1060' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  4901. <p id='t1061' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4902. <p id='t1062' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no known codec found&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4903. <p id='t1063' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4904. <p id='t1064' class='pln'><span class='strut'>&nbsp;</span></p>
  4905. <p id='t1065' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>&quot;http://player.vimeo.com/play_redirect?clip_id=%s&amp;sig=%s&amp;time=%s&amp;quality=%s&amp;codecs=%s&amp;type=moogaloop_local&amp;embed_location=&quot;</span> <span class='xx'>\</span><span class='strut'>&nbsp;</span></p>
  4906. <p id='t1066' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>%</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>sig</span><span class='op'>,</span> <span class='nam'>timestamp</span><span class='op'>,</span> <span class='nam'>video_quality</span><span class='op'>,</span> <span class='nam'>video_codec</span><span class='op'>.</span><span class='nam'>upper</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4907. <p id='t1067' class='pln'><span class='strut'>&nbsp;</span></p>
  4908. <p id='t1068' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  4909. <p id='t1069' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4910. <p id='t1070' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4911. <p id='t1071' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4912. <p id='t1072' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader_id&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4913. <p id='t1073' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4914. <p id='t1074' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4915. <p id='t1075' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4916. <p id='t1076' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_thumbnail</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4917. <p id='t1077' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_description</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4918. <p id='t1078' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4919. <p id='t1079' class='pln'><span class='strut'>&nbsp;</span></p>
  4920. <p id='t1080' class='pln'><span class='strut'>&nbsp;</span></p>
  4921. <p id='t1081' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ArteTvIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4922. <p id='t1082' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;arte.tv information extractor.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4923. <p id='t1083' class='pln'><span class='strut'>&nbsp;</span></p>
  4924. <p id='t1084' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?videos\.arte\.tv/(?:fr|de)/videos/.*&#39;</span><span class='strut'>&nbsp;</span></p>
  4925. <p id='t1085' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_LIVE_URL</span> <span class='op'>=</span> <span class='str'>r&#39;index-[0-9]+\.html$&#39;</span><span class='strut'>&nbsp;</span></p>
  4926. <p id='t1086' class='pln'><span class='strut'>&nbsp;</span></p>
  4927. <p id='t1087' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;arte.tv&#39;</span><span class='strut'>&nbsp;</span></p>
  4928. <p id='t1088' class='pln'><span class='strut'>&nbsp;</span></p>
  4929. <p id='t1089' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4930. <p id='t1090' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4931. <p id='t1091' class='pln'><span class='strut'>&nbsp;</span></p>
  4932. <p id='t1092' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4933. <p id='t1093' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4934. <p id='t1094' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[arte.tv] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4935. <p id='t1095' class='pln'><span class='strut'>&nbsp;</span></p>
  4936. <p id='t1096' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4937. <p id='t1097' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  4938. <p id='t1098' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[arte.tv] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4939. <p id='t1099' class='pln'><span class='strut'>&nbsp;</span></p>
  4940. <p id='t1100' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>fetch_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4941. <p id='t1101' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4942. <p id='t1102' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4943. <p id='t1103' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4944. <p id='t1104' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4945. <p id='t1105' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4946. <p id='t1106' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4947. <p id='t1107' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4948. <p id='t1108' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4949. <p id='t1109' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4950. <p id='t1110' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4951. <p id='t1111' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>webpage</span><span class='strut'>&nbsp;</span></p>
  4952. <p id='t1112' class='pln'><span class='strut'>&nbsp;</span></p>
  4953. <p id='t1113' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>grep_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>regex</span><span class='op'>,</span> <span class='nam'>regexFlags</span><span class='op'>,</span> <span class='nam'>matchTuples</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4954. <p id='t1114' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>fetch_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4955. <p id='t1115' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>regex</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>,</span> <span class='nam'>regexFlags</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4956. <p id='t1116' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  4957. <p id='t1117' class='pln'><span class='strut'>&nbsp;</span></p>
  4958. <p id='t1118' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4959. <p id='t1119' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4960. <p id='t1120' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4961. <p id='t1121' class='pln'><span class='strut'>&nbsp;</span></p>
  4962. <p id='t1122' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='op'>(</span><span class='nam'>i</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>)</span> <span class='key'>in</span> <span class='nam'>matchTuples</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4963. <p id='t1123' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='nam'>i</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4964. <p id='t1124' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4965. <p id='t1125' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  4966. <p id='t1126' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4967. <p id='t1127' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='nam'>key</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='nam'>i</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4968. <p id='t1128' class='pln'><span class='strut'>&nbsp;</span></p>
  4969. <p id='t1129' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>info</span><span class='strut'>&nbsp;</span></p>
  4970. <p id='t1130' class='pln'><span class='strut'>&nbsp;</span></p>
  4971. <p id='t1131' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>extractLiveStream</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4972. <p id='t1132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_lang</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>4</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4973. <p id='t1133' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>grep_webpage</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
  4974. <p id='t1134' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4975. <p id='t1135' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>r&#39;src=&quot;(.*?/videothek_js.*?\.js)&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4976. <p id='t1136' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='num'>0</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4977. <p id='t1137' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  4978. <p id='t1138' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;url&#39;</span><span class='op'>,</span> <span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4979. <p id='t1139' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4980. <p id='t1140' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4981. <p id='t1141' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>http_host</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4982. <p id='t1142' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span> <span class='op'>=</span> <span class='str'>&#39;http://%s%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>http_host</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4983. <p id='t1143' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>grep_webpage</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
  4984. <p id='t1144' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4985. <p id='t1145' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>r&#39;(s_artestras_scst_geoFRDE_&#39;</span> <span class='op'>+</span> <span class='nam'>video_lang</span> <span class='op'>+</span> <span class='str'>&#39;.*?)\&#39;.*?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  4986. <p id='t1146' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;(http://.*?\.swf).*?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  4987. <p id='t1147' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;(rtmp://.*?)\&#39;&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4988. <p id='t1148' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4989. <p id='t1149' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  4990. <p id='t1150' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;path&#39;</span><span class='op'>,</span>&nbsp;&nbsp; <span class='str'>u&#39;ERROR: could not extract video path: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4991. <p id='t1151' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>2</span><span class='op'>,</span> <span class='str'>&#39;player&#39;</span><span class='op'>,</span> <span class='str'>u&#39;ERROR: could not extract video player: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  4992. <p id='t1152' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>3</span><span class='op'>,</span> <span class='str'>&#39;url&#39;</span><span class='op'>,</span>&nbsp; &nbsp; <span class='str'>u&#39;ERROR: could not extract video url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4993. <p id='t1153' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4994. <p id='t1154' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4995. <p id='t1155' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>u&#39;%s/%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;path&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  4996. <p id='t1156' class='pln'><span class='strut'>&nbsp;</span></p>
  4997. <p id='t1157' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>extractPlus7Stream</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  4998. <p id='t1158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_lang</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>3</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  4999. <p id='t1159' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>grep_webpage</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
  5000. <p id='t1160' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5001. <p id='t1161' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>r&#39;param name=&quot;movie&quot;.*?videorefFileUrl=(http[^\&#39;&quot;&amp;]*)&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5002. <p id='t1162' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='num'>0</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5003. <p id='t1163' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  5004. <p id='t1164' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;url&#39;</span><span class='op'>,</span> <span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5005. <p id='t1165' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5006. <p id='t1166' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5007. <p id='t1167' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5008. <p id='t1168' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>grep_webpage</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
  5009. <p id='t1169' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5010. <p id='t1170' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>r&#39;&lt;video lang=&quot;%s&quot; ref=&quot;(http[^\&#39;&quot;&amp;]*)&#39;</span> <span class='op'>%</span> <span class='nam'>video_lang</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5011. <p id='t1171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='num'>0</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5012. <p id='t1172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  5013. <p id='t1173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;url&#39;</span><span class='op'>,</span> <span class='str'>u&#39;ERROR: Could not find &lt;video&gt; tag: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5014. <p id='t1174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5015. <p id='t1175' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5016. <p id='t1176' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5017. <p id='t1177' class='pln'><span class='strut'>&nbsp;</span></p>
  5018. <p id='t1178' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>grep_webpage</span><span class='op'>(</span><span class='strut'>&nbsp;</span></p>
  5019. <p id='t1179' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>next_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5020. <p id='t1180' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>r&#39;&lt;video id=&quot;(.*?)&quot;.*?&gt;.*?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  5021. <p id='t1181' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;&lt;name&gt;(.*?)&lt;/name&gt;.*?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  5022. <p id='t1182' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;&lt;dateVideo&gt;(.*?)&lt;/dateVideo&gt;.*?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  5023. <p id='t1183' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;&lt;url quality=&quot;hd&quot;&gt;(.*?)&lt;/url&gt;&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5024. <p id='t1184' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5025. <p id='t1185' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  5026. <p id='t1186' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>1</span><span class='op'>,</span> <span class='str'>&#39;id&#39;</span><span class='op'>,</span>&nbsp; &nbsp; <span class='str'>u&#39;ERROR: could not extract video id: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5027. <p id='t1187' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>2</span><span class='op'>,</span> <span class='str'>&#39;title&#39;</span><span class='op'>,</span> <span class='str'>u&#39;ERROR: could not extract video title: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5028. <p id='t1188' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>3</span><span class='op'>,</span> <span class='str'>&#39;date&#39;</span><span class='op'>,</span>&nbsp; <span class='str'>u&#39;ERROR: could not extract video date: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5029. <p id='t1189' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='num'>4</span><span class='op'>,</span> <span class='str'>&#39;url&#39;</span><span class='op'>,</span>&nbsp;&nbsp; <span class='str'>u&#39;ERROR: could not extract video url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5030. <p id='t1190' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5031. <p id='t1191' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5032. <p id='t1192' class='pln'><span class='strut'>&nbsp;</span></p>
  5033. <p id='t1193' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  5034. <p id='t1194' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;id&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5035. <p id='t1195' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5036. <p id='t1196' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span>&nbsp; &nbsp;&nbsp; <span class='str'>u&#39;arte.tv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5037. <p id='t1197' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;date&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5038. <p id='t1198' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;title&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5039. <p id='t1199' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>u&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5040. <p id='t1200' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='str'>u&#39;NA&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5041. <p id='t1201' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span>&nbsp;&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5042. <p id='t1202' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5043. <p id='t1203' class='pln'><span class='strut'>&nbsp;</span></p>
  5044. <p id='t1204' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5045. <p id='t1205' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5046. <p id='t1206' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5047. <p id='t1207' class='pln'><span class='strut'>&nbsp;</span></p>
  5048. <p id='t1208' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_LIVE_URL</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5049. <p id='t1209' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>extractLiveStream</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5050. <p id='t1210' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5051. <p id='t1211' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5052. <p id='t1212' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>extractPlus7Stream</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5053. <p id='t1213' class='pln'><span class='strut'>&nbsp;</span></p>
  5054. <p id='t1214' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5055. <p id='t1215' class='pln'><span class='strut'>&nbsp;</span></p>
  5056. <p id='t1216' class='pln'><span class='strut'>&nbsp;</span></p>
  5057. <p id='t1217' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>GenericIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5058. <p id='t1218' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Generic last-resort information extractor.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5059. <p id='t1219' class='pln'><span class='strut'>&nbsp;</span></p>
  5060. <p id='t1220' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;.*&#39;</span><span class='strut'>&nbsp;</span></p>
  5061. <p id='t1221' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;generic&#39;</span><span class='strut'>&nbsp;</span></p>
  5062. <p id='t1222' class='pln'><span class='strut'>&nbsp;</span></p>
  5063. <p id='t1223' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5064. <p id='t1224' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5065. <p id='t1225' class='pln'><span class='strut'>&nbsp;</span></p>
  5066. <p id='t1226' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5067. <p id='t1227' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5068. <p id='t1228' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;WARNING: Falling back on generic information extractor.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5069. <p id='t1229' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[generic] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5070. <p id='t1230' class='pln'><span class='strut'>&nbsp;</span></p>
  5071. <p id='t1231' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5072. <p id='t1232' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5073. <p id='t1233' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[generic] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5074. <p id='t1234' class='pln'><span class='strut'>&nbsp;</span></p>
  5075. <p id='t1235' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_following_redirect</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>new_url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5076. <p id='t1236' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5077. <p id='t1237' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[redirect] Following redirect to %s&#39;</span> <span class='op'>%</span> <span class='nam'>new_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5078. <p id='t1238' class='pln'><span class='strut'>&nbsp;</span></p>
  5079. <p id='t1239' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_test_redirect</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5080. <p id='t1240' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Check if it is a redirect, like url shorteners, in case restart chain.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5081. <p id='t1241' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>HeadRequest</span><span class='op'>(</span><span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5082. <p id='t1242' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_method</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5083. <p id='t1243' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;HEAD&quot;</span><span class='strut'>&nbsp;</span></p>
  5084. <p id='t1244' class='pln'><span class='strut'>&nbsp;</span></p>
  5085. <p id='t1245' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>HEADRedirectHandler</span><span class='op'>(</span><span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>HTTPRedirectHandler</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5086. <p id='t1246' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5087. <p id='t1247' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Subclass the HTTPRedirectHandler to make it use our</span><span class='strut'>&nbsp;</span></p>
  5088. <p id='t1248' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HeadRequest also on the redirected URL</span><span class='strut'>&nbsp;</span></p>
  5089. <p id='t1249' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5090. <p id='t1250' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>redirect_request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>req</span><span class='op'>,</span> <span class='nam'>fp</span><span class='op'>,</span> <span class='nam'>code</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>headers</span><span class='op'>,</span> <span class='nam'>newurl</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5091. <p id='t1251' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>code</span> <span class='key'>in</span> <span class='op'>(</span><span class='num'>301</span><span class='op'>,</span> <span class='num'>302</span><span class='op'>,</span> <span class='num'>303</span><span class='op'>,</span> <span class='num'>307</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5092. <p id='t1252' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newurl</span> <span class='op'>=</span> <span class='nam'>newurl</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39; &#39;</span><span class='op'>,</span> <span class='str'>&#39;%20&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5093. <p id='t1253' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newheaders</span> <span class='op'>=</span> <span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>k</span><span class='op'>,</span><span class='nam'>v</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>k</span><span class='op'>,</span><span class='nam'>v</span> <span class='key'>in</span> <span class='nam'>req</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5094. <p id='t1254' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>k</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&quot;content-length&quot;</span><span class='op'>,</span> <span class='str'>&quot;content-type&quot;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5095. <p id='t1255' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>HeadRequest</span><span class='op'>(</span><span class='nam'>newurl</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5096. <p id='t1256' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>headers</span><span class='op'>=</span><span class='nam'>newheaders</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5097. <p id='t1257' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>origin_req_host</span><span class='op'>=</span><span class='nam'>req</span><span class='op'>.</span><span class='nam'>get_origin_req_host</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5098. <p id='t1258' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>unverifiable</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5099. <p id='t1259' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5100. <p id='t1260' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>HTTPError</span><span class='op'>(</span><span class='nam'>req</span><span class='op'>.</span><span class='nam'>get_full_url</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>code</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>headers</span><span class='op'>,</span> <span class='nam'>fp</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5101. <p id='t1261' class='pln'><span class='strut'>&nbsp;</span></p>
  5102. <p id='t1262' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>class</span> <span class='nam'>HTTPMethodFallback</span><span class='op'>(</span><span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>BaseHandler</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5103. <p id='t1263' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5104. <p id='t1264' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Fallback to GET if HEAD is not allowed (405 HTTP error)</span><span class='strut'>&nbsp;</span></p>
  5105. <p id='t1265' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5106. <p id='t1266' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>http_error_405</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>req</span><span class='op'>,</span> <span class='nam'>fp</span><span class='op'>,</span> <span class='nam'>code</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>headers</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5107. <p id='t1267' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>fp</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5108. <p id='t1268' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>fp</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5109. <p id='t1269' class='pln'><span class='strut'>&nbsp;</span></p>
  5110. <p id='t1270' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>newheaders</span> <span class='op'>=</span> <span class='nam'>dict</span><span class='op'>(</span><span class='op'>(</span><span class='nam'>k</span><span class='op'>,</span><span class='nam'>v</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>k</span><span class='op'>,</span><span class='nam'>v</span> <span class='key'>in</span> <span class='nam'>req</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>.</span><span class='nam'>items</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5111. <p id='t1271' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>k</span><span class='op'>.</span><span class='nam'>lower</span><span class='op'>(</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&quot;content-length&quot;</span><span class='op'>,</span> <span class='str'>&quot;content-type&quot;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5112. <p id='t1272' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>parent</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>req</span><span class='op'>.</span><span class='nam'>get_full_url</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5113. <p id='t1273' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>headers</span><span class='op'>=</span><span class='nam'>newheaders</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5114. <p id='t1274' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>origin_req_host</span><span class='op'>=</span><span class='nam'>req</span><span class='op'>.</span><span class='nam'>get_origin_req_host</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5115. <p id='t1275' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>unverifiable</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5116. <p id='t1276' class='pln'><span class='strut'>&nbsp;</span></p>
  5117. <p id='t1277' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Build our opener</span><span class='strut'>&nbsp;</span></p>
  5118. <p id='t1278' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>opener</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>OpenerDirector</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5119. <p id='t1279' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>handler</span> <span class='key'>in</span> <span class='op'>[</span><span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>HTTPHandler</span><span class='op'>,</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>HTTPDefaultErrorHandler</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5120. <p id='t1280' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>HTTPMethodFallback</span><span class='op'>,</span> <span class='nam'>HEADRedirectHandler</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5121. <p id='t1281' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>HTTPErrorProcessor</span><span class='op'>,</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>HTTPSHandler</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5122. <p id='t1282' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>opener</span><span class='op'>.</span><span class='nam'>add_handler</span><span class='op'>(</span><span class='nam'>handler</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5123. <p id='t1283' class='pln'><span class='strut'>&nbsp;</span></p>
  5124. <p id='t1284' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span> <span class='op'>=</span> <span class='nam'>opener</span><span class='op'>.</span><span class='nam'>open</span><span class='op'>(</span><span class='nam'>HeadRequest</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5125. <p id='t1285' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>new_url</span> <span class='op'>=</span> <span class='nam'>response</span><span class='op'>.</span><span class='nam'>geturl</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5126. <p id='t1286' class='pln'><span class='strut'>&nbsp;</span></p>
  5127. <p id='t1287' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>url</span> <span class='op'>==</span> <span class='nam'>new_url</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5128. <p id='t1288' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  5129. <p id='t1289' class='pln'><span class='strut'>&nbsp;</span></p>
  5130. <p id='t1290' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_following_redirect</span><span class='op'>(</span><span class='nam'>new_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5131. <p id='t1291' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>new_url</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5132. <p id='t1292' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
  5133. <p id='t1293' class='pln'><span class='strut'>&nbsp;</span></p>
  5134. <p id='t1294' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5135. <p id='t1295' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_test_redirect</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span> <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5136. <p id='t1296' class='pln'><span class='strut'>&nbsp;</span></p>
  5137. <p id='t1297' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5138. <p id='t1298' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5139. <p id='t1299' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5140. <p id='t1300' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5141. <p id='t1301' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5142. <p id='t1302' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5143. <p id='t1303' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5144. <p id='t1304' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5145. <p id='t1305' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5146. <p id='t1306' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># since this is the last-resort InfoExtractor, if</span><span class='strut'>&nbsp;</span></p>
  5147. <p id='t1307' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># this error is thrown, it&#39;ll be thrown here</span><span class='strut'>&nbsp;</span></p>
  5148. <p id='t1308' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5149. <p id='t1309' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5150. <p id='t1310' class='pln'><span class='strut'>&nbsp;</span></p>
  5151. <p id='t1311' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5152. <p id='t1312' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Start with something easy: JW Player in SWFObject</span><span class='strut'>&nbsp;</span></p>
  5153. <p id='t1313' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;flashvars: [\&#39;&quot;](?:.*&amp;)?file=(http[^\&#39;&quot;&amp;]*)&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5154. <p id='t1314' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5155. <p id='t1315' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Broaden the search a little bit</span><span class='strut'>&nbsp;</span></p>
  5156. <p id='t1316' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;[^A-Za-z0-9]?(?:file|source)=(http[^\&#39;&quot;&amp;]*)&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5157. <p id='t1317' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5158. <p id='t1318' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5159. <p id='t1319' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5160. <p id='t1320' class='pln'><span class='strut'>&nbsp;</span></p>
  5161. <p id='t1321' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># It&#39;s possible that one of the regexes</span><span class='strut'>&nbsp;</span></p>
  5162. <p id='t1322' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># matched, but returned an empty group:</span><span class='strut'>&nbsp;</span></p>
  5163. <p id='t1323' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5164. <p id='t1324' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5165. <p id='t1325' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5166. <p id='t1326' class='pln'><span class='strut'>&nbsp;</span></p>
  5167. <p id='t1327' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5168. <p id='t1328' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>basename</span><span class='op'>(</span><span class='nam'>video_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5169. <p id='t1329' class='pln'><span class='strut'>&nbsp;</span></p>
  5170. <p id='t1330' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># here&#39;s a fun little line of code for you:</span><span class='strut'>&nbsp;</span></p>
  5171. <p id='t1331' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5172. <p id='t1332' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5173. <p id='t1333' class='pln'><span class='strut'>&nbsp;</span></p>
  5174. <p id='t1334' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># it&#39;s tempting to parse this further, but you would</span><span class='strut'>&nbsp;</span></p>
  5175. <p id='t1335' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># have to take into account all the variations like</span><span class='strut'>&nbsp;</span></p>
  5176. <p id='t1336' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp;&nbsp; Video Title - Site Name</span><span class='strut'>&nbsp;</span></p>
  5177. <p id='t1337' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp;&nbsp; Site Name | Video Title</span><span class='strut'>&nbsp;</span></p>
  5178. <p id='t1338' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#&nbsp;&nbsp; Video Title - Tagline | Site Name</span><span class='strut'>&nbsp;</span></p>
  5179. <p id='t1339' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># and so on and so forth; it&#39;s just not practical</span><span class='strut'>&nbsp;</span></p>
  5180. <p id='t1340' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;title&gt;(.*)&lt;/title&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5181. <p id='t1341' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5182. <p id='t1342' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5183. <p id='t1343' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5184. <p id='t1344' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5185. <p id='t1345' class='pln'><span class='strut'>&nbsp;</span></p>
  5186. <p id='t1346' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># video uploader is domain name</span><span class='strut'>&nbsp;</span></p>
  5187. <p id='t1347' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r&#39;(?:https?://)?([^/]*)/.*&#39;</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5188. <p id='t1348' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5189. <p id='t1349' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5190. <p id='t1350' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5191. <p id='t1351' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5192. <p id='t1352' class='pln'><span class='strut'>&nbsp;</span></p>
  5193. <p id='t1353' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  5194. <p id='t1354' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5195. <p id='t1355' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5196. <p id='t1356' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5197. <p id='t1357' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5198. <p id='t1358' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5199. <p id='t1359' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5200. <p id='t1360' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5201. <p id='t1361' class='pln'><span class='strut'>&nbsp;</span></p>
  5202. <p id='t1362' class='pln'><span class='strut'>&nbsp;</span></p>
  5203. <p id='t1363' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoutubeSearchIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5204. <p id='t1364' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for YouTube search queries.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5205. <p id='t1365' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;ytsearch(\d+|all)?:[\s\S]+&#39;</span><span class='strut'>&nbsp;</span></p>
  5206. <p id='t1366' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_API_URL</span> <span class='op'>=</span> <span class='str'>&#39;https://gdata.youtube.com/feeds/api/videos?q=%s&amp;start-index=%i&amp;max-results=50&amp;v=2&amp;alt=jsonc&#39;</span><span class='strut'>&nbsp;</span></p>
  5207. <p id='t1367' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_max_youtube_results</span> <span class='op'>=</span> <span class='num'>1000</span><span class='strut'>&nbsp;</span></p>
  5208. <p id='t1368' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;youtube:search&#39;</span><span class='strut'>&nbsp;</span></p>
  5209. <p id='t1369' class='pln'><span class='strut'>&nbsp;</span></p>
  5210. <p id='t1370' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5211. <p id='t1371' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5212. <p id='t1372' class='pln'><span class='strut'>&nbsp;</span></p>
  5213. <p id='t1373' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5214. <p id='t1374' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download search page with given number.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5215. <p id='t1375' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>preferredencoding</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5216. <p id='t1376' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] query &quot;%s&quot;: Downloading page %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5217. <p id='t1377' class='pln'><span class='strut'>&nbsp;</span></p>
  5218. <p id='t1378' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5219. <p id='t1379' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5220. <p id='t1380' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5221. <p id='t1381' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid search query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5222. <p id='t1382' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5223. <p id='t1383' class='pln'><span class='strut'>&nbsp;</span></p>
  5224. <p id='t1384' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5225. <p id='t1385' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='num'>8</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5226. <p id='t1386' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5227. <p id='t1387' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5228. <p id='t1388' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5229. <p id='t1389' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5230. <p id='t1390' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;all&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5231. <p id='t1391' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_youtube_results</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5232. <p id='t1392' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5233. <p id='t1393' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5234. <p id='t1394' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5235. <p id='t1395' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5236. <p id='t1396' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>n</span> <span class='op'>&lt;=</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5237. <p id='t1397' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid download number %s for query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>n</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5238. <p id='t1398' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5239. <p id='t1399' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>n</span> <span class='op'>&gt;</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_youtube_results</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5240. <p id='t1400' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: ytsearch returns max %i results (you requested %i)&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_youtube_results</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5241. <p id='t1401' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_youtube_results</span><span class='strut'>&nbsp;</span></p>
  5242. <p id='t1402' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5243. <p id='t1403' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5244. <p id='t1404' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span><span class='op'>:</span> <span class='com'># parsing prefix as integer fails</span><span class='strut'>&nbsp;</span></p>
  5245. <p id='t1405' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5246. <p id='t1406' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5247. <p id='t1407' class='pln'><span class='strut'>&nbsp;</span></p>
  5248. <p id='t1408' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5249. <p id='t1409' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Downloads a specified number of results for a query&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5250. <p id='t1410' class='pln'><span class='strut'>&nbsp;</span></p>
  5251. <p id='t1411' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5252. <p id='t1412' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
  5253. <p id='t1413' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>limit</span> <span class='op'>=</span> <span class='nam'>n</span><span class='strut'>&nbsp;</span></p>
  5254. <p id='t1414' class='pln'><span class='strut'>&nbsp;</span></p>
  5255. <p id='t1415' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='op'>(</span><span class='num'>50</span> <span class='op'>*</span> <span class='nam'>pagenum</span><span class='op'>)</span> <span class='op'>&lt;</span> <span class='nam'>limit</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5256. <p id='t1416' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>+</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5257. <p id='t1417' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result_url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_API_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>quote_plus</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>)</span><span class='op'>,</span> <span class='op'>(</span><span class='num'>50</span><span class='op'>*</span><span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>+</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5258. <p id='t1418' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>result_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5259. <p id='t1419' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5260. <p id='t1420' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5261. <p id='t1421' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5262. <p id='t1422' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download API page: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5263. <p id='t1423' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5264. <p id='t1424' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api_response</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>)</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5265. <p id='t1425' class='pln'><span class='strut'>&nbsp;</span></p>
  5266. <p id='t1426' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>new_ids</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>video</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span> <span class='key'>for</span> <span class='nam'>video</span> <span class='key'>in</span> <span class='nam'>api_response</span><span class='op'>[</span><span class='str'>&#39;items&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5267. <p id='t1427' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>+=</span> <span class='nam'>new_ids</span><span class='strut'>&nbsp;</span></p>
  5268. <p id='t1428' class='pln'><span class='strut'>&nbsp;</span></p>
  5269. <p id='t1429' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>limit</span> <span class='op'>=</span> <span class='nam'>min</span><span class='op'>(</span><span class='nam'>n</span><span class='op'>,</span> <span class='nam'>api_response</span><span class='op'>[</span><span class='str'>&#39;totalItems&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5270. <p id='t1430' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5271. <p id='t1431' class='pln'><span class='strut'>&nbsp;</span></p>
  5272. <p id='t1432' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span> <span class='op'>&gt;</span> <span class='nam'>n</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5273. <p id='t1433' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='op'>:</span><span class='nam'>n</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5274. <p id='t1434' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5275. <p id='t1435' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://www.youtube.com/watch?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5276. <p id='t1436' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5277. <p id='t1437' class='pln'><span class='strut'>&nbsp;</span></p>
  5278. <p id='t1438' class='pln'><span class='strut'>&nbsp;</span></p>
  5279. <p id='t1439' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>GoogleSearchIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5280. <p id='t1440' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for Google Video search queries.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5281. <p id='t1441' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;gvsearch(\d+|all)?:[\s\S]+&#39;</span><span class='strut'>&nbsp;</span></p>
  5282. <p id='t1442' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_TEMPLATE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://video.google.com/videosearch?q=%s+site:video.google.com&amp;start=%s&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  5283. <p id='t1443' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VIDEO_INDICATOR</span> <span class='op'>=</span> <span class='str'>r&#39;&lt;a href=&quot;http://video\.google\.com/videoplay\?docid=([^&quot;\&amp;]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  5284. <p id='t1444' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='op'>=</span> <span class='str'>r&#39;class=&quot;pn&quot; id=&quot;pnnext&quot;&#39;</span><span class='strut'>&nbsp;</span></p>
  5285. <p id='t1445' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_max_google_results</span> <span class='op'>=</span> <span class='num'>1000</span><span class='strut'>&nbsp;</span></p>
  5286. <p id='t1446' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;video.google:search&#39;</span><span class='strut'>&nbsp;</span></p>
  5287. <p id='t1447' class='pln'><span class='strut'>&nbsp;</span></p>
  5288. <p id='t1448' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5289. <p id='t1449' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5290. <p id='t1450' class='pln'><span class='strut'>&nbsp;</span></p>
  5291. <p id='t1451' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5292. <p id='t1452' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download playlist page with given number.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5293. <p id='t1453' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>preferredencoding</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5294. <p id='t1454' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[video.google] query &quot;%s&quot;: Downloading page %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5295. <p id='t1455' class='pln'><span class='strut'>&nbsp;</span></p>
  5296. <p id='t1456' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5297. <p id='t1457' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5298. <p id='t1458' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5299. <p id='t1459' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid search query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5300. <p id='t1460' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5301. <p id='t1461' class='pln'><span class='strut'>&nbsp;</span></p>
  5302. <p id='t1462' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5303. <p id='t1463' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='num'>8</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5304. <p id='t1464' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5305. <p id='t1465' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5306. <p id='t1466' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5307. <p id='t1467' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5308. <p id='t1468' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;all&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5309. <p id='t1469' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_google_results</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5310. <p id='t1470' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5311. <p id='t1471' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5312. <p id='t1472' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5313. <p id='t1473' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5314. <p id='t1474' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>n</span> <span class='op'>&lt;=</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5315. <p id='t1475' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid download number %s for query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>n</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5316. <p id='t1476' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5317. <p id='t1477' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>n</span> <span class='op'>&gt;</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_google_results</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5318. <p id='t1478' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: gvsearch returns max %i results (you requested %i)&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_google_results</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5319. <p id='t1479' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_google_results</span><span class='strut'>&nbsp;</span></p>
  5320. <p id='t1480' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5321. <p id='t1481' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5322. <p id='t1482' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span><span class='op'>:</span> <span class='com'># parsing prefix as integer fails</span><span class='strut'>&nbsp;</span></p>
  5323. <p id='t1483' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5324. <p id='t1484' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5325. <p id='t1485' class='pln'><span class='strut'>&nbsp;</span></p>
  5326. <p id='t1486' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5327. <p id='t1487' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Downloads a specified number of results for a query&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5328. <p id='t1488' class='pln'><span class='strut'>&nbsp;</span></p>
  5329. <p id='t1489' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5330. <p id='t1490' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
  5331. <p id='t1491' class='pln'><span class='strut'>&nbsp;</span></p>
  5332. <p id='t1492' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5333. <p id='t1493' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5334. <p id='t1494' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result_url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_TEMPLATE_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>quote_plus</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>*</span><span class='num'>10</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5335. <p id='t1495' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>result_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5336. <p id='t1496' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5337. <p id='t1497' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5338. <p id='t1498' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5339. <p id='t1499' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5340. <p id='t1500' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5341. <p id='t1501' class='pln'><span class='strut'>&nbsp;</span></p>
  5342. <p id='t1502' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5343. <p id='t1503' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VIDEO_INDICATOR</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5344. <p id='t1504' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5345. <p id='t1505' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_id</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5346. <p id='t1506' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5347. <p id='t1507' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>n</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5348. <p id='t1508' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Specified n videos reached</span><span class='strut'>&nbsp;</span></p>
  5349. <p id='t1509' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5350. <p id='t1510' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://video.google.com/videoplay?docid=%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5351. <p id='t1511' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5352. <p id='t1512' class='pln'><span class='strut'>&nbsp;</span></p>
  5353. <p id='t1513' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_MORE_PAGES_INDICATOR</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5354. <p id='t1514' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5355. <p id='t1515' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://video.google.com/videoplay?docid=%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5356. <p id='t1516' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5357. <p id='t1517' class='pln'><span class='strut'>&nbsp;</span></p>
  5358. <p id='t1518' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='nam'>pagenum</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5359. <p id='t1519' class='pln'><span class='strut'>&nbsp;</span></p>
  5360. <p id='t1520' class='pln'><span class='strut'>&nbsp;</span></p>
  5361. <p id='t1521' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YahooSearchIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5362. <p id='t1522' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for Yahoo! Video search queries.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5363. <p id='t1523' class='pln'><span class='strut'>&nbsp;</span></p>
  5364. <p id='t1524' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  5365. <p id='t1525' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;yvsearch(\d+|all)?:[\s\S]+&#39;</span><span class='strut'>&nbsp;</span></p>
  5366. <p id='t1526' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_TEMPLATE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://video.yahoo.com/search/?p=%s&amp;o=%s&#39;</span><span class='strut'>&nbsp;</span></p>
  5367. <p id='t1527' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VIDEO_INDICATOR</span> <span class='op'>=</span> <span class='str'>r&#39;href=&quot;http://video\.yahoo\.com/watch/([0-9]+/[0-9]+)&quot;&#39;</span><span class='strut'>&nbsp;</span></p>
  5368. <p id='t1528' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='op'>=</span> <span class='str'>r&#39;\s*Next&#39;</span><span class='strut'>&nbsp;</span></p>
  5369. <p id='t1529' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_max_yahoo_results</span> <span class='op'>=</span> <span class='num'>1000</span><span class='strut'>&nbsp;</span></p>
  5370. <p id='t1530' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;video.yahoo:search&#39;</span><span class='strut'>&nbsp;</span></p>
  5371. <p id='t1531' class='pln'><span class='strut'>&nbsp;</span></p>
  5372. <p id='t1532' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5373. <p id='t1533' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5374. <p id='t1534' class='pln'><span class='strut'>&nbsp;</span></p>
  5375. <p id='t1535' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5376. <p id='t1536' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download playlist page with given number.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5377. <p id='t1537' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>preferredencoding</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5378. <p id='t1538' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[video.yahoo] query &quot;%s&quot;: Downloading page %s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5379. <p id='t1539' class='pln'><span class='strut'>&nbsp;</span></p>
  5380. <p id='t1540' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5381. <p id='t1541' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5382. <p id='t1542' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5383. <p id='t1543' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid search query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='nam'>query</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5384. <p id='t1544' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5385. <p id='t1545' class='pln'><span class='strut'>&nbsp;</span></p>
  5386. <p id='t1546' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span><span class='op'>,</span> <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5387. <p id='t1547' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>prefix</span> <span class='op'>=</span> <span class='nam'>prefix</span><span class='op'>[</span><span class='num'>8</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5388. <p id='t1548' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>query</span> <span class='op'>=</span> <span class='nam'>query</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5389. <p id='t1549' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5390. <p id='t1550' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5391. <p id='t1551' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5392. <p id='t1552' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>prefix</span> <span class='op'>==</span> <span class='str'>&#39;all&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5393. <p id='t1553' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_yahoo_results</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5394. <p id='t1554' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5395. <p id='t1555' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5396. <p id='t1556' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5397. <p id='t1557' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>prefix</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5398. <p id='t1558' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>n</span> <span class='op'>&lt;=</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5399. <p id='t1559' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid download number %s for query &quot;%s&quot;&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>n</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5400. <p id='t1560' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5401. <p id='t1561' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>n</span> <span class='op'>&gt;</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_yahoo_results</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5402. <p id='t1562' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: yvsearch returns max %i results (you requested %i)&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_yahoo_results</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5403. <p id='t1563' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>n</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_max_yahoo_results</span><span class='strut'>&nbsp;</span></p>
  5404. <p id='t1564' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5405. <p id='t1565' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5406. <p id='t1566' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>ValueError</span><span class='op'>:</span> <span class='com'># parsing prefix as integer fails</span><span class='strut'>&nbsp;</span></p>
  5407. <p id='t1567' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5408. <p id='t1568' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5409. <p id='t1569' class='pln'><span class='strut'>&nbsp;</span></p>
  5410. <p id='t1570' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_download_n_results</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>query</span><span class='op'>,</span> <span class='nam'>n</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5411. <p id='t1571' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Downloads a specified number of results for a query&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5412. <p id='t1572' class='pln'><span class='strut'>&nbsp;</span></p>
  5413. <p id='t1573' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5414. <p id='t1574' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>already_seen</span> <span class='op'>=</span> <span class='nam'>set</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5415. <p id='t1575' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5416. <p id='t1576' class='pln'><span class='strut'>&nbsp;</span></p>
  5417. <p id='t1577' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5418. <p id='t1578' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5419. <p id='t1579' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result_url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_TEMPLATE_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>quote_plus</span><span class='op'>(</span><span class='nam'>query</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5420. <p id='t1580' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>result_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5421. <p id='t1581' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5422. <p id='t1582' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5423. <p id='t1583' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5424. <p id='t1584' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5425. <p id='t1585' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5426. <p id='t1586' class='pln'><span class='strut'>&nbsp;</span></p>
  5427. <p id='t1587' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5428. <p id='t1588' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VIDEO_INDICATOR</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5429. <p id='t1589' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5430. <p id='t1590' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_id</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>already_seen</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5431. <p id='t1591' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5432. <p id='t1592' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>already_seen</span><span class='op'>.</span><span class='nam'>add</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5433. <p id='t1593' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>n</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5434. <p id='t1594' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Specified n videos reached</span><span class='strut'>&nbsp;</span></p>
  5435. <p id='t1595' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5436. <p id='t1596' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://video.yahoo.com/watch/%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5437. <p id='t1597' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5438. <p id='t1598' class='pln'><span class='strut'>&nbsp;</span></p>
  5439. <p id='t1599' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_MORE_PAGES_INDICATOR</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5440. <p id='t1600' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5441. <p id='t1601' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://video.yahoo.com/watch/%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5442. <p id='t1602' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5443. <p id='t1603' class='pln'><span class='strut'>&nbsp;</span></p>
  5444. <p id='t1604' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='nam'>pagenum</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5445. <p id='t1605' class='pln'><span class='strut'>&nbsp;</span></p>
  5446. <p id='t1606' class='pln'><span class='strut'>&nbsp;</span></p>
  5447. <p id='t1607' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoutubePlaylistIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5448. <p id='t1608' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for YouTube playlists.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5449. <p id='t1609' class='pln'><span class='strut'>&nbsp;</span></p>
  5450. <p id='t1610' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:(?:https?://)?(?:\w+\.)?youtube\.com/(?:(?:course|view_play_list|my_playlists|artist|playlist)\?.*?(p|a|list)=|user/.*?/user/|p/|user/.*?#[pg]/c/)(?:PL|EC)?|PL|EC)([0-9A-Za-z-_]{10,})(?:/.*?/([0-9A-Za-z_-]+))?.*&#39;</span><span class='strut'>&nbsp;</span></p>
  5451. <p id='t1611' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_TEMPLATE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://www.youtube.com/%s?%s=%s&amp;page=%s&amp;gl=US&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  5452. <p id='t1612' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VIDEO_INDICATOR_TEMPLATE</span> <span class='op'>=</span> <span class='str'>r&#39;/watch\?v=(.+?)&amp;amp;([^&amp;&quot;]+&amp;amp;)*list=.*?%s&#39;</span><span class='strut'>&nbsp;</span></p>
  5453. <p id='t1613' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='op'>=</span> <span class='str'>u&quot;Next \N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}&quot;</span><span class='strut'>&nbsp;</span></p>
  5454. <p id='t1614' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;youtube:playlist&#39;</span><span class='strut'>&nbsp;</span></p>
  5455. <p id='t1615' class='pln'><span class='strut'>&nbsp;</span></p>
  5456. <p id='t1616' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5457. <p id='t1617' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5458. <p id='t1618' class='pln'><span class='strut'>&nbsp;</span></p>
  5459. <p id='t1619' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5460. <p id='t1620' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download playlist page with given number.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5461. <p id='t1621' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] PL %s: Downloading page #%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5462. <p id='t1622' class='pln'><span class='strut'>&nbsp;</span></p>
  5463. <p id='t1623' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5464. <p id='t1624' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract playlist id</span><span class='strut'>&nbsp;</span></p>
  5465. <p id='t1625' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5466. <p id='t1626' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5467. <p id='t1627' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5468. <p id='t1628' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5469. <p id='t1629' class='pln'><span class='strut'>&nbsp;</span></p>
  5470. <p id='t1630' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Single video case</span><span class='strut'>&nbsp;</span></p>
  5471. <p id='t1631' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>3</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5472. <p id='t1632' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>3</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5473. <p id='t1633' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5474. <p id='t1634' class='pln'><span class='strut'>&nbsp;</span></p>
  5475. <p id='t1635' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Download playlist pages</span><span class='strut'>&nbsp;</span></p>
  5476. <p id='t1636' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># prefix is &#39;p&#39; as default for playlists but there are other types that need extra care</span><span class='strut'>&nbsp;</span></p>
  5477. <p id='t1637' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist_prefix</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5478. <p id='t1638' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>playlist_prefix</span> <span class='op'>==</span> <span class='str'>&#39;a&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5479. <p id='t1639' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist_access</span> <span class='op'>=</span> <span class='str'>&#39;artist&#39;</span><span class='strut'>&nbsp;</span></p>
  5480. <p id='t1640' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5481. <p id='t1641' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist_prefix</span> <span class='op'>=</span> <span class='str'>&#39;p&#39;</span><span class='strut'>&nbsp;</span></p>
  5482. <p id='t1642' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist_access</span> <span class='op'>=</span> <span class='str'>&#39;view_play_list&#39;</span><span class='strut'>&nbsp;</span></p>
  5483. <p id='t1643' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5484. <p id='t1644' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5485. <p id='t1645' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5486. <p id='t1646' class='pln'><span class='strut'>&nbsp;</span></p>
  5487. <p id='t1647' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5488. <p id='t1648' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5489. <p id='t1649' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_TEMPLATE_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>playlist_access</span><span class='op'>,</span> <span class='nam'>playlist_prefix</span><span class='op'>,</span> <span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5490. <p id='t1650' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5491. <p id='t1651' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5492. <p id='t1652' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5493. <p id='t1653' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5494. <p id='t1654' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5495. <p id='t1655' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5496. <p id='t1656' class='pln'><span class='strut'>&nbsp;</span></p>
  5497. <p id='t1657' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5498. <p id='t1658' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5499. <p id='t1659' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VIDEO_INDICATOR_TEMPLATE</span> <span class='op'>%</span> <span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5500. <p id='t1660' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>ids_in_page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5501. <p id='t1661' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5502. <p id='t1662' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5503. <p id='t1663' class='pln'><span class='strut'>&nbsp;</span></p>
  5504. <p id='t1664' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5505. <p id='t1665' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  5506. <p id='t1666' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='nam'>pagenum</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5507. <p id='t1667' class='pln'><span class='strut'>&nbsp;</span></p>
  5508. <p id='t1668' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>total</span> <span class='op'>=</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5509. <p id='t1669' class='pln'><span class='strut'>&nbsp;</span></p>
  5510. <p id='t1670' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playliststart</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playliststart&#39;</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='op'>-</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5511. <p id='t1671' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlistend</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playlistend&#39;</span><span class='op'>,</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5512. <p id='t1672' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>playlistend</span> <span class='op'>==</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5513. <p id='t1673' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5514. <p id='t1674' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5515. <p id='t1675' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='nam'>playlistend</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5516. <p id='t1676' class='pln'><span class='strut'>&nbsp;</span></p>
  5517. <p id='t1677' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span> <span class='op'>==</span> <span class='nam'>total</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5518. <p id='t1678' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] PL %s: Found %i videos&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>total</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5519. <p id='t1679' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5520. <p id='t1680' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] PL %s: Found %i videos, downloading %i&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>playlist_id</span><span class='op'>,</span> <span class='nam'>total</span><span class='op'>,</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5521. <p id='t1681' class='pln'><span class='strut'>&nbsp;</span></p>
  5522. <p id='t1682' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5523. <p id='t1683' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://www.youtube.com/watch?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5524. <p id='t1684' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5525. <p id='t1685' class='pln'><span class='strut'>&nbsp;</span></p>
  5526. <p id='t1686' class='pln'><span class='strut'>&nbsp;</span></p>
  5527. <p id='t1687' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoutubeChannelIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5528. <p id='t1688' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for YouTube channels.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5529. <p id='t1689' class='pln'><span class='strut'>&nbsp;</span></p>
  5530. <p id='t1690' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&quot;^(?:https?://)?(?:youtu\.be|(?:\w+\.)?youtube(?:-nocookie)?\.com)/channel/([0-9A-Za-z_-]+)(?:/.*)?$&quot;</span><span class='strut'>&nbsp;</span></p>
  5531. <p id='t1691' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_TEMPLATE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://www.youtube.com/channel/%s/videos?sort=da&amp;flow=list&amp;view=0&amp;page=%s&amp;gl=US&amp;hl=en&#39;</span><span class='strut'>&nbsp;</span></p>
  5532. <p id='t1692' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='op'>=</span> <span class='str'>u&quot;Next \N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}&quot;</span><span class='strut'>&nbsp;</span></p>
  5533. <p id='t1693' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;youtube:channel&#39;</span><span class='strut'>&nbsp;</span></p>
  5534. <p id='t1694' class='pln'><span class='strut'>&nbsp;</span></p>
  5535. <p id='t1695' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>channel_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5536. <p id='t1696' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download channel page with given number.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5537. <p id='t1697' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Channel %s: Downloading page #%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>channel_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5538. <p id='t1698' class='pln'><span class='strut'>&nbsp;</span></p>
  5539. <p id='t1699' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5540. <p id='t1700' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract channel id</span><span class='strut'>&nbsp;</span></p>
  5541. <p id='t1701' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5542. <p id='t1702' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5543. <p id='t1703' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5544. <p id='t1704' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5545. <p id='t1705' class='pln'><span class='strut'>&nbsp;</span></p>
  5546. <p id='t1706' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Download channel pages</span><span class='strut'>&nbsp;</span></p>
  5547. <p id='t1707' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>channel_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5548. <p id='t1708' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5549. <p id='t1709' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5550. <p id='t1710' class='pln'><span class='strut'>&nbsp;</span></p>
  5551. <p id='t1711' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5552. <p id='t1712' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>channel_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5553. <p id='t1713' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_TEMPLATE_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>channel_id</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5554. <p id='t1714' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5555. <p id='t1715' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5556. <p id='t1716' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5557. <p id='t1717' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5558. <p id='t1718' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5559. <p id='t1719' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5560. <p id='t1720' class='pln'><span class='strut'>&nbsp;</span></p>
  5561. <p id='t1721' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5562. <p id='t1722' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5563. <p id='t1723' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='str'>r&#39;href=&quot;/watch\?v=([0-9A-Za-z_-]+)&amp;&#39;</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5564. <p id='t1724' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>ids_in_page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5565. <p id='t1725' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5566. <p id='t1726' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5567. <p id='t1727' class='pln'><span class='strut'>&nbsp;</span></p>
  5568. <p id='t1728' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_MORE_PAGES_INDICATOR</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5569. <p id='t1729' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  5570. <p id='t1730' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='nam'>pagenum</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5571. <p id='t1731' class='pln'><span class='strut'>&nbsp;</span></p>
  5572. <p id='t1732' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] Channel %s: Found %i videos&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>channel_id</span><span class='op'>,</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5573. <p id='t1733' class='pln'><span class='strut'>&nbsp;</span></p>
  5574. <p id='t1734' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5575. <p id='t1735' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://www.youtube.com/watch?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5576. <p id='t1736' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5577. <p id='t1737' class='pln'><span class='strut'>&nbsp;</span></p>
  5578. <p id='t1738' class='pln'><span class='strut'>&nbsp;</span></p>
  5579. <p id='t1739' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoutubeUserIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5580. <p id='t1740' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for YouTube users.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5581. <p id='t1741' class='pln'><span class='strut'>&nbsp;</span></p>
  5582. <p id='t1742' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:(?:(?:https?://)?(?:\w+\.)?youtube\.com/user/)|ytuser:)([A-Za-z0-9_-]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  5583. <p id='t1743' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_TEMPLATE_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://gdata.youtube.com/feeds/api/users/%s&#39;</span><span class='strut'>&nbsp;</span></p>
  5584. <p id='t1744' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_GDATA_PAGE_SIZE</span> <span class='op'>=</span> <span class='num'>50</span><span class='strut'>&nbsp;</span></p>
  5585. <p id='t1745' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_GDATA_URL</span> <span class='op'>=</span> <span class='str'>&#39;http://gdata.youtube.com/feeds/api/users/%s/uploads?max-results=%d&amp;start-index=%d&#39;</span><span class='strut'>&nbsp;</span></p>
  5586. <p id='t1746' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VIDEO_INDICATOR</span> <span class='op'>=</span> <span class='str'>r&#39;/watch\?v=(.+?)[\&lt;&amp;]&#39;</span><span class='strut'>&nbsp;</span></p>
  5587. <p id='t1747' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;youtube:user&#39;</span><span class='strut'>&nbsp;</span></p>
  5588. <p id='t1748' class='pln'><span class='strut'>&nbsp;</span></p>
  5589. <p id='t1749' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5590. <p id='t1750' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5591. <p id='t1751' class='pln'><span class='strut'>&nbsp;</span></p>
  5592. <p id='t1752' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>username</span><span class='op'>,</span> <span class='nam'>start_index</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5593. <p id='t1753' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download user page.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5594. <p id='t1754' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[youtube] user %s: Downloading video ids from %d to %d&#39;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
  5595. <p id='t1755' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>start_index</span><span class='op'>,</span> <span class='nam'>start_index</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_GDATA_PAGE_SIZE</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5596. <p id='t1756' class='pln'><span class='strut'>&nbsp;</span></p>
  5597. <p id='t1757' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5598. <p id='t1758' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract username</span><span class='strut'>&nbsp;</span></p>
  5599. <p id='t1759' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5600. <p id='t1760' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5601. <p id='t1761' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5602. <p id='t1762' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5603. <p id='t1763' class='pln'><span class='strut'>&nbsp;</span></p>
  5604. <p id='t1764' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5605. <p id='t1765' class='pln'><span class='strut'>&nbsp;</span></p>
  5606. <p id='t1766' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Download video ids using YouTube Data API. Result size per</span><span class='strut'>&nbsp;</span></p>
  5607. <p id='t1767' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># query is limited (currently to 50 videos) so we need to query</span><span class='strut'>&nbsp;</span></p>
  5608. <p id='t1768' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># page by page until there are no video ids - it means we got</span><span class='strut'>&nbsp;</span></p>
  5609. <p id='t1769' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># all of them.</span><span class='strut'>&nbsp;</span></p>
  5610. <p id='t1770' class='pln'><span class='strut'>&nbsp;</span></p>
  5611. <p id='t1771' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5612. <p id='t1772' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
  5613. <p id='t1773' class='pln'><span class='strut'>&nbsp;</span></p>
  5614. <p id='t1774' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5615. <p id='t1775' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>start_index</span> <span class='op'>=</span> <span class='nam'>pagenum</span> <span class='op'>*</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_GDATA_PAGE_SIZE</span> <span class='op'>+</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5616. <p id='t1776' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>start_index</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5617. <p id='t1777' class='pln'><span class='strut'>&nbsp;</span></p>
  5618. <p id='t1778' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_GDATA_URL</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_GDATA_PAGE_SIZE</span><span class='op'>,</span> <span class='nam'>start_index</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5619. <p id='t1779' class='pln'><span class='strut'>&nbsp;</span></p>
  5620. <p id='t1780' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5621. <p id='t1781' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5622. <p id='t1782' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5623. <p id='t1783' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5624. <p id='t1784' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5625. <p id='t1785' class='pln'><span class='strut'>&nbsp;</span></p>
  5626. <p id='t1786' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5627. <p id='t1787' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5628. <p id='t1788' class='pln'><span class='strut'>&nbsp;</span></p>
  5629. <p id='t1789' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VIDEO_INDICATOR</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5630. <p id='t1790' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>ids_in_page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5631. <p id='t1791' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5632. <p id='t1792' class='pln'><span class='strut'>&nbsp;</span></p>
  5633. <p id='t1793' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5634. <p id='t1794' class='pln'><span class='strut'>&nbsp;</span></p>
  5635. <p id='t1795' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># A little optimization - if current page is not</span><span class='strut'>&nbsp;</span></p>
  5636. <p id='t1796' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># &quot;full&quot;, ie. does not contain PAGE_SIZE video ids then</span><span class='strut'>&nbsp;</span></p>
  5637. <p id='t1797' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># we can assume that this page is the last one - there</span><span class='strut'>&nbsp;</span></p>
  5638. <p id='t1798' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># are no more ids on further pages - no need to query</span><span class='strut'>&nbsp;</span></p>
  5639. <p id='t1799' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># again.</span><span class='strut'>&nbsp;</span></p>
  5640. <p id='t1800' class='pln'><span class='strut'>&nbsp;</span></p>
  5641. <p id='t1801' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span> <span class='op'>&lt;</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_GDATA_PAGE_SIZE</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5642. <p id='t1802' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  5643. <p id='t1803' class='pln'><span class='strut'>&nbsp;</span></p>
  5644. <p id='t1804' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5645. <p id='t1805' class='pln'><span class='strut'>&nbsp;</span></p>
  5646. <p id='t1806' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>all_ids_count</span> <span class='op'>=</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5647. <p id='t1807' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playliststart</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playliststart&#39;</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='op'>-</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5648. <p id='t1808' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlistend</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playlistend&#39;</span><span class='op'>,</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5649. <p id='t1809' class='pln'><span class='strut'>&nbsp;</span></p>
  5650. <p id='t1810' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>playlistend</span> <span class='op'>==</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5651. <p id='t1811' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5652. <p id='t1812' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5653. <p id='t1813' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='nam'>playlistend</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5654. <p id='t1814' class='pln'><span class='strut'>&nbsp;</span></p>
  5655. <p id='t1815' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&quot;[youtube] user %s: Collected %d video ids (downloading %d of them)&quot;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
  5656. <p id='t1816' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>all_ids_count</span><span class='op'>,</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5657. <p id='t1817' class='pln'><span class='strut'>&nbsp;</span></p>
  5658. <p id='t1818' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>video_id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5659. <p id='t1819' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>&#39;http://www.youtube.com/watch?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5660. <p id='t1820' class='pln'><span class='strut'>&nbsp;</span></p>
  5661. <p id='t1821' class='pln'><span class='strut'>&nbsp;</span></p>
  5662. <p id='t1822' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BlipTVUserIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5663. <p id='t1823' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for blip.tv users.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5664. <p id='t1824' class='pln'><span class='strut'>&nbsp;</span></p>
  5665. <p id='t1825' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:(?:(?:https?://)?(?:\w+\.)?blip\.tv/)|bliptvuser:)([^/]+)/*$&#39;</span><span class='strut'>&nbsp;</span></p>
  5666. <p id='t1826' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_PAGE_SIZE</span> <span class='op'>=</span> <span class='num'>12</span><span class='strut'>&nbsp;</span></p>
  5667. <p id='t1827' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;blip.tv:user&#39;</span><span class='strut'>&nbsp;</span></p>
  5668. <p id='t1828' class='pln'><span class='strut'>&nbsp;</span></p>
  5669. <p id='t1829' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5670. <p id='t1830' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5671. <p id='t1831' class='pln'><span class='strut'>&nbsp;</span></p>
  5672. <p id='t1832' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>username</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5673. <p id='t1833' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download user page.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5674. <p id='t1834' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] user %s: Downloading video ids from page %d&#39;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
  5675. <p id='t1835' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>username</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5676. <p id='t1836' class='pln'><span class='strut'>&nbsp;</span></p>
  5677. <p id='t1837' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5678. <p id='t1838' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract username</span><span class='strut'>&nbsp;</span></p>
  5679. <p id='t1839' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5680. <p id='t1840' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5681. <p id='t1841' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid url: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5682. <p id='t1842' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5683. <p id='t1843' class='pln'><span class='strut'>&nbsp;</span></p>
  5684. <p id='t1844' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>username</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5685. <p id='t1845' class='pln'><span class='strut'>&nbsp;</span></p>
  5686. <p id='t1846' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page_base</span> <span class='op'>=</span> <span class='str'>&#39;http://m.blip.tv/pr/show_get_full_episode_list?users_id=%s&amp;lite=0&amp;esi=1&#39;</span><span class='strut'>&nbsp;</span></p>
  5687. <p id='t1847' class='pln'><span class='strut'>&nbsp;</span></p>
  5688. <p id='t1848' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5689. <p id='t1849' class='pln'><span class='strut'>&nbsp;</span></p>
  5690. <p id='t1850' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5691. <p id='t1851' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5692. <p id='t1852' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;data-users-id=&quot;([^&quot;]+)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5693. <p id='t1853' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page_base</span> <span class='op'>=</span> <span class='nam'>page_base</span> <span class='op'>%</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5694. <p id='t1854' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5695. <p id='t1855' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5696. <p id='t1856' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5697. <p id='t1857' class='pln'><span class='strut'>&nbsp;</span></p>
  5698. <p id='t1858' class='pln'><span class='strut'>&nbsp;</span></p>
  5699. <p id='t1859' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Download video ids using BlipTV Ajax calls. Result size per</span><span class='strut'>&nbsp;</span></p>
  5700. <p id='t1860' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># query is limited (currently to 12 videos) so we need to query</span><span class='strut'>&nbsp;</span></p>
  5701. <p id='t1861' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># page by page until there are no video ids - it means we got</span><span class='strut'>&nbsp;</span></p>
  5702. <p id='t1862' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># all of them.</span><span class='strut'>&nbsp;</span></p>
  5703. <p id='t1863' class='pln'><span class='strut'>&nbsp;</span></p>
  5704. <p id='t1864' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5705. <p id='t1865' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5706. <p id='t1866' class='pln'><span class='strut'>&nbsp;</span></p>
  5707. <p id='t1867' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5708. <p id='t1868' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>username</span><span class='op'>,</span> <span class='nam'>pagenum</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5709. <p id='t1869' class='pln'><span class='strut'>&nbsp;</span></p>
  5710. <p id='t1870' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span> <span class='nam'>page_base</span> <span class='op'>+</span> <span class='str'>&quot;&amp;page=&quot;</span> <span class='op'>+</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>pagenum</span><span class='op'>)</span> <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5711. <p id='t1871' class='pln'><span class='strut'>&nbsp;</span></p>
  5712. <p id='t1872' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5713. <p id='t1873' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5714. <p id='t1874' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5715. <p id='t1875' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5716. <p id='t1876' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5717. <p id='t1877' class='pln'><span class='strut'>&nbsp;</span></p>
  5718. <p id='t1878' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video identifiers</span><span class='strut'>&nbsp;</span></p>
  5719. <p id='t1879' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5720. <p id='t1880' class='pln'><span class='strut'>&nbsp;</span></p>
  5721. <p id='t1881' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>mobj</span> <span class='key'>in</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='str'>r&#39;href=&quot;/([^&quot;]+)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5722. <p id='t1882' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>ids_in_page</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5723. <p id='t1883' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids_in_page</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5724. <p id='t1884' class='pln'><span class='strut'>&nbsp;</span></p>
  5725. <p id='t1885' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5726. <p id='t1886' class='pln'><span class='strut'>&nbsp;</span></p>
  5727. <p id='t1887' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># A little optimization - if current page is not</span><span class='strut'>&nbsp;</span></p>
  5728. <p id='t1888' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># &quot;full&quot;, ie. does not contain PAGE_SIZE video ids then</span><span class='strut'>&nbsp;</span></p>
  5729. <p id='t1889' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># we can assume that this page is the last one - there</span><span class='strut'>&nbsp;</span></p>
  5730. <p id='t1890' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># are no more ids on further pages - no need to query</span><span class='strut'>&nbsp;</span></p>
  5731. <p id='t1891' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># again.</span><span class='strut'>&nbsp;</span></p>
  5732. <p id='t1892' class='pln'><span class='strut'>&nbsp;</span></p>
  5733. <p id='t1893' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>ids_in_page</span><span class='op'>)</span> <span class='op'>&lt;</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_PAGE_SIZE</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5734. <p id='t1894' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  5735. <p id='t1895' class='pln'><span class='strut'>&nbsp;</span></p>
  5736. <p id='t1896' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pagenum</span> <span class='op'>+=</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5737. <p id='t1897' class='pln'><span class='strut'>&nbsp;</span></p>
  5738. <p id='t1898' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>all_ids_count</span> <span class='op'>=</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5739. <p id='t1899' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playliststart</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playliststart&#39;</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='op'>-</span> <span class='num'>1</span><span class='strut'>&nbsp;</span></p>
  5740. <p id='t1900' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlistend</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;playlistend&#39;</span><span class='op'>,</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5741. <p id='t1901' class='pln'><span class='strut'>&nbsp;</span></p>
  5742. <p id='t1902' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>playlistend</span> <span class='op'>==</span> <span class='op'>-</span><span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5743. <p id='t1903' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5744. <p id='t1904' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5745. <p id='t1905' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_ids</span> <span class='op'>=</span> <span class='nam'>video_ids</span><span class='op'>[</span><span class='nam'>playliststart</span><span class='op'>:</span><span class='nam'>playlistend</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5746. <p id='t1906' class='pln'><span class='strut'>&nbsp;</span></p>
  5747. <p id='t1907' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&quot;[%s] user %s: Collected %d video ids (downloading %d of them)&quot;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
  5748. <p id='t1908' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>username</span><span class='op'>,</span> <span class='nam'>all_ids_count</span><span class='op'>,</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>video_ids</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5749. <p id='t1909' class='pln'><span class='strut'>&nbsp;</span></p>
  5750. <p id='t1910' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>video_id</span> <span class='key'>in</span> <span class='nam'>video_ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5751. <p id='t1911' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>download</span><span class='op'>(</span><span class='op'>[</span><span class='str'>u&#39;http://blip.tv/&#39;</span><span class='op'>+</span><span class='nam'>video_id</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5752. <p id='t1912' class='pln'><span class='strut'>&nbsp;</span></p>
  5753. <p id='t1913' class='pln'><span class='strut'>&nbsp;</span></p>
  5754. <p id='t1914' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>DepositFilesIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5755. <p id='t1915' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for depositfiles.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5756. <p id='t1916' class='pln'><span class='strut'>&nbsp;</span></p>
  5757. <p id='t1917' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?(?:\w+\.)?depositfiles\.com/(?:../(?#locale))?files/(.+)&#39;</span><span class='strut'>&nbsp;</span></p>
  5758. <p id='t1918' class='pln'><span class='strut'>&nbsp;</span></p>
  5759. <p id='t1919' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5760. <p id='t1920' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5761. <p id='t1921' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[DepositFiles] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5762. <p id='t1922' class='pln'><span class='strut'>&nbsp;</span></p>
  5763. <p id='t1923' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5764. <p id='t1924' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5765. <p id='t1925' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[DepositFiles] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5766. <p id='t1926' class='pln'><span class='strut'>&nbsp;</span></p>
  5767. <p id='t1927' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5768. <p id='t1928' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_id</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5769. <p id='t1929' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Rebuild url in english locale</span><span class='strut'>&nbsp;</span></p>
  5770. <p id='t1930' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://depositfiles.com/en/files/&#39;</span> <span class='op'>+</span> <span class='nam'>file_id</span><span class='strut'>&nbsp;</span></p>
  5771. <p id='t1931' class='pln'><span class='strut'>&nbsp;</span></p>
  5772. <p id='t1932' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Retrieve file webpage with &#39;Free download&#39; button pressed</span><span class='strut'>&nbsp;</span></p>
  5773. <p id='t1933' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>free_download_indication</span> <span class='op'>=</span> <span class='op'>{</span> <span class='str'>&#39;gateway_result&#39;</span> <span class='op'>:</span> <span class='str'>&#39;1&#39;</span> <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5774. <p id='t1934' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='nam'>free_download_indication</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5775. <p id='t1935' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5776. <p id='t1936' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>file_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5777. <p id='t1937' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5778. <p id='t1938' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5779. <p id='t1939' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve file webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5780. <p id='t1940' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5781. <p id='t1941' class='pln'><span class='strut'>&nbsp;</span></p>
  5782. <p id='t1942' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Search for the real file URL</span><span class='strut'>&nbsp;</span></p>
  5783. <p id='t1943' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;form action=&quot;(http://fileshare.+?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5784. <p id='t1944' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>)</span> <span class='key'>or</span> <span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5785. <p id='t1945' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Try to figure out reason of the error.</span><span class='strut'>&nbsp;</span></p>
  5786. <p id='t1946' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;strong&gt;(Attention.*?)&lt;/strong&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5787. <p id='t1947' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='op'>(</span><span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>)</span> <span class='key'>and</span> <span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5788. <p id='t1948' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>restriction_message</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='str'>&#39;\s+&#39;</span><span class='op'>,</span> <span class='str'>&#39; &#39;</span><span class='op'>,</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5789. <p id='t1949' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: %s&#39;</span> <span class='op'>%</span> <span class='nam'>restriction_message</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5790. <p id='t1950' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5791. <p id='t1951' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract download URL from: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5792. <p id='t1952' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5793. <p id='t1953' class='pln'><span class='strut'>&nbsp;</span></p>
  5794. <p id='t1954' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5795. <p id='t1955' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_extension</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>file_url</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5796. <p id='t1956' class='pln'><span class='strut'>&nbsp;</span></p>
  5797. <p id='t1957' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Search for file title</span><span class='strut'>&nbsp;</span></p>
  5798. <p id='t1958' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;b title=&quot;(.*?)&quot;&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5799. <p id='t1959' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5800. <p id='t1960' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5801. <p id='t1961' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5802. <p id='t1962' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5803. <p id='t1963' class='pln'><span class='strut'>&nbsp;</span></p>
  5804. <p id='t1964' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  5805. <p id='t1965' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>file_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5806. <p id='t1966' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5807. <p id='t1967' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5808. <p id='t1968' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5809. <p id='t1969' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>file_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5810. <p id='t1970' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>file_extension</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5811. <p id='t1971' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5812. <p id='t1972' class='pln'><span class='strut'>&nbsp;</span></p>
  5813. <p id='t1973' class='pln'><span class='strut'>&nbsp;</span></p>
  5814. <p id='t1974' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FacebookIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5815. <p id='t1975' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for Facebook&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5816. <p id='t1976' class='pln'><span class='strut'>&nbsp;</span></p>
  5817. <p id='t1977' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  5818. <p id='t1978' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:\w+\.)?facebook\.com/(?:video/video|photo)\.php\?(?:.*?)v=(?P&lt;ID&gt;\d+)(?:.*)&#39;</span><span class='strut'>&nbsp;</span></p>
  5819. <p id='t1979' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_LOGIN_URL</span> <span class='op'>=</span> <span class='str'>&#39;https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php&amp;&#39;</span><span class='strut'>&nbsp;</span></p>
  5820. <p id='t1980' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_NETRC_MACHINE</span> <span class='op'>=</span> <span class='str'>&#39;facebook&#39;</span><span class='strut'>&nbsp;</span></p>
  5821. <p id='t1981' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_available_formats</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;video&#39;</span><span class='op'>,</span> <span class='str'>&#39;highqual&#39;</span><span class='op'>,</span> <span class='str'>&#39;lowqual&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5822. <p id='t1982' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_video_extensions</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  5823. <p id='t1983' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;video&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5824. <p id='t1984' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;highqual&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5825. <p id='t1985' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;lowqual&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5826. <p id='t1986' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5827. <p id='t1987' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;facebook&#39;</span><span class='strut'>&nbsp;</span></p>
  5828. <p id='t1988' class='pln'><span class='strut'>&nbsp;</span></p>
  5829. <p id='t1989' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5830. <p id='t1990' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5831. <p id='t1991' class='pln'><span class='strut'>&nbsp;</span></p>
  5832. <p id='t1992' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_reporter</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>message</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5833. <p id='t1993' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Add header and report message.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5834. <p id='t1994' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[facebook] %s&#39;</span> <span class='op'>%</span> <span class='nam'>message</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5835. <p id='t1995' class='pln'><span class='strut'>&nbsp;</span></p>
  5836. <p id='t1996' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_login</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5837. <p id='t1997' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to log in.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5838. <p id='t1998' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_reporter</span><span class='op'>(</span><span class='str'>u&#39;Logging in&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5839. <p id='t1999' class='pln'><span class='strut'>&nbsp;</span></p>
  5840. <p id='t2000' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_video_webpage_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5841. <p id='t2001' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download video webpage.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5842. <p id='t2002' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_reporter</span><span class='op'>(</span><span class='str'>u&#39;%s: Downloading video webpage&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5843. <p id='t2003' class='pln'><span class='strut'>&nbsp;</span></p>
  5844. <p id='t2004' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_information_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5845. <p id='t2005' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to extract video information.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5846. <p id='t2006' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_reporter</span><span class='op'>(</span><span class='str'>u&#39;%s: Extracting video information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5847. <p id='t2007' class='pln'><span class='strut'>&nbsp;</span></p>
  5848. <p id='t2008' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_parse_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5849. <p id='t2009' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Extract video information from page&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  5850. <p id='t2010' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># General data</span><span class='strut'>&nbsp;</span></p>
  5851. <p id='t2011' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='op'>{</span><span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='str'>r&#39;\(&quot;video_title&quot;, &quot;(.*?)&quot;\)&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5852. <p id='t2012' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='str'>r&#39;&lt;div class=&quot;datawrap&quot;&gt;(.*?)&lt;/div&gt;&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5853. <p id='t2013' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;owner&#39;</span><span class='op'>:</span> <span class='str'>r&#39;\(&quot;video_owner_name&quot;, &quot;(.*?)&quot;\)&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5854. <p id='t2014' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span>&nbsp; <span class='str'>r&#39;\(&quot;thumb_url&quot;, &quot;(?P&lt;THUMB&gt;.*?)&quot;\)&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5855. <p id='t2015' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5856. <p id='t2016' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5857. <p id='t2017' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>piece</span> <span class='key'>in</span> <span class='nam'>data</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5858. <p id='t2018' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>[</span><span class='nam'>piece</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5859. <p id='t2019' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5860. <p id='t2020' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info</span><span class='op'>[</span><span class='nam'>piece</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&quot;unicode_escape&quot;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5861. <p id='t2021' class='pln'><span class='strut'>&nbsp;</span></p>
  5862. <p id='t2022' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Video urls</span><span class='strut'>&nbsp;</span></p>
  5863. <p id='t2023' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_urls</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5864. <p id='t2024' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>fmt</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5865. <p id='t2025' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;\(&quot;%s_src\&quot;, &quot;(.+?)&quot;\)&#39;</span> <span class='op'>%</span> <span class='nam'>fmt</span><span class='op'>,</span> <span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5866. <p id='t2026' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5867. <p id='t2027' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># URL is in a Javascript segment inside an escaped Unicode format within</span><span class='strut'>&nbsp;</span></p>
  5868. <p id='t2028' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># the generally utf-8 page</span><span class='strut'>&nbsp;</span></p>
  5869. <p id='t2029' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_urls</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote_plus</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&quot;unicode_escape&quot;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5870. <p id='t2030' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;video_urls&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>video_urls</span><span class='strut'>&nbsp;</span></p>
  5871. <p id='t2031' class='pln'><span class='strut'>&nbsp;</span></p>
  5872. <p id='t2032' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>video_info</span><span class='strut'>&nbsp;</span></p>
  5873. <p id='t2033' class='pln'><span class='strut'>&nbsp;</span></p>
  5874. <p id='t2034' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_initialize</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5875. <p id='t2035' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5876. <p id='t2036' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5877. <p id='t2037' class='pln'><span class='strut'>&nbsp;</span></p>
  5878. <p id='t2038' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>useremail</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  5879. <p id='t2039' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  5880. <p id='t2040' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>downloader_params</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='strut'>&nbsp;</span></p>
  5881. <p id='t2041' class='pln'><span class='strut'>&nbsp;</span></p>
  5882. <p id='t2042' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Attempt to use provided username and password or .netrc data</span><span class='strut'>&nbsp;</span></p>
  5883. <p id='t2043' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>downloader_params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;username&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5884. <p id='t2044' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>useremail</span> <span class='op'>=</span> <span class='nam'>downloader_params</span><span class='op'>[</span><span class='str'>&#39;username&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5885. <p id='t2045' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>downloader_params</span><span class='op'>[</span><span class='str'>&#39;password&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5886. <p id='t2046' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>downloader_params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;usenetrc&#39;</span><span class='op'>,</span> <span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5887. <p id='t2047' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5888. <p id='t2048' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>netrc</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>authenticators</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_NETRC_MACHINE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5889. <p id='t2049' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>info</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5890. <p id='t2050' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>useremail</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5891. <p id='t2051' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>password</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5892. <p id='t2052' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5893. <p id='t2053' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>NetrcParseError</span><span class='op'>(</span><span class='str'>&#39;No authenticators for %s&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_NETRC_MACHINE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5894. <p id='t2054' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>IOError</span><span class='op'>,</span> <span class='nam'>netrc</span><span class='op'>.</span><span class='nam'>NetrcParseError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5895. <p id='t2055' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: parsing .netrc: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5896. <p id='t2056' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5897. <p id='t2057' class='pln'><span class='strut'>&nbsp;</span></p>
  5898. <p id='t2058' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>useremail</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5899. <p id='t2059' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5900. <p id='t2060' class='pln'><span class='strut'>&nbsp;</span></p>
  5901. <p id='t2061' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Log in</span><span class='strut'>&nbsp;</span></p>
  5902. <p id='t2062' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>login_form</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  5903. <p id='t2063' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;email&#39;</span><span class='op'>:</span> <span class='nam'>useremail</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5904. <p id='t2064' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;pass&#39;</span><span class='op'>:</span> <span class='nam'>password</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  5905. <p id='t2065' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;login&#39;</span><span class='op'>:</span> <span class='str'>&#39;Log+In&#39;</span><span class='strut'>&nbsp;</span></p>
  5906. <p id='t2066' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  5907. <p id='t2067' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_LOGIN_URL</span><span class='op'>,</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='nam'>login_form</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5908. <p id='t2068' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5909. <p id='t2069' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_login</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5910. <p id='t2070' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>login_results</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5911. <p id='t2071' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;form(.*)name=&quot;login&quot;(.*)&lt;/form&gt;&#39;</span><span class='op'>,</span> <span class='nam'>login_results</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5912. <p id='t2072' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to log in: bad username/password, or exceded login rate limit (~3/min). Check credentials or wait.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5913. <p id='t2073' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5914. <p id='t2074' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5915. <p id='t2075' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_stderr</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to log in: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5916. <p id='t2076' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5917. <p id='t2077' class='pln'><span class='strut'>&nbsp;</span></p>
  5918. <p id='t2078' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5919. <p id='t2079' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5920. <p id='t2080' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5921. <p id='t2081' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5922. <p id='t2082' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5923. <p id='t2083' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;ID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5924. <p id='t2084' class='pln'><span class='strut'>&nbsp;</span></p>
  5925. <p id='t2085' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get video webpage</span><span class='strut'>&nbsp;</span></p>
  5926. <p id='t2086' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_video_webpage_download</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5927. <p id='t2087' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='str'>&#39;https://www.facebook.com/video/video.php?v=%s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5928. <p id='t2088' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5929. <p id='t2089' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5930. <p id='t2090' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_webpage</span> <span class='op'>=</span> <span class='nam'>page</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5931. <p id='t2091' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5932. <p id='t2092' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5933. <p id='t2093' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5934. <p id='t2094' class='pln'><span class='strut'>&nbsp;</span></p>
  5935. <p id='t2095' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Start extracting information</span><span class='strut'>&nbsp;</span></p>
  5936. <p id='t2096' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_information_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5937. <p id='t2097' class='pln'><span class='strut'>&nbsp;</span></p>
  5938. <p id='t2098' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract information</span><span class='strut'>&nbsp;</span></p>
  5939. <p id='t2099' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_parse_page</span><span class='op'>(</span><span class='nam'>video_webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5940. <p id='t2100' class='pln'><span class='strut'>&nbsp;</span></p>
  5941. <p id='t2101' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># uploader</span><span class='strut'>&nbsp;</span></p>
  5942. <p id='t2102' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;owner&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5943. <p id='t2103' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract uploader nickname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5944. <p id='t2104' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5945. <p id='t2105' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_uploader</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;owner&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5946. <p id='t2106' class='pln'><span class='strut'>&nbsp;</span></p>
  5947. <p id='t2107' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># title</span><span class='strut'>&nbsp;</span></p>
  5948. <p id='t2108' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;title&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5949. <p id='t2109' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5950. <p id='t2110' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5951. <p id='t2111' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5952. <p id='t2112' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>video_title</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5953. <p id='t2113' class='pln'><span class='strut'>&nbsp;</span></p>
  5954. <p id='t2114' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># thumbnail image</span><span class='strut'>&nbsp;</span></p>
  5955. <p id='t2115' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;thumbnail&#39;</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5956. <p id='t2116' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: unable to extract video thumbnail&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5957. <p id='t2117' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='str'>&#39;&#39;</span><span class='strut'>&nbsp;</span></p>
  5958. <p id='t2118' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5959. <p id='t2119' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;thumbnail&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5960. <p id='t2120' class='pln'><span class='strut'>&nbsp;</span></p>
  5961. <p id='t2121' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># upload date</span><span class='strut'>&nbsp;</span></p>
  5962. <p id='t2122' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  5963. <p id='t2123' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;upload_date&#39;</span> <span class='key'>in</span> <span class='nam'>video_info</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5964. <p id='t2124' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_time</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;upload_date&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5965. <p id='t2125' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>timetuple</span> <span class='op'>=</span> <span class='nam'>email</span><span class='op'>.</span><span class='nam'>utils</span><span class='op'>.</span><span class='nam'>parsedate_tz</span><span class='op'>(</span><span class='nam'>upload_time</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5966. <p id='t2126' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>timetuple</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5967. <p id='t2127' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5968. <p id='t2128' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>time</span><span class='op'>.</span><span class='nam'>strftime</span><span class='op'>(</span><span class='str'>&#39;%Y%m%d&#39;</span><span class='op'>,</span> <span class='nam'>timetuple</span><span class='op'>[</span><span class='num'>0</span><span class='op'>:</span><span class='num'>9</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5969. <p id='t2129' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5970. <p id='t2130' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>pass</span><span class='strut'>&nbsp;</span></p>
  5971. <p id='t2131' class='pln'><span class='strut'>&nbsp;</span></p>
  5972. <p id='t2132' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># description</span><span class='strut'>&nbsp;</span></p>
  5973. <p id='t2133' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;description&#39;</span><span class='op'>,</span> <span class='str'>&#39;No description available.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5974. <p id='t2134' class='pln'><span class='strut'>&nbsp;</span></p>
  5975. <p id='t2135' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_map</span> <span class='op'>=</span> <span class='nam'>video_info</span><span class='op'>[</span><span class='str'>&#39;video_urls&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5976. <p id='t2136' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>url_map</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5977. <p id='t2137' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Decide which formats to download</span><span class='strut'>&nbsp;</span></p>
  5978. <p id='t2138' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req_format</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5979. <p id='t2139' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_limit</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format_limit&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5980. <p id='t2140' class='pln'><span class='strut'>&nbsp;</span></p>
  5981. <p id='t2141' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>format_limit</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='nam'>format_limit</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5982. <p id='t2142' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_list</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='op'>[</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='op'>.</span><span class='nam'>index</span><span class='op'>(</span><span class='nam'>format_limit</span><span class='op'>)</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5983. <p id='t2143' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5984. <p id='t2144' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_list</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_available_formats</span><span class='strut'>&nbsp;</span></p>
  5985. <p id='t2145' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>existing_formats</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>x</span> <span class='key'>for</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>format_list</span> <span class='key'>if</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>url_map</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  5986. <p id='t2146' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5987. <p id='t2147' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: no known formats available for video&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5988. <p id='t2148' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  5989. <p id='t2149' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>req_format</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5990. <p id='t2150' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span> <span class='com'># Best quality</span><span class='strut'>&nbsp;</span></p>
  5991. <p id='t2151' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>req_format</span> <span class='op'>==</span> <span class='str'>&#39;worst&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5992. <p id='t2152' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>existing_formats</span><span class='op'>[</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>existing_formats</span><span class='op'>)</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span> <span class='com'># worst quality</span><span class='strut'>&nbsp;</span></p>
  5993. <p id='t2153' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>req_format</span> <span class='op'>==</span> <span class='str'>&#39;-1&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5994. <p id='t2154' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>f</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>f</span><span class='op'>]</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>f</span> <span class='key'>in</span> <span class='nam'>existing_formats</span><span class='op'>]</span> <span class='com'># All formats</span><span class='strut'>&nbsp;</span></p>
  5995. <p id='t2155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5996. <p id='t2156' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Specific format</span><span class='strut'>&nbsp;</span></p>
  5997. <p id='t2157' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>req_format</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>url_map</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  5998. <p id='t2158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: requested format not available&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  5999. <p id='t2159' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6000. <p id='t2160' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url_list</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='nam'>req_format</span><span class='op'>,</span> <span class='nam'>url_map</span><span class='op'>[</span><span class='nam'>req_format</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span> <span class='com'># Specific format</span><span class='strut'>&nbsp;</span></p>
  6001. <p id='t2161' class='pln'><span class='strut'>&nbsp;</span></p>
  6002. <p id='t2162' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6003. <p id='t2163' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>format_param</span><span class='op'>,</span> <span class='nam'>video_real_url</span> <span class='key'>in</span> <span class='nam'>video_url_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6004. <p id='t2164' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extension</span><span class='strut'>&nbsp;</span></p>
  6005. <p id='t2165' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_extensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>format_param</span><span class='op'>,</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6006. <p id='t2166' class='pln'><span class='strut'>&nbsp;</span></p>
  6007. <p id='t2167' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6008. <p id='t2168' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6009. <p id='t2169' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_real_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6010. <p id='t2170' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>video_uploader</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6011. <p id='t2171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6012. <p id='t2172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6013. <p id='t2173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6014. <p id='t2174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span>&nbsp;&nbsp; <span class='op'>(</span><span class='nam'>format_param</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='str'>u&#39;NA&#39;</span> <span class='key'>or</span> <span class='nam'>format_param</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6015. <p id='t2175' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_thumbnail</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6016. <p id='t2176' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>video_description</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6017. <p id='t2177' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6018. <p id='t2178' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>results</span><span class='strut'>&nbsp;</span></p>
  6019. <p id='t2179' class='pln'><span class='strut'>&nbsp;</span></p>
  6020. <p id='t2180' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>BlipTVIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6021. <p id='t2181' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for blip.tv&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6022. <p id='t2182' class='pln'><span class='strut'>&nbsp;</span></p>
  6023. <p id='t2183' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:\w+\.)?blip\.tv(/.+)$&#39;</span><span class='strut'>&nbsp;</span></p>
  6024. <p id='t2184' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_URL_EXT</span> <span class='op'>=</span> <span class='str'>r&#39;^.*\.([a-z0-9]+)$&#39;</span><span class='strut'>&nbsp;</span></p>
  6025. <p id='t2185' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;blip.tv&#39;</span><span class='strut'>&nbsp;</span></p>
  6026. <p id='t2186' class='pln'><span class='strut'>&nbsp;</span></p>
  6027. <p id='t2187' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6028. <p id='t2188' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6029. <p id='t2189' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6030. <p id='t2190' class='pln'><span class='strut'>&nbsp;</span></p>
  6031. <p id='t2191' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_direct_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>title</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6032. <p id='t2192' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6033. <p id='t2193' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Direct download detected&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>title</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6034. <p id='t2194' class='pln'><span class='strut'>&nbsp;</span></p>
  6035. <p id='t2195' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6036. <p id='t2196' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6037. <p id='t2197' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6038. <p id='t2198' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6039. <p id='t2199' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6040. <p id='t2200' class='pln'><span class='strut'>&nbsp;</span></p>
  6041. <p id='t2201' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;?&#39;</span> <span class='key'>in</span> <span class='nam'>url</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6042. <p id='t2202' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cchar</span> <span class='op'>=</span> <span class='str'>&#39;&amp;&#39;</span><span class='strut'>&nbsp;</span></p>
  6043. <p id='t2203' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6044. <p id='t2204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cchar</span> <span class='op'>=</span> <span class='str'>&#39;?&#39;</span><span class='strut'>&nbsp;</span></p>
  6045. <p id='t2205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>json_url</span> <span class='op'>=</span> <span class='nam'>url</span> <span class='op'>+</span> <span class='nam'>cchar</span> <span class='op'>+</span> <span class='str'>&#39;skin=json&amp;version=2&amp;no_wrap=1&#39;</span><span class='strut'>&nbsp;</span></p>
  6046. <p id='t2206' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>json_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6047. <p id='t2207' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6048. <p id='t2208' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6049. <p id='t2209' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6050. <p id='t2210' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6051. <p id='t2211' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;Content-Type&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='str'>&#39;video/&#39;</span><span class='op'>)</span><span class='op'>:</span> <span class='com'># Direct download</span><span class='strut'>&nbsp;</span></p>
  6052. <p id='t2212' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>basename</span> <span class='op'>=</span> <span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6053. <p id='t2213' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span><span class='op'>,</span><span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>basename</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6054. <p id='t2214' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>title</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;UTF-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6055. <p id='t2215' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>ext</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6056. <p id='t2216' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_direct_download</span><span class='op'>(</span><span class='nam'>title</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6057. <p id='t2217' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6058. <p id='t2218' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6059. <p id='t2219' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6060. <p id='t2220' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6061. <p id='t2221' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6062. <p id='t2222' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6063. <p id='t2223' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>ext</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6064. <p id='t2224' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;urlhandle&#39;</span><span class='op'>:</span> <span class='nam'>urlh</span><span class='strut'>&nbsp;</span></p>
  6065. <p id='t2225' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6066. <p id='t2226' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6067. <p id='t2227' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6068. <p id='t2228' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6069. <p id='t2229' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>info</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span> <span class='com'># Regular URL</span><span class='strut'>&nbsp;</span></p>
  6070. <p id='t2230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6071. <p id='t2231' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>json_code_bytes</span> <span class='op'>=</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6072. <p id='t2232' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>json_code</span> <span class='op'>=</span> <span class='nam'>json_code_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6073. <p id='t2233' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6074. <p id='t2234' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to read video info webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6075. <p id='t2235' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6076. <p id='t2236' class='pln'><span class='strut'>&nbsp;</span></p>
  6077. <p id='t2237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6078. <p id='t2238' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>json_data</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>json_code</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6079. <p id='t2239' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;Post&#39;</span> <span class='key'>in</span> <span class='nam'>json_data</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6080. <p id='t2240' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;Post&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6081. <p id='t2241' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6082. <p id='t2242' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>data</span> <span class='op'>=</span> <span class='nam'>json_data</span><span class='strut'>&nbsp;</span></p>
  6083. <p id='t2243' class='pln'><span class='strut'>&nbsp;</span></p>
  6084. <p id='t2244' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>strptime</span><span class='op'>(</span><span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;datestamp&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>&#39;%m-%d-%y %H:%M%p&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strftime</span><span class='op'>(</span><span class='str'>&#39;%Y%m%d&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6085. <p id='t2245' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;media&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6086. <p id='t2246' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>umobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_URL_EXT</span><span class='op'>,</span> <span class='nam'>video_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6087. <p id='t2247' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>umobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6088. <p id='t2248' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>raise</span> <span class='nam'>ValueError</span><span class='op'>(</span><span class='str'>&#39;Can not determine filename extension&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6089. <p id='t2249' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>umobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6090. <p id='t2250' class='pln'><span class='strut'>&nbsp;</span></p>
  6091. <p id='t2251' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6092. <p id='t2252' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;item_id&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6093. <p id='t2253' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6094. <p id='t2254' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;display_name&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6095. <p id='t2255' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6096. <p id='t2256' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6097. <p id='t2257' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>ext</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6098. <p id='t2258' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;media&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;mimeType&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6099. <p id='t2259' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;thumbnailUrl&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6100. <p id='t2260' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6101. <p id='t2261' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span> <span class='nam'>data</span><span class='op'>[</span><span class='str'>&#39;embedUrl&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6102. <p id='t2262' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6103. <p id='t2263' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>ValueError</span><span class='op'>,</span><span class='nam'>KeyError</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6104. <p id='t2264' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to parse video information: %s&#39;</span> <span class='op'>%</span> <span class='nam'>repr</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6105. <p id='t2265' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6106. <p id='t2266' class='pln'><span class='strut'>&nbsp;</span></p>
  6107. <p id='t2267' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>std_headers</span><span class='op'>[</span><span class='str'>&#39;User-Agent&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>&#39;iTunes/10.6.1&#39;</span><span class='strut'>&nbsp;</span></p>
  6108. <p id='t2268' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6109. <p id='t2269' class='pln'><span class='strut'>&nbsp;</span></p>
  6110. <p id='t2270' class='pln'><span class='strut'>&nbsp;</span></p>
  6111. <p id='t2271' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MyVideoIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6112. <p id='t2272' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information Extractor for myvideo.de.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6113. <p id='t2273' class='pln'><span class='strut'>&nbsp;</span></p>
  6114. <p id='t2274' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:http://)?(?:www\.)?myvideo\.de/watch/([0-9]+)/([^?/]+).*&#39;</span><span class='strut'>&nbsp;</span></p>
  6115. <p id='t2275' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;myvideo&#39;</span><span class='strut'>&nbsp;</span></p>
  6116. <p id='t2276' class='pln'><span class='strut'>&nbsp;</span></p>
  6117. <p id='t2277' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6118. <p id='t2278' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6119. <p id='t2279' class='pln'><span class='strut'>&nbsp;</span></p>
  6120. <p id='t2280' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6121. <p id='t2281' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6122. <p id='t2282' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[myvideo] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6123. <p id='t2283' class='pln'><span class='strut'>&nbsp;</span></p>
  6124. <p id='t2284' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6125. <p id='t2285' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6126. <p id='t2286' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6127. <p id='t2287' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6128. <p id='t2288' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6129. <p id='t2289' class='pln'><span class='strut'>&nbsp;</span></p>
  6130. <p id='t2290' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6131. <p id='t2291' class='pln'><span class='strut'>&nbsp;</span></p>
  6132. <p id='t2292' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get video webpage</span><span class='strut'>&nbsp;</span></p>
  6133. <p id='t2293' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage_url</span> <span class='op'>=</span> <span class='str'>&#39;http://www.myvideo.de/watch/%s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  6134. <p id='t2294' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>webpage_url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6135. <p id='t2295' class='pln'><span class='strut'>&nbsp;</span></p>
  6136. <p id='t2296' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6137. <p id='t2297' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;link rel=\&#39;image_src\&#39; href=\&#39;(http://is[0-9].myvideo\.de/de/movie[0-9]+/[a-f0-9]+)/thumbs/[^.]+\.jpg\&#39; /&gt;&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6138. <p id='t2298' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6139. <p id='t2299' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6140. <p id='t2300' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract media URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6141. <p id='t2301' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6142. <p id='t2302' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='op'>+</span> <span class='op'>(</span><span class='str'>&#39;/%s.flv&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6143. <p id='t2303' class='pln'><span class='strut'>&nbsp;</span></p>
  6144. <p id='t2304' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;title&gt;([^&lt;]+)&lt;/title&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6145. <p id='t2305' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6146. <p id='t2306' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6147. <p id='t2307' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6148. <p id='t2308' class='pln'><span class='strut'>&nbsp;</span></p>
  6149. <p id='t2309' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6150. <p id='t2310' class='pln'><span class='strut'>&nbsp;</span></p>
  6151. <p id='t2311' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6152. <p id='t2312' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6153. <p id='t2313' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6154. <p id='t2314' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6155. <p id='t2315' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6156. <p id='t2316' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6157. <p id='t2317' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='str'>u&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6158. <p id='t2318' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6159. <p id='t2319' class='pln'><span class='strut'>&nbsp;</span></p>
  6160. <p id='t2320' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>ComedyCentralIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6161. <p id='t2321' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for The Daily Show and Colbert Report &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6162. <p id='t2322' class='pln'><span class='strut'>&nbsp;</span></p>
  6163. <p id='t2323' class='pln'>&nbsp; &nbsp; <span class='com'># urls can be abbreviations like :thedailyshow or :colbert</span><span class='strut'>&nbsp;</span></p>
  6164. <p id='t2324' class='pln'>&nbsp; &nbsp; <span class='com'># urls for episodes like:</span><span class='strut'>&nbsp;</span></p>
  6165. <p id='t2325' class='pln'>&nbsp; &nbsp; <span class='com'># or urls for clips like: http://www.thedailyshow.com/watch/mon-december-10-2012/any-given-gun-day</span><span class='strut'>&nbsp;</span></p>
  6166. <p id='t2326' class='pln'>&nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; or: http://www.colbertnation.com/the-colbert-report-videos/421667/november-29-2012/moon-shattering-news</span><span class='strut'>&nbsp;</span></p>
  6167. <p id='t2327' class='pln'>&nbsp; &nbsp; <span class='com'>#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; or: http://www.colbertnation.com/the-colbert-report-collections/422008/festival-of-lights/79524</span><span class='strut'>&nbsp;</span></p>
  6168. <p id='t2328' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&quot;&quot;&quot;^(:(?P&lt;shortname&gt;tds|thedailyshow|cr|colbert|colbertnation|colbertreport)</span><span class='strut'>&nbsp;</span></p>
  6169. <p id='t2329' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |(https?://)?(www\.)?</span><span class='strut'>&nbsp;</span></p>
  6170. <p id='t2330' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?P&lt;showname&gt;thedailyshow|colbertnation)\.com/</span><span class='strut'>&nbsp;</span></p>
  6171. <p id='t2331' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; (full-episodes/(?P&lt;episode&gt;.*)|</span><span class='strut'>&nbsp;</span></p>
  6172. <p id='t2332' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?P&lt;clip&gt;</span><span class='strut'>&nbsp;</span></p>
  6173. <p id='t2333' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (the-colbert-report-(videos|collections)/(?P&lt;clipID&gt;[0-9]+)/[^/]*/(?P&lt;cntitle&gt;.*?))</span><span class='strut'>&nbsp;</span></p>
  6174. <p id='t2334' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |(watch/(?P&lt;date&gt;[^/]*)/(?P&lt;tdstitle&gt;.*)))))</span><span class='strut'>&nbsp;</span></p>
  6175. <p id='t2335' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; $&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6176. <p id='t2336' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;comedycentral&#39;</span><span class='strut'>&nbsp;</span></p>
  6177. <p id='t2337' class='pln'><span class='strut'>&nbsp;</span></p>
  6178. <p id='t2338' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_available_formats</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>&#39;3500&#39;</span><span class='op'>,</span> <span class='str'>&#39;2200&#39;</span><span class='op'>,</span> <span class='str'>&#39;1700&#39;</span><span class='op'>,</span> <span class='str'>&#39;1200&#39;</span><span class='op'>,</span> <span class='str'>&#39;750&#39;</span><span class='op'>,</span> <span class='str'>&#39;400&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6179. <p id='t2339' class='pln'><span class='strut'>&nbsp;</span></p>
  6180. <p id='t2340' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_video_extensions</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6181. <p id='t2341' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;3500&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6182. <p id='t2342' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;2200&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6183. <p id='t2343' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;1700&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6184. <p id='t2344' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;1200&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6185. <p id='t2345' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;750&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6186. <p id='t2346' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;400&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6187. <p id='t2347' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6188. <p id='t2348' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_video_dimensions</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6189. <p id='t2349' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;3500&#39;</span><span class='op'>:</span> <span class='str'>&#39;1280x720&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6190. <p id='t2350' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;2200&#39;</span><span class='op'>:</span> <span class='str'>&#39;960x540&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6191. <p id='t2351' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;1700&#39;</span><span class='op'>:</span> <span class='str'>&#39;768x432&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6192. <p id='t2352' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;1200&#39;</span><span class='op'>:</span> <span class='str'>&#39;640x360&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6193. <p id='t2353' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;750&#39;</span><span class='op'>:</span> <span class='str'>&#39;512x288&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6194. <p id='t2354' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;400&#39;</span><span class='op'>:</span> <span class='str'>&#39;384x216&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6195. <p id='t2355' class='pln'>&nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6196. <p id='t2356' class='pln'><span class='strut'>&nbsp;</span></p>
  6197. <p id='t2357' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>suitable</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6198. <p id='t2358' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Receives a URL and returns True if suitable for this IE.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6199. <p id='t2359' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6200. <p id='t2360' class='pln'><span class='strut'>&nbsp;</span></p>
  6201. <p id='t2361' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6202. <p id='t2362' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[comedycentral] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6203. <p id='t2363' class='pln'><span class='strut'>&nbsp;</span></p>
  6204. <p id='t2364' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_config_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6205. <p id='t2365' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[comedycentral] %s: Downloading configuration&#39;</span> <span class='op'>%</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6206. <p id='t2366' class='pln'><span class='strut'>&nbsp;</span></p>
  6207. <p id='t2367' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_index_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6208. <p id='t2368' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[comedycentral] %s: Downloading show index&#39;</span> <span class='op'>%</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6209. <p id='t2369' class='pln'><span class='strut'>&nbsp;</span></p>
  6210. <p id='t2370' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_player_url</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6211. <p id='t2371' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[comedycentral] %s: Determining player URL&#39;</span> <span class='op'>%</span> <span class='nam'>episode_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6212. <p id='t2372' class='pln'><span class='strut'>&nbsp;</span></p>
  6213. <p id='t2373' class='pln'><span class='strut'>&nbsp;</span></p>
  6214. <p id='t2374' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_print_formats</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>formats</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6215. <p id='t2375' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;Available formats:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6216. <p id='t2376' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>x</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6217. <p id='t2377' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;%s\t:\t%s\t[%s]&#39;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_extensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_video_dimensions</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='nam'>x</span><span class='op'>,</span> <span class='str'>&#39;???&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6218. <p id='t2378' class='pln'><span class='strut'>&nbsp;</span></p>
  6219. <p id='t2379' class='pln'><span class='strut'>&nbsp;</span></p>
  6220. <p id='t2380' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6221. <p id='t2381' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6222. <p id='t2382' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6223. <p id='t2383' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6224. <p id='t2384' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6225. <p id='t2385' class='pln'><span class='strut'>&nbsp;</span></p>
  6226. <p id='t2386' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;shortname&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6227. <p id='t2387' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;shortname&#39;</span><span class='op'>)</span> <span class='key'>in</span> <span class='op'>(</span><span class='str'>&#39;tds&#39;</span><span class='op'>,</span> <span class='str'>&#39;thedailyshow&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6228. <p id='t2388' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>u&#39;http://www.thedailyshow.com/full-episodes/&#39;</span><span class='strut'>&nbsp;</span></p>
  6229. <p id='t2389' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6230. <p id='t2390' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>u&#39;http://www.colbertnation.com/full-episodes/&#39;</span><span class='strut'>&nbsp;</span></p>
  6231. <p id='t2391' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6232. <p id='t2392' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6233. <p id='t2393' class='pln'><span class='strut'>&nbsp;</span></p>
  6234. <p id='t2394' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;clip&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6235. <p id='t2395' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;showname&#39;</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>&#39;thedailyshow&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6236. <p id='t2396' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>epTitle</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;tdstitle&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6237. <p id='t2397' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6238. <p id='t2398' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>epTitle</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;cntitle&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6239. <p id='t2399' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>dlNewest</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  6240. <p id='t2400' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6241. <p id='t2401' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>dlNewest</span> <span class='op'>=</span> <span class='key'>not</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;episode&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6242. <p id='t2402' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>dlNewest</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6243. <p id='t2403' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>epTitle</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;showname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6244. <p id='t2404' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6245. <p id='t2405' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>epTitle</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;episode&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6246. <p id='t2406' class='pln'><span class='strut'>&nbsp;</span></p>
  6247. <p id='t2407' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6248. <p id='t2408' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>epTitle</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6249. <p id='t2409' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6250. <p id='t2410' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>htmlHandle</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>req</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6251. <p id='t2411' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>html</span> <span class='op'>=</span> <span class='nam'>htmlHandle</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6252. <p id='t2412' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6253. <p id='t2413' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6254. <p id='t2414' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6255. <p id='t2415' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>dlNewest</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6256. <p id='t2416' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>htmlHandle</span><span class='op'>.</span><span class='nam'>geturl</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6257. <p id='t2417' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6258. <p id='t2418' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6259. <p id='t2419' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid redirected URL: &#39;</span> <span class='op'>+</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6260. <p id='t2420' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6261. <p id='t2421' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;episode&#39;</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>&#39;&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6262. <p id='t2422' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Redirected URL is still not specific: &#39;</span> <span class='op'>+</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6263. <p id='t2423' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6264. <p id='t2424' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>epTitle</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;episode&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6265. <p id='t2425' class='pln'><span class='strut'>&nbsp;</span></p>
  6266. <p id='t2426' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mMovieParams</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;(?:&lt;param name=&quot;movie&quot; value=&quot;|var url = &quot;)(http://media.mtvnservices.com/([^&quot;]*(?:episode|video).*?:.*?))&quot;&#39;</span><span class='op'>,</span> <span class='nam'>html</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6267. <p id='t2427' class='pln'><span class='strut'>&nbsp;</span></p>
  6268. <p id='t2428' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>mMovieParams</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6269. <p id='t2429' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># The Colbert Report embeds the information in a without</span><span class='strut'>&nbsp;</span></p>
  6270. <p id='t2430' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># a URL prefix; so extract the alternate reference</span><span class='strut'>&nbsp;</span></p>
  6271. <p id='t2431' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># and then add the URL prefix manually.</span><span class='strut'>&nbsp;</span></p>
  6272. <p id='t2432' class='pln'><span class='strut'>&nbsp;</span></p>
  6273. <p id='t2433' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>altMovieParams</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;data-mgid=&quot;([^&quot;]*(?:episode|video).*?:.*?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>html</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6274. <p id='t2434' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>altMovieParams</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6275. <p id='t2435' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to find Flash URL in webpage &#39;</span> <span class='op'>+</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6276. <p id='t2436' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6277. <p id='t2437' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6278. <p id='t2438' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mMovieParams</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>(</span><span class='str'>&quot;http://media.mtvnservices.com/&quot;</span> <span class='op'>+</span> <span class='nam'>altMovieParams</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>altMovieParams</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6279. <p id='t2439' class='pln'><span class='strut'>&nbsp;</span></p>
  6280. <p id='t2440' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playerUrl_raw</span> <span class='op'>=</span> <span class='nam'>mMovieParams</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6281. <p id='t2441' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_player_url</span><span class='op'>(</span><span class='nam'>epTitle</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6282. <p id='t2442' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6283. <p id='t2443' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlHandle</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>playerUrl_raw</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6284. <p id='t2444' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playerUrl</span> <span class='op'>=</span> <span class='nam'>urlHandle</span><span class='op'>.</span><span class='nam'>geturl</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6285. <p id='t2445' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6286. <p id='t2446' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to find out player URL: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6287. <p id='t2447' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6288. <p id='t2448' class='pln'><span class='strut'>&nbsp;</span></p>
  6289. <p id='t2449' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uri</span> <span class='op'>=</span> <span class='nam'>mMovieParams</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6290. <p id='t2450' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>indexUrl</span> <span class='op'>=</span> <span class='str'>&#39;http://shadow.comedycentral.com/feeds/video_player/mrss/?&#39;</span> <span class='op'>+</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;uri&#39;</span><span class='op'>:</span> <span class='nam'>uri</span><span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6291. <p id='t2451' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_index_download</span><span class='op'>(</span><span class='nam'>epTitle</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6292. <p id='t2452' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6293. <p id='t2453' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>indexXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>indexUrl</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6294. <p id='t2454' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6295. <p id='t2455' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download episode index: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6296. <p id='t2456' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6297. <p id='t2457' class='pln'><span class='strut'>&nbsp;</span></p>
  6298. <p id='t2458' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6299. <p id='t2459' class='pln'><span class='strut'>&nbsp;</span></p>
  6300. <p id='t2460' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>idoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>indexXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6301. <p id='t2461' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>itemEls</span> <span class='op'>=</span> <span class='nam'>idoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;.//item&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6302. <p id='t2462' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>itemEl</span> <span class='key'>in</span> <span class='nam'>itemEls</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6303. <p id='t2463' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mediaId</span> <span class='op'>=</span> <span class='nam'>itemEl</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./guid&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6304. <p id='t2464' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>shortMediaId</span> <span class='op'>=</span> <span class='nam'>mediaId</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6305. <p id='t2465' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>showId</span> <span class='op'>=</span> <span class='nam'>mediaId</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;:&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>2</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;.com&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6306. <p id='t2466' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>officialTitle</span> <span class='op'>=</span> <span class='nam'>itemEl</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./title&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6307. <p id='t2467' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>officialDate</span> <span class='op'>=</span> <span class='nam'>itemEl</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./pubDate&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6308. <p id='t2468' class='pln'><span class='strut'>&nbsp;</span></p>
  6309. <p id='t2469' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configUrl</span> <span class='op'>=</span> <span class='op'>(</span><span class='str'>&#39;http://www.comedycentral.com/global/feeds/entertainment/media/mediaGenEntertainment.jhtml?&#39;</span> <span class='op'>+</span><span class='strut'>&nbsp;</span></p>
  6310. <p id='t2470' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>urlencode</span><span class='op'>(</span><span class='op'>{</span><span class='str'>&#39;uri&#39;</span><span class='op'>:</span> <span class='nam'>mediaId</span><span class='op'>}</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6311. <p id='t2471' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configReq</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>configUrl</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6312. <p id='t2472' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_config_download</span><span class='op'>(</span><span class='nam'>epTitle</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6313. <p id='t2473' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6314. <p id='t2474' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>configReq</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6315. <p id='t2475' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6316. <p id='t2476' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6317. <p id='t2477' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6318. <p id='t2478' class='pln'><span class='strut'>&nbsp;</span></p>
  6319. <p id='t2479' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>cdoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>configXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6320. <p id='t2480' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>turls</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6321. <p id='t2481' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>rendition</span> <span class='key'>in</span> <span class='nam'>cdoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;.//rendition&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6322. <p id='t2482' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>finfo</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;bitrate&#39;</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./src&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6323. <p id='t2483' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>turls</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>finfo</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6324. <p id='t2484' class='pln'><span class='strut'>&nbsp;</span></p>
  6325. <p id='t2485' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>turls</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6326. <p id='t2486' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;\nERROR: unable to download &#39;</span> <span class='op'>+</span> <span class='nam'>mediaId</span> <span class='op'>+</span> <span class='str'>&#39;: No videos found&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6327. <p id='t2487' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>continue</span><span class='strut'>&nbsp;</span></p>
  6328. <p id='t2488' class='pln'><span class='strut'>&nbsp;</span></p>
  6329. <p id='t2489' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;listformats&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6330. <p id='t2490' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_print_formats</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>i</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>turls</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6331. <p id='t2491' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6332. <p id='t2492' class='pln'><span class='strut'>&nbsp;</span></p>
  6333. <p id='t2493' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># For now, just pick the highest bitrate</span><span class='strut'>&nbsp;</span></p>
  6334. <p id='t2494' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span><span class='op'>,</span><span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>turls</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6335. <p id='t2495' class='pln'><span class='strut'>&nbsp;</span></p>
  6336. <p id='t2496' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get the format arg from the arg stream</span><span class='strut'>&nbsp;</span></p>
  6337. <p id='t2497' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req_format</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6338. <p id='t2498' class='pln'><span class='strut'>&nbsp;</span></p>
  6339. <p id='t2499' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Select format if we can find one</span><span class='strut'>&nbsp;</span></p>
  6340. <p id='t2500' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>f</span><span class='op'>,</span><span class='nam'>v</span> <span class='key'>in</span> <span class='nam'>turls</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6341. <p id='t2501' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>f</span> <span class='op'>==</span> <span class='nam'>req_format</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6342. <p id='t2502' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span><span class='op'>,</span> <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>f</span><span class='op'>,</span> <span class='nam'>v</span><span class='strut'>&nbsp;</span></p>
  6343. <p id='t2503' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  6344. <p id='t2504' class='pln'><span class='strut'>&nbsp;</span></p>
  6345. <p id='t2505' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Patch to download from alternative CDN, which does not</span><span class='strut'>&nbsp;</span></p>
  6346. <p id='t2506' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># break on current RTMPDump builds</span><span class='strut'>&nbsp;</span></p>
  6347. <p id='t2507' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>broken_cdn</span> <span class='op'>=</span> <span class='str'>&quot;rtmpe://viacomccstrmfs.fplive.net/viacomccstrm/gsp.comedystor/&quot;</span><span class='strut'>&nbsp;</span></p>
  6348. <p id='t2508' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>better_cdn</span> <span class='op'>=</span> <span class='str'>&quot;rtmpe://cp10740.edgefcs.net/ondemand/mtvnorigin/gsp.comedystor/&quot;</span><span class='strut'>&nbsp;</span></p>
  6349. <p id='t2509' class='pln'><span class='strut'>&nbsp;</span></p>
  6350. <p id='t2510' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>startswith</span><span class='op'>(</span><span class='nam'>broken_cdn</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6351. <p id='t2511' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>broken_cdn</span><span class='op'>,</span> <span class='nam'>better_cdn</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6352. <p id='t2512' class='pln'><span class='strut'>&nbsp;</span></p>
  6353. <p id='t2513' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>effTitle</span> <span class='op'>=</span> <span class='nam'>showId</span> <span class='op'>+</span> <span class='str'>u&#39;-&#39;</span> <span class='op'>+</span> <span class='nam'>epTitle</span><span class='strut'>&nbsp;</span></p>
  6354. <p id='t2514' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6355. <p id='t2515' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>shortMediaId</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6356. <p id='t2516' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6357. <p id='t2517' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>showId</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6358. <p id='t2518' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>officialDate</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6359. <p id='t2519' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>effTitle</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6360. <p id='t2520' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6361. <p id='t2521' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span> <span class='nam'>format</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6362. <p id='t2522' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6363. <p id='t2523' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>officialTitle</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6364. <p id='t2524' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span> <span class='nam'>None</span> <span class='com'>#playerUrl</span><span class='strut'>&nbsp;</span></p>
  6365. <p id='t2525' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6366. <p id='t2526' class='pln'><span class='strut'>&nbsp;</span></p>
  6367. <p id='t2527' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6368. <p id='t2528' class='pln'><span class='strut'>&nbsp;</span></p>
  6369. <p id='t2529' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>results</span><span class='strut'>&nbsp;</span></p>
  6370. <p id='t2530' class='pln'><span class='strut'>&nbsp;</span></p>
  6371. <p id='t2531' class='pln'><span class='strut'>&nbsp;</span></p>
  6372. <p id='t2532' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>EscapistIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6373. <p id='t2533' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for The Escapist &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6374. <p id='t2534' class='pln'><span class='strut'>&nbsp;</span></p>
  6375. <p id='t2535' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(https?://)?(www\.)?escapistmagazine\.com/videos/view/(?P&lt;showname&gt;[^/]+)/(?P&lt;episode&gt;[^/?]+)[/?]?.*$&#39;</span><span class='strut'>&nbsp;</span></p>
  6376. <p id='t2536' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;escapist&#39;</span><span class='strut'>&nbsp;</span></p>
  6377. <p id='t2537' class='pln'><span class='strut'>&nbsp;</span></p>
  6378. <p id='t2538' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>showName</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6379. <p id='t2539' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[escapist] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='nam'>showName</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6380. <p id='t2540' class='pln'><span class='strut'>&nbsp;</span></p>
  6381. <p id='t2541' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_config_download</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>showName</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6382. <p id='t2542' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[escapist] %s: Downloading configuration&#39;</span> <span class='op'>%</span> <span class='nam'>showName</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6383. <p id='t2543' class='pln'><span class='strut'>&nbsp;</span></p>
  6384. <p id='t2544' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6385. <p id='t2545' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6386. <p id='t2546' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6387. <p id='t2547' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6388. <p id='t2548' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6389. <p id='t2549' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>showName</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;showname&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6390. <p id='t2550' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videoId</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;episode&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6391. <p id='t2551' class='pln'><span class='strut'>&nbsp;</span></p>
  6392. <p id='t2552' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>showName</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6393. <p id='t2553' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6394. <p id='t2554' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webPage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6395. <p id='t2555' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webPageBytes</span> <span class='op'>=</span> <span class='nam'>webPage</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6396. <p id='t2556' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r&#39;text/html; charset=&quot;?([^&quot;]+)&quot;?&#39;</span><span class='op'>,</span> <span class='nam'>webPage</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>[</span><span class='str'>&#39;Content-Type&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6397. <p id='t2557' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webPage</span> <span class='op'>=</span> <span class='nam'>webPageBytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>m</span> <span class='key'>else</span> <span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6398. <p id='t2558' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6399. <p id='t2559' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download webpage: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6400. <p id='t2560' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6401. <p id='t2561' class='pln'><span class='strut'>&nbsp;</span></p>
  6402. <p id='t2562' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>descMatch</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;meta name=&quot;description&quot; content=&quot;([^&quot;]*)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webPage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6403. <p id='t2563' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>description</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>descMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6404. <p id='t2564' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>imgMatch</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;meta property=&quot;og:image&quot; content=&quot;([^&quot;]*)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webPage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6405. <p id='t2565' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>imgUrl</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>imgMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6406. <p id='t2566' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playerUrlMatch</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;meta property=&quot;og:video&quot; content=&quot;([^&quot;]*)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webPage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6407. <p id='t2567' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playerUrl</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>playerUrlMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6408. <p id='t2568' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configUrlMatch</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;config=(.*)$&#39;</span><span class='op'>,</span> <span class='nam'>playerUrl</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6409. <p id='t2569' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configUrl</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>configUrlMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6410. <p id='t2570' class='pln'><span class='strut'>&nbsp;</span></p>
  6411. <p id='t2571' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_config_download</span><span class='op'>(</span><span class='nam'>showName</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6412. <p id='t2572' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6413. <p id='t2573' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configJSON</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>configUrl</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6414. <p id='t2574' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='str'>r&#39;text/html; charset=&quot;?([^&quot;]+)&quot;?&#39;</span><span class='op'>,</span> <span class='nam'>configJSON</span><span class='op'>.</span><span class='nam'>headers</span><span class='op'>[</span><span class='str'>&#39;Content-Type&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6415. <p id='t2575' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configJSON</span> <span class='op'>=</span> <span class='nam'>configJSON</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span> <span class='key'>if</span> <span class='nam'>m</span> <span class='key'>else</span> <span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6416. <p id='t2576' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6417. <p id='t2577' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download configuration: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6418. <p id='t2578' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6419. <p id='t2579' class='pln'><span class='strut'>&nbsp;</span></p>
  6420. <p id='t2580' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Technically, it&#39;s JavaScript, not JSON</span><span class='strut'>&nbsp;</span></p>
  6421. <p id='t2581' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>configJSON</span> <span class='op'>=</span> <span class='nam'>configJSON</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&quot;&#39;&quot;</span><span class='op'>,</span> <span class='str'>&#39;&quot;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6422. <p id='t2582' class='pln'><span class='strut'>&nbsp;</span></p>
  6423. <p id='t2583' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6424. <p id='t2584' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>config</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>configJSON</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6425. <p id='t2585' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>ValueError</span><span class='op'>,</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6426. <p id='t2586' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid JSON in configuration file: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6427. <p id='t2587' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6428. <p id='t2588' class='pln'><span class='strut'>&nbsp;</span></p>
  6429. <p id='t2589' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>playlist</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;playlist&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6430. <p id='t2590' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videoUrl</span> <span class='op'>=</span> <span class='nam'>playlist</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6431. <p id='t2591' class='pln'><span class='strut'>&nbsp;</span></p>
  6432. <p id='t2592' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6433. <p id='t2593' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>videoId</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6434. <p id='t2594' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>videoUrl</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6435. <p id='t2595' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>showName</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6436. <p id='t2596' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6437. <p id='t2597' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>showName</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6438. <p id='t2598' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6439. <p id='t2599' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>imgUrl</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6440. <p id='t2600' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>description</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6441. <p id='t2601' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span> <span class='nam'>playerUrl</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6442. <p id='t2602' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6443. <p id='t2603' class='pln'><span class='strut'>&nbsp;</span></p>
  6444. <p id='t2604' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6445. <p id='t2605' class='pln'><span class='strut'>&nbsp;</span></p>
  6446. <p id='t2606' class='pln'><span class='strut'>&nbsp;</span></p>
  6447. <p id='t2607' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>CollegeHumorIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6448. <p id='t2608' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for collegehumor.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6449. <p id='t2609' class='pln'><span class='strut'>&nbsp;</span></p>
  6450. <p id='t2610' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  6451. <p id='t2611' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?collegehumor\.com/video/(?P&lt;videoid&gt;[0-9]+)/(?P&lt;shorttitle&gt;.*)$&#39;</span><span class='strut'>&nbsp;</span></p>
  6452. <p id='t2612' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;collegehumor&#39;</span><span class='strut'>&nbsp;</span></p>
  6453. <p id='t2613' class='pln'><span class='strut'>&nbsp;</span></p>
  6454. <p id='t2614' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_manifest</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6455. <p id='t2615' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6456. <p id='t2616' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Downloading XML manifest&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6457. <p id='t2617' class='pln'><span class='strut'>&nbsp;</span></p>
  6458. <p id='t2618' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6459. <p id='t2619' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6460. <p id='t2620' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6461. <p id='t2621' class='pln'><span class='strut'>&nbsp;</span></p>
  6462. <p id='t2622' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6463. <p id='t2623' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6464. <p id='t2624' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6465. <p id='t2625' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6466. <p id='t2626' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6467. <p id='t2627' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoid&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6468. <p id='t2628' class='pln'><span class='strut'>&nbsp;</span></p>
  6469. <p id='t2629' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6470. <p id='t2630' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6471. <p id='t2631' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6472. <p id='t2632' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6473. <p id='t2633' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6474. <p id='t2634' class='pln'><span class='strut'>&nbsp;</span></p>
  6475. <p id='t2635' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6476. <p id='t2636' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>xmlUrl</span> <span class='op'>=</span> <span class='str'>&#39;http://www.collegehumor.com/moogaloop/video/&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  6477. <p id='t2637' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6478. <p id='t2638' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>metaXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>xmlUrl</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6479. <p id='t2639' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6480. <p id='t2640' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info XML: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6481. <p id='t2641' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6482. <p id='t2642' class='pln'><span class='strut'>&nbsp;</span></p>
  6483. <p id='t2643' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mdoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>metaXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6484. <p id='t2644' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6485. <p id='t2645' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videoNode</span> <span class='op'>=</span> <span class='nam'>mdoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./video&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6486. <p id='t2646' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>videoNode</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./description&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6487. <p id='t2647' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>videoNode</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./caption&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6488. <p id='t2648' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;thumbnail&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>videoNode</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./thumbnail&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6489. <p id='t2649' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>manifest_url</span> <span class='op'>=</span> <span class='nam'>videoNode</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./file&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6490. <p id='t2650' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>IndexError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6491. <p id='t2651' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;\nERROR: Invalid metadata XML file&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6492. <p id='t2652' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6493. <p id='t2653' class='pln'><span class='strut'>&nbsp;</span></p>
  6494. <p id='t2654' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>manifest_url</span> <span class='op'>+=</span> <span class='str'>&#39;?hdcore=2.10.3&#39;</span><span class='strut'>&nbsp;</span></p>
  6495. <p id='t2655' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_manifest</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6496. <p id='t2656' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6497. <p id='t2657' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>manifestXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>manifest_url</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6498. <p id='t2658' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6499. <p id='t2659' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info XML: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6500. <p id='t2660' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6501. <p id='t2661' class='pln'><span class='strut'>&nbsp;</span></p>
  6502. <p id='t2662' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>adoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>manifestXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6503. <p id='t2663' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6504. <p id='t2664' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>media_node</span> <span class='op'>=</span> <span class='nam'>adoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./{http://ns.adobe.com/f4m/1.0}media&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6505. <p id='t2665' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>node_id</span> <span class='op'>=</span> <span class='nam'>media_node</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6506. <p id='t2666' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>adoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./{http://ns.adobe.com/f4m/1.0}id&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6507. <p id='t2667' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>IndexError</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6508. <p id='t2668' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;\nERROR: Invalid manifest file&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6509. <p id='t2669' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6510. <p id='t2670' class='pln'><span class='strut'>&nbsp;</span></p>
  6511. <p id='t2671' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_pr</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse_urlparse</span><span class='op'>(</span><span class='nam'>manifest_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6512. <p id='t2672' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>url_pr</span><span class='op'>.</span><span class='nam'>scheme</span> <span class='op'>+</span> <span class='str'>&#39;://&#39;</span> <span class='op'>+</span> <span class='nam'>url_pr</span><span class='op'>.</span><span class='nam'>netloc</span> <span class='op'>+</span> <span class='str'>&#39;/z&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='num'>2</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;/&#39;</span> <span class='op'>+</span> <span class='nam'>node_id</span> <span class='op'>+</span> <span class='str'>&#39;Seg1-Frag1&#39;</span><span class='strut'>&nbsp;</span></p>
  6513. <p id='t2673' class='pln'><span class='strut'>&nbsp;</span></p>
  6514. <p id='t2674' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
  6515. <p id='t2675' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;ext&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='str'>&#39;f4f&#39;</span><span class='strut'>&nbsp;</span></p>
  6516. <p id='t2676' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6517. <p id='t2677' class='pln'><span class='strut'>&nbsp;</span></p>
  6518. <p id='t2678' class='pln'><span class='strut'>&nbsp;</span></p>
  6519. <p id='t2679' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>XVideosIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6520. <p id='t2680' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for xvideos.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6521. <p id='t2681' class='pln'><span class='strut'>&nbsp;</span></p>
  6522. <p id='t2682' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?xvideos\.com/video([0-9]+)(?:.*)&#39;</span><span class='strut'>&nbsp;</span></p>
  6523. <p id='t2683' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;xvideos&#39;</span><span class='strut'>&nbsp;</span></p>
  6524. <p id='t2684' class='pln'><span class='strut'>&nbsp;</span></p>
  6525. <p id='t2685' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6526. <p id='t2686' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6527. <p id='t2687' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6528. <p id='t2688' class='pln'><span class='strut'>&nbsp;</span></p>
  6529. <p id='t2689' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6530. <p id='t2690' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6531. <p id='t2691' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6532. <p id='t2692' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6533. <p id='t2693' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6534. <p id='t2694' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6535. <p id='t2695' class='pln'><span class='strut'>&nbsp;</span></p>
  6536. <p id='t2696' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6537. <p id='t2697' class='pln'><span class='strut'>&nbsp;</span></p>
  6538. <p id='t2698' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6539. <p id='t2699' class='pln'><span class='strut'>&nbsp;</span></p>
  6540. <p id='t2700' class='pln'><span class='strut'>&nbsp;</span></p>
  6541. <p id='t2701' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video URL</span><span class='strut'>&nbsp;</span></p>
  6542. <p id='t2702' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;flv_url=(.+?)&amp;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6543. <p id='t2703' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6544. <p id='t2704' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video url&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6545. <p id='t2705' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6546. <p id='t2706' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6547. <p id='t2707' class='pln'><span class='strut'>&nbsp;</span></p>
  6548. <p id='t2708' class='pln'><span class='strut'>&nbsp;</span></p>
  6549. <p id='t2709' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract title</span><span class='strut'>&nbsp;</span></p>
  6550. <p id='t2710' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;title&gt;(.*?)\s+-\s+XVID&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6551. <p id='t2711' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6552. <p id='t2712' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6553. <p id='t2713' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6554. <p id='t2714' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6555. <p id='t2715' class='pln'><span class='strut'>&nbsp;</span></p>
  6556. <p id='t2716' class='pln'><span class='strut'>&nbsp;</span></p>
  6557. <p id='t2717' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video thumbnail</span><span class='strut'>&nbsp;</span></p>
  6558. <p id='t2718' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;http://(?:img.*?\.)xvideos.com/videos/thumbs/[a-fA-F0-9]+/[a-fA-F0-9]+/[a-fA-F0-9]+/[a-fA-F0-9]+/([a-fA-F0-9.]+jpg)&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6559. <p id='t2719' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6560. <p id='t2720' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video thumbnail&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6561. <p id='t2721' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6562. <p id='t2722' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6563. <p id='t2723' class='pln'><span class='strut'>&nbsp;</span></p>
  6564. <p id='t2724' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6565. <p id='t2725' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6566. <p id='t2726' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6567. <p id='t2727' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6568. <p id='t2728' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6569. <p id='t2729' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6570. <p id='t2730' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6571. <p id='t2731' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>video_thumbnail</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6572. <p id='t2732' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6573. <p id='t2733' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6574. <p id='t2734' class='pln'><span class='strut'>&nbsp;</span></p>
  6575. <p id='t2735' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6576. <p id='t2736' class='pln'><span class='strut'>&nbsp;</span></p>
  6577. <p id='t2737' class='pln'><span class='strut'>&nbsp;</span></p>
  6578. <p id='t2738' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SoundcloudIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6579. <p id='t2739' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for soundcloud.com</span><span class='strut'>&nbsp;</span></p>
  6580. <p id='t2740' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp;&nbsp; To access the media, the uid of the song and a stream token</span><span class='strut'>&nbsp;</span></p>
  6581. <p id='t2741' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp;&nbsp; must be extracted from the page source and the script must make</span><span class='strut'>&nbsp;</span></p>
  6582. <p id='t2742' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp;&nbsp; a request to media.soundcloud.com/crossdomain.xml. Then</span><span class='strut'>&nbsp;</span></p>
  6583. <p id='t2743' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp;&nbsp; the media can be grabbed by requesting from an url composed</span><span class='strut'>&nbsp;</span></p>
  6584. <p id='t2744' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp;&nbsp; of the stream token and uid</span><span class='strut'>&nbsp;</span></p>
  6585. <p id='t2745' class='pln'><span class='str'>&nbsp; &nbsp;&nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6586. <p id='t2746' class='pln'><span class='strut'>&nbsp;</span></p>
  6587. <p id='t2747' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?soundcloud\.com/([\w\d-]+)/([\w\d-]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  6588. <p id='t2748' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;soundcloud&#39;</span><span class='strut'>&nbsp;</span></p>
  6589. <p id='t2749' class='pln'><span class='strut'>&nbsp;</span></p>
  6590. <p id='t2750' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6591. <p id='t2751' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6592. <p id='t2752' class='pln'><span class='strut'>&nbsp;</span></p>
  6593. <p id='t2753' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_resolve</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6594. <p id='t2754' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6595. <p id='t2755' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Resolving id&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6596. <p id='t2756' class='pln'><span class='strut'>&nbsp;</span></p>
  6597. <p id='t2757' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6598. <p id='t2758' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6599. <p id='t2759' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Retrieving stream&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6600. <p id='t2760' class='pln'><span class='strut'>&nbsp;</span></p>
  6601. <p id='t2761' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6602. <p id='t2762' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6603. <p id='t2763' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6604. <p id='t2764' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6605. <p id='t2765' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6606. <p id='t2766' class='pln'><span class='strut'>&nbsp;</span></p>
  6607. <p id='t2767' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># extract uploader (which is in the url)</span><span class='strut'>&nbsp;</span></p>
  6608. <p id='t2768' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6609. <p id='t2769' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># extract simple title (uploader + slug of song title)</span><span class='strut'>&nbsp;</span></p>
  6610. <p id='t2770' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>slug_title</span> <span class='op'>=</span>&nbsp; <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6611. <p id='t2771' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>simple_title</span> <span class='op'>=</span> <span class='nam'>uploader</span> <span class='op'>+</span> <span class='str'>u&#39;-&#39;</span> <span class='op'>+</span> <span class='nam'>slug_title</span><span class='strut'>&nbsp;</span></p>
  6612. <p id='t2772' class='pln'><span class='strut'>&nbsp;</span></p>
  6613. <p id='t2773' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_resolve</span><span class='op'>(</span><span class='str'>&#39;%s/%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>uploader</span><span class='op'>,</span> <span class='nam'>slug_title</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6614. <p id='t2774' class='pln'><span class='strut'>&nbsp;</span></p>
  6615. <p id='t2775' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://soundcloud.com/%s/%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>uploader</span><span class='op'>,</span> <span class='nam'>slug_title</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6616. <p id='t2776' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>resolv_url</span> <span class='op'>=</span> <span class='str'>&#39;http://api.soundcloud.com/resolve.json?url=&#39;</span> <span class='op'>+</span> <span class='nam'>url</span> <span class='op'>+</span> <span class='str'>&#39;&amp;client_id=b45b1aa10f1ac2941910a7f0d10f8e28&#39;</span><span class='strut'>&nbsp;</span></p>
  6617. <p id='t2777' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>resolv_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6618. <p id='t2778' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6619. <p id='t2779' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info_json_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6620. <p id='t2780' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info_json</span> <span class='op'>=</span> <span class='nam'>info_json_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6621. <p id='t2781' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6622. <p id='t2782' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6623. <p id='t2783' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6624. <p id='t2784' class='pln'><span class='strut'>&nbsp;</span></p>
  6625. <p id='t2785' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>info_json</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6626. <p id='t2786' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6627. <p id='t2787' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='str'>&#39;%s/%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>uploader</span><span class='op'>,</span> <span class='nam'>slug_title</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6628. <p id='t2788' class='pln'><span class='strut'>&nbsp;</span></p>
  6629. <p id='t2789' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>streams_url</span> <span class='op'>=</span> <span class='str'>&#39;https://api.sndcdn.com/i1/tracks/&#39;</span> <span class='op'>+</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span> <span class='op'>+</span> <span class='str'>&#39;/streams?client_id=b45b1aa10f1ac2941910a7f0d10f8e28&#39;</span><span class='strut'>&nbsp;</span></p>
  6630. <p id='t2790' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>streams_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6631. <p id='t2791' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6632. <p id='t2792' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>stream_json_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6633. <p id='t2793' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>stream_json</span> <span class='op'>=</span> <span class='nam'>stream_json_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6634. <p id='t2794' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6635. <p id='t2795' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download stream definitions: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6636. <p id='t2796' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6637. <p id='t2797' class='pln'><span class='strut'>&nbsp;</span></p>
  6638. <p id='t2798' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>streams</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>stream_json</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6639. <p id='t2799' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mediaURL</span> <span class='op'>=</span> <span class='nam'>streams</span><span class='op'>[</span><span class='str'>&#39;http_mp3_128_url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6640. <p id='t2800' class='pln'><span class='strut'>&nbsp;</span></p>
  6641. <p id='t2801' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6642. <p id='t2802' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6643. <p id='t2803' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>mediaURL</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6644. <p id='t2804' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;user&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;username&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6645. <p id='t2805' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;created_at&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6646. <p id='t2806' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6647. <p id='t2807' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='str'>u&#39;mp3&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6648. <p id='t2808' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6649. <p id='t2809' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6650. <p id='t2810' class='pln'><span class='strut'>&nbsp;</span></p>
  6651. <p id='t2811' class='pln'><span class='strut'>&nbsp;</span></p>
  6652. <p id='t2812' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>InfoQIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6653. <p id='t2813' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for infoq.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6654. <p id='t2814' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?infoq\.com/[^/]+/[^/]+$&#39;</span><span class='strut'>&nbsp;</span></p>
  6655. <p id='t2815' class='pln'><span class='strut'>&nbsp;</span></p>
  6656. <p id='t2816' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6657. <p id='t2817' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6658. <p id='t2818' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6659. <p id='t2819' class='pln'><span class='strut'>&nbsp;</span></p>
  6660. <p id='t2820' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6661. <p id='t2821' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6662. <p id='t2822' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6663. <p id='t2823' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6664. <p id='t2824' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6665. <p id='t2825' class='pln'><span class='strut'>&nbsp;</span></p>
  6666. <p id='t2826' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>=</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6667. <p id='t2827' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6668. <p id='t2828' class='pln'><span class='strut'>&nbsp;</span></p>
  6669. <p id='t2829' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video URL</span><span class='strut'>&nbsp;</span></p>
  6670. <p id='t2830' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&quot;jsclassref=&#39;([^&#39;]*)&#39;&quot;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6671. <p id='t2831' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6672. <p id='t2832' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video url&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6673. <p id='t2833' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6674. <p id='t2834' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>real_id</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>base64</span><span class='op'>.</span><span class='nam'>b64decode</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>encode</span><span class='op'>(</span><span class='str'>&#39;ascii&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6675. <p id='t2835' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>&#39;rtmpe://video.infoq.com/cfx/st/&#39;</span> <span class='op'>+</span> <span class='nam'>real_id</span><span class='strut'>&nbsp;</span></p>
  6676. <p id='t2836' class='pln'><span class='strut'>&nbsp;</span></p>
  6677. <p id='t2837' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract title</span><span class='strut'>&nbsp;</span></p>
  6678. <p id='t2838' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;contentTitle = &quot;(.*?)&quot;;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6679. <p id='t2839' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6680. <p id='t2840' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6681. <p id='t2841' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6682. <p id='t2842' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6683. <p id='t2843' class='pln'><span class='strut'>&nbsp;</span></p>
  6684. <p id='t2844' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract description</span><span class='strut'>&nbsp;</span></p>
  6685. <p id='t2845' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='str'>u&#39;No description available.&#39;</span><span class='strut'>&nbsp;</span></p>
  6686. <p id='t2846' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;description&quot; content=&quot;(.*)&quot;(?:\s*/)?&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6687. <p id='t2847' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6688. <p id='t2848' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_description</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6689. <p id='t2849' class='pln'><span class='strut'>&nbsp;</span></p>
  6690. <p id='t2850' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_filename</span> <span class='op'>=</span> <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6691. <p id='t2851' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>extension</span> <span class='op'>=</span> <span class='nam'>video_filename</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6692. <p id='t2852' class='pln'><span class='strut'>&nbsp;</span></p>
  6693. <p id='t2853' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6694. <p id='t2854' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6695. <p id='t2855' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6696. <p id='t2856' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6697. <p id='t2857' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6698. <p id='t2858' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6699. <p id='t2859' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>extension</span><span class='op'>,</span> <span class='com'># Extension is always(?) mp4, but seems to be flv</span><span class='strut'>&nbsp;</span></p>
  6700. <p id='t2860' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6701. <p id='t2861' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>video_description</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6702. <p id='t2862' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6703. <p id='t2863' class='pln'><span class='strut'>&nbsp;</span></p>
  6704. <p id='t2864' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6705. <p id='t2865' class='pln'><span class='strut'>&nbsp;</span></p>
  6706. <p id='t2866' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MixcloudIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6707. <p id='t2867' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for www.mixcloud.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6708. <p id='t2868' class='pln'><span class='strut'>&nbsp;</span></p>
  6709. <p id='t2869' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_WORKING</span> <span class='op'>=</span> <span class='nam'>False</span> <span class='com'># New API, but it seems good http://www.mixcloud.com/developers/documentation/</span><span class='strut'>&nbsp;</span></p>
  6710. <p id='t2870' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?mixcloud\.com/([\w\d-]+)/([\w\d-]+)&#39;</span><span class='strut'>&nbsp;</span></p>
  6711. <p id='t2871' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;mixcloud&#39;</span><span class='strut'>&nbsp;</span></p>
  6712. <p id='t2872' class='pln'><span class='strut'>&nbsp;</span></p>
  6713. <p id='t2873' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6714. <p id='t2874' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6715. <p id='t2875' class='pln'><span class='strut'>&nbsp;</span></p>
  6716. <p id='t2876' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_json</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6717. <p id='t2877' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report JSON download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6718. <p id='t2878' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] Downloading json&#39;</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6719. <p id='t2879' class='pln'><span class='strut'>&nbsp;</span></p>
  6720. <p id='t2880' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6721. <p id='t2881' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6722. <p id='t2882' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6723. <p id='t2883' class='pln'><span class='strut'>&nbsp;</span></p>
  6724. <p id='t2884' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>jsonData</span><span class='op'>,</span> <span class='nam'>fmt</span><span class='op'>,</span> <span class='nam'>bitrate</span><span class='op'>=</span><span class='str'>&#39;best&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6725. <p id='t2885' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Get urls from &#39;audio_formats&#39; section in json&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6726. <p id='t2886' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6727. <p id='t2887' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6728. <p id='t2888' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bitrate_list</span> <span class='op'>=</span> <span class='nam'>jsonData</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6729. <p id='t2889' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>bitrate</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>bitrate</span> <span class='op'>==</span> <span class='str'>&#39;best&#39;</span> <span class='key'>or</span> <span class='nam'>bitrate</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>bitrate_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6730. <p id='t2890' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bitrate</span> <span class='op'>=</span> <span class='nam'>max</span><span class='op'>(</span><span class='nam'>bitrate_list</span><span class='op'>)</span> <span class='com'># select highest</span><span class='strut'>&nbsp;</span></p>
  6731. <p id='t2891' class='pln'><span class='strut'>&nbsp;</span></p>
  6732. <p id='t2892' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_list</span> <span class='op'>=</span> <span class='nam'>jsonData</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>bitrate</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6733. <p id='t2893' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>TypeError</span><span class='op'>:</span> <span class='com'># we have no bitrate info.</span><span class='strut'>&nbsp;</span></p>
  6734. <p id='t2894' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_list</span> <span class='op'>=</span> <span class='nam'>jsonData</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6735. <p id='t2895' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>url_list</span><span class='strut'>&nbsp;</span></p>
  6736. <p id='t2896' class='pln'><span class='strut'>&nbsp;</span></p>
  6737. <p id='t2897' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>check_urls</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url_list</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6738. <p id='t2898' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Returns 1st active url from list&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6739. <p id='t2899' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>url</span> <span class='key'>in</span> <span class='nam'>url_list</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6740. <p id='t2900' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6741. <p id='t2901' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6742. <p id='t2902' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
  6743. <p id='t2903' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6744. <p id='t2904' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6745. <p id='t2905' class='pln'><span class='strut'>&nbsp;</span></p>
  6746. <p id='t2906' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6747. <p id='t2907' class='pln'><span class='strut'>&nbsp;</span></p>
  6748. <p id='t2908' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_print_formats</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>formats</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6749. <p id='t2909' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;Available formats:&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6750. <p id='t2910' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>fmt</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6751. <p id='t2911' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>b</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6752. <p id='t2912' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6753. <p id='t2913' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>formats</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>b</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6754. <p id='t2914' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;%s\t%s\t[%s]&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>fmt</span><span class='op'>,</span> <span class='nam'>b</span><span class='op'>,</span> <span class='nam'>ext</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6755. <p id='t2915' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>TypeError</span><span class='op'>:</span> <span class='com'># we have no bitrate info</span><span class='strut'>&nbsp;</span></p>
  6756. <p id='t2916' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>formats</span><span class='op'>[</span><span class='nam'>fmt</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6757. <p id='t2917' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>print</span><span class='op'>(</span><span class='str'>&#39;%s\t%s\t[%s]&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>fmt</span><span class='op'>,</span> <span class='str'>&#39;??&#39;</span><span class='op'>,</span> <span class='nam'>ext</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6758. <p id='t2918' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  6759. <p id='t2919' class='pln'><span class='strut'>&nbsp;</span></p>
  6760. <p id='t2920' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6761. <p id='t2921' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6762. <p id='t2922' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6763. <p id='t2923' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6764. <p id='t2924' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6765. <p id='t2925' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># extract uploader &amp; filename from url</span><span class='strut'>&nbsp;</span></p>
  6766. <p id='t2926' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6767. <p id='t2927' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_id</span> <span class='op'>=</span> <span class='nam'>uploader</span> <span class='op'>+</span> <span class='str'>&quot;-&quot;</span> <span class='op'>+</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>2</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6768. <p id='t2928' class='pln'><span class='strut'>&nbsp;</span></p>
  6769. <p id='t2929' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># construct API request</span><span class='strut'>&nbsp;</span></p>
  6770. <p id='t2930' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span> <span class='op'>=</span> <span class='str'>&#39;http://www.mixcloud.com/api/1/cloudcast/&#39;</span> <span class='op'>+</span> <span class='str'>&#39;/&#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>3</span><span class='op'>:</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>)</span> <span class='op'>+</span> <span class='str'>&#39;.json&#39;</span><span class='strut'>&nbsp;</span></p>
  6771. <p id='t2931' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># retrieve .json file with links to files</span><span class='strut'>&nbsp;</span></p>
  6772. <p id='t2932' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>file_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6773. <p id='t2933' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6774. <p id='t2934' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_json</span><span class='op'>(</span><span class='nam'>file_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6775. <p id='t2935' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>jsonData</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6776. <p id='t2936' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6777. <p id='t2937' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve file: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6778. <p id='t2938' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6779. <p id='t2939' class='pln'><span class='strut'>&nbsp;</span></p>
  6780. <p id='t2940' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># parse JSON</span><span class='strut'>&nbsp;</span></p>
  6781. <p id='t2941' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>json_data</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>jsonData</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6782. <p id='t2942' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>player_url</span> <span class='op'>=</span> <span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;player_swf_url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6783. <p id='t2943' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>formats</span> <span class='op'>=</span> <span class='nam'>dict</span><span class='op'>(</span><span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;audio_formats&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6784. <p id='t2944' class='pln'><span class='strut'>&nbsp;</span></p>
  6785. <p id='t2945' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>req_format</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6786. <p id='t2946' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>bitrate</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  6787. <p id='t2947' class='pln'><span class='strut'>&nbsp;</span></p>
  6788. <p id='t2948' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;listformats&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6789. <p id='t2949' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_print_formats</span><span class='op'>(</span><span class='nam'>formats</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6790. <p id='t2950' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6791. <p id='t2951' class='pln'><span class='strut'>&nbsp;</span></p>
  6792. <p id='t2952' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>req_format</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>req_format</span> <span class='op'>==</span> <span class='str'>&#39;best&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6793. <p id='t2953' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>format_param</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6794. <p id='t2954' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_list</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>formats</span><span class='op'>,</span> <span class='nam'>format_param</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6795. <p id='t2955' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># check urls</span><span class='strut'>&nbsp;</span></p>
  6796. <p id='t2956' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_urls</span><span class='op'>(</span><span class='nam'>url_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6797. <p id='t2957' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>file_url</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6798. <p id='t2958' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span> <span class='com'># got it!</span><span class='strut'>&nbsp;</span></p>
  6799. <p id='t2959' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6800. <p id='t2960' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>req_format</span> <span class='key'>not</span> <span class='key'>in</span> <span class='nam'>formats</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6801. <p id='t2961' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: format is not available&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6802. <p id='t2962' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6803. <p id='t2963' class='pln'><span class='strut'>&nbsp;</span></p>
  6804. <p id='t2964' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url_list</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>get_urls</span><span class='op'>(</span><span class='nam'>formats</span><span class='op'>,</span> <span class='nam'>req_format</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6805. <p id='t2965' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>file_url</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>check_urls</span><span class='op'>(</span><span class='nam'>url_list</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6806. <p id='t2966' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format_param</span> <span class='op'>=</span> <span class='nam'>req_format</span><span class='strut'>&nbsp;</span></p>
  6807. <p id='t2967' class='pln'><span class='strut'>&nbsp;</span></p>
  6808. <p id='t2968' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6809. <p id='t2969' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>file_id</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6810. <p id='t2970' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>file_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6811. <p id='t2971' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>uploader</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6812. <p id='t2972' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6813. <p id='t2973' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;name&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6814. <p id='t2974' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>file_url</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6815. <p id='t2975' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span> <span class='op'>(</span><span class='nam'>format_param</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>and</span> <span class='str'>u&#39;NA&#39;</span> <span class='key'>or</span> <span class='nam'>format_param</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6816. <p id='t2976' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;thumbnail_url&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6817. <p id='t2977' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>json_data</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6818. <p id='t2978' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;player_url&#39;</span><span class='op'>:</span> <span class='nam'>player_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6819. <p id='t2979' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6820. <p id='t2980' class='pln'><span class='strut'>&nbsp;</span></p>
  6821. <p id='t2981' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>StanfordOpenClassroomIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6822. <p id='t2982' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for Stanford&#39;s Open ClassRoom&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6823. <p id='t2983' class='pln'><span class='strut'>&nbsp;</span></p>
  6824. <p id='t2984' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?openclassroom.stanford.edu(?P&lt;path&gt;/?|(/MainFolder/(?:HomePage|CoursePage|VideoPage)\.php([?]course=(?P&lt;course&gt;[^&amp;]+)(&amp;video=(?P&lt;video&gt;[^&amp;]+))?(&amp;.*)?)?))$&#39;</span><span class='strut'>&nbsp;</span></p>
  6825. <p id='t2985' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;stanfordoc&#39;</span><span class='strut'>&nbsp;</span></p>
  6826. <p id='t2986' class='pln'><span class='strut'>&nbsp;</span></p>
  6827. <p id='t2987' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>objid</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6828. <p id='t2988' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6829. <p id='t2989' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>objid</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6830. <p id='t2990' class='pln'><span class='strut'>&nbsp;</span></p>
  6831. <p id='t2991' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6832. <p id='t2992' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6833. <p id='t2993' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6834. <p id='t2994' class='pln'><span class='strut'>&nbsp;</span></p>
  6835. <p id='t2995' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6836. <p id='t2996' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6837. <p id='t2997' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6838. <p id='t2998' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6839. <p id='t2999' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6840. <p id='t3000' class='pln'><span class='strut'>&nbsp;</span></p>
  6841. <p id='t3001' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;course&#39;</span><span class='op'>)</span> <span class='key'>and</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;video&#39;</span><span class='op'>)</span><span class='op'>:</span> <span class='com'># A specific video</span><span class='strut'>&nbsp;</span></p>
  6842. <p id='t3002' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>course</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;course&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6843. <p id='t3003' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;video&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6844. <p id='t3004' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6845. <p id='t3005' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>course</span> <span class='op'>+</span> <span class='str'>&#39;_&#39;</span> <span class='op'>+</span> <span class='nam'>video</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6846. <p id='t3006' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6847. <p id='t3007' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6848. <p id='t3008' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6849. <p id='t3009' class='pln'><span class='strut'>&nbsp;</span></p>
  6850. <p id='t3010' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6851. <p id='t3011' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>baseUrl</span> <span class='op'>=</span> <span class='str'>&#39;http://openclassroom.stanford.edu/MainFolder/courses/&#39;</span> <span class='op'>+</span> <span class='nam'>course</span> <span class='op'>+</span> <span class='str'>&#39;/videos/&#39;</span><span class='strut'>&nbsp;</span></p>
  6852. <p id='t3012' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>xmlUrl</span> <span class='op'>=</span> <span class='nam'>baseUrl</span> <span class='op'>+</span> <span class='nam'>video</span> <span class='op'>+</span> <span class='str'>&#39;.xml&#39;</span><span class='strut'>&nbsp;</span></p>
  6853. <p id='t3013' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6854. <p id='t3014' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>metaXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>xmlUrl</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6855. <p id='t3015' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6856. <p id='t3016' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info XML: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6857. <p id='t3017' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6858. <p id='t3018' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mdoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>metaXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6859. <p id='t3019' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6860. <p id='t3020' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>mdoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./title&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6861. <p id='t3021' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>baseUrl</span> <span class='op'>+</span> <span class='nam'>mdoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;./videoFile&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  6862. <p id='t3022' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>IndexError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6863. <p id='t3023' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;\nERROR: Invalid metadata XML file&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6864. <p id='t3024' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6865. <p id='t3025' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;ext&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>rpartition</span><span class='op'>(</span><span class='str'>&#39;.&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6866. <p id='t3026' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6867. <p id='t3027' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;course&#39;</span><span class='op'>)</span><span class='op'>:</span> <span class='com'># A course page</span><span class='strut'>&nbsp;</span></p>
  6868. <p id='t3028' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>course</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;course&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6869. <p id='t3029' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6870. <p id='t3030' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>course</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6871. <p id='t3031' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;type&#39;</span><span class='op'>:</span> <span class='str'>&#39;playlist&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6872. <p id='t3032' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6873. <p id='t3033' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6874. <p id='t3034' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6875. <p id='t3035' class='pln'><span class='strut'>&nbsp;</span></p>
  6876. <p id='t3036' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6877. <p id='t3037' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6878. <p id='t3038' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>coursepage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6879. <p id='t3039' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6880. <p id='t3040' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download course info page: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6881. <p id='t3041' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6882. <p id='t3042' class='pln'><span class='strut'>&nbsp;</span></p>
  6883. <p id='t3043' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;h1&gt;([^&lt;]+)&lt;/h1&gt;&#39;</span><span class='op'>,</span> <span class='nam'>coursepage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6884. <p id='t3044' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6885. <p id='t3045' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6886. <p id='t3046' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6887. <p id='t3047' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6888. <p id='t3048' class='pln'><span class='strut'>&nbsp;</span></p>
  6889. <p id='t3049' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>&#39;&lt;description&gt;([^&lt;]+)&lt;/description&gt;&#39;</span><span class='op'>,</span> <span class='nam'>coursepage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6890. <p id='t3050' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6891. <p id='t3051' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;description&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6892. <p id='t3052' class='pln'><span class='strut'>&nbsp;</span></p>
  6893. <p id='t3053' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>links</span> <span class='op'>=</span> <span class='nam'>orderedSet</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;&lt;a href=&quot;(VideoPage.php\?[^&quot;]+)&quot;&gt;&#39;</span><span class='op'>,</span> <span class='nam'>coursepage</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6894. <p id='t3054' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;list&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  6895. <p id='t3055' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6896. <p id='t3056' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;type&#39;</span><span class='op'>:</span> <span class='str'>&#39;reference&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6897. <p id='t3057' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='str'>&#39;http://openclassroom.stanford.edu/MainFolder/&#39;</span> <span class='op'>+</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>vpage</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6898. <p id='t3058' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6899. <p id='t3059' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>vpage</span> <span class='key'>in</span> <span class='nam'>links</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6900. <p id='t3060' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6901. <p id='t3061' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>entry</span> <span class='key'>in</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;list&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6902. <p id='t3062' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>entry</span><span class='op'>[</span><span class='str'>&#39;type&#39;</span><span class='op'>]</span> <span class='op'>==</span> <span class='str'>&#39;reference&#39;</span><span class='strut'>&nbsp;</span></p>
  6903. <p id='t3063' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>+=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>extract</span><span class='op'>(</span><span class='nam'>entry</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6904. <p id='t3064' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>results</span><span class='strut'>&nbsp;</span></p>
  6905. <p id='t3065' class='pln'><span class='strut'>&nbsp;</span></p>
  6906. <p id='t3066' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span> <span class='com'># Root page</span><span class='strut'>&nbsp;</span></p>
  6907. <p id='t3067' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6908. <p id='t3068' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='str'>&#39;Stanford OpenClassroom&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6909. <p id='t3069' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;type&#39;</span><span class='op'>:</span> <span class='str'>&#39;playlist&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6910. <p id='t3070' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6911. <p id='t3071' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6912. <p id='t3072' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6913. <p id='t3073' class='pln'><span class='strut'>&nbsp;</span></p>
  6914. <p id='t3074' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6915. <p id='t3075' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>rootURL</span> <span class='op'>=</span> <span class='str'>&#39;http://openclassroom.stanford.edu/MainFolder/HomePage.php&#39;</span><span class='strut'>&nbsp;</span></p>
  6916. <p id='t3076' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6917. <p id='t3077' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>rootpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>rootURL</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6918. <p id='t3078' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6919. <p id='t3079' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download course info page: &#39;</span> <span class='op'>+</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6920. <p id='t3080' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6921. <p id='t3081' class='pln'><span class='strut'>&nbsp;</span></p>
  6922. <p id='t3082' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6923. <p id='t3083' class='pln'><span class='strut'>&nbsp;</span></p>
  6924. <p id='t3084' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>links</span> <span class='op'>=</span> <span class='nam'>orderedSet</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;&lt;a href=&quot;(CoursePage.php\?[^&quot;]+)&quot;&gt;&#39;</span><span class='op'>,</span> <span class='nam'>rootpage</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6925. <p id='t3085' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;list&#39;</span><span class='op'>]</span> <span class='op'>=</span> <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  6926. <p id='t3086' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  6927. <p id='t3087' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;type&#39;</span><span class='op'>:</span> <span class='str'>&#39;reference&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6928. <p id='t3088' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='str'>&#39;http://openclassroom.stanford.edu/MainFolder/&#39;</span> <span class='op'>+</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>cpage</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  6929. <p id='t3089' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  6930. <p id='t3090' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>cpage</span> <span class='key'>in</span> <span class='nam'>links</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6931. <p id='t3091' class='pln'><span class='strut'>&nbsp;</span></p>
  6932. <p id='t3092' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6933. <p id='t3093' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>entry</span> <span class='key'>in</span> <span class='nam'>info</span><span class='op'>[</span><span class='str'>&#39;list&#39;</span><span class='op'>]</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6934. <p id='t3094' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>assert</span> <span class='nam'>entry</span><span class='op'>[</span><span class='str'>&#39;type&#39;</span><span class='op'>]</span> <span class='op'>==</span> <span class='str'>&#39;reference&#39;</span><span class='strut'>&nbsp;</span></p>
  6935. <p id='t3095' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>results</span> <span class='op'>+=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>extract</span><span class='op'>(</span><span class='nam'>entry</span><span class='op'>[</span><span class='str'>&#39;url&#39;</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6936. <p id='t3096' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>results</span><span class='strut'>&nbsp;</span></p>
  6937. <p id='t3097' class='pln'><span class='strut'>&nbsp;</span></p>
  6938. <p id='t3098' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>MTVIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6939. <p id='t3099' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for MTV.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6940. <p id='t3100' class='pln'><span class='strut'>&nbsp;</span></p>
  6941. <p id='t3101' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?P&lt;proto&gt;https?://)?(?:www\.)?mtv\.com/videos/[^/]+/(?P&lt;videoid&gt;[0-9]+)/[^/]+$&#39;</span><span class='strut'>&nbsp;</span></p>
  6942. <p id='t3102' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;mtv&#39;</span><span class='strut'>&nbsp;</span></p>
  6943. <p id='t3103' class='pln'><span class='strut'>&nbsp;</span></p>
  6944. <p id='t3104' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6945. <p id='t3105' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  6946. <p id='t3106' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6947. <p id='t3107' class='pln'><span class='strut'>&nbsp;</span></p>
  6948. <p id='t3108' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6949. <p id='t3109' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6950. <p id='t3110' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6951. <p id='t3111' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6952. <p id='t3112' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6953. <p id='t3113' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;proto&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6954. <p id='t3114' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>url</span> <span class='op'>=</span> <span class='str'>&#39;http://&#39;</span> <span class='op'>+</span> <span class='nam'>url</span><span class='strut'>&nbsp;</span></p>
  6955. <p id='t3115' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoid&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6956. <p id='t3116' class='pln'><span class='strut'>&nbsp;</span></p>
  6957. <p id='t3117' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6958. <p id='t3118' class='pln'><span class='strut'>&nbsp;</span></p>
  6959. <p id='t3119' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;mtv_vt&quot; content=&quot;([^&quot;]+)&quot;/&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6960. <p id='t3120' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6961. <p id='t3121' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract song name&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6962. <p id='t3122' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6963. <p id='t3123' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>song_name</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;iso-8859-1&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6964. <p id='t3124' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;mtv_an&quot; content=&quot;([^&quot;]+)&quot;/&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6965. <p id='t3125' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6966. <p id='t3126' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract performer&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6967. <p id='t3127' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6968. <p id='t3128' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>performer</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;iso-8859-1&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6969. <p id='t3129' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>performer</span> <span class='op'>+</span> <span class='str'>&#39; - &#39;</span> <span class='op'>+</span> <span class='nam'>song_name</span><span class='strut'>&nbsp;</span></p>
  6970. <p id='t3130' class='pln'><span class='strut'>&nbsp;</span></p>
  6971. <p id='t3131' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta name=&quot;mtvn_uri&quot; content=&quot;([^&quot;]+)&quot;/&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6972. <p id='t3132' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6973. <p id='t3133' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to mtvn_uri&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6974. <p id='t3134' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6975. <p id='t3135' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mtvn_uri</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6976. <p id='t3136' class='pln'><span class='strut'>&nbsp;</span></p>
  6977. <p id='t3137' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;MTVN.Player.defaultPlaylistId = ([0-9]+);&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6978. <p id='t3138' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6979. <p id='t3139' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract content id&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6980. <p id='t3140' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6981. <p id='t3141' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>content_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6982. <p id='t3142' class='pln'><span class='strut'>&nbsp;</span></p>
  6983. <p id='t3143' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videogen_url</span> <span class='op'>=</span> <span class='str'>&#39;http://www.mtv.com/player/includes/mediaGen.jhtml?uri=&#39;</span> <span class='op'>+</span> <span class='nam'>mtvn_uri</span> <span class='op'>+</span> <span class='str'>&#39;&amp;id=&#39;</span> <span class='op'>+</span> <span class='nam'>content_id</span> <span class='op'>+</span> <span class='str'>&#39;&amp;vid=&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span> <span class='op'>+</span> <span class='str'>&#39;&amp;ref=www.mtvn.com&amp;viewUri=&#39;</span> <span class='op'>+</span> <span class='nam'>mtvn_uri</span><span class='strut'>&nbsp;</span></p>
  6984. <p id='t3144' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6985. <p id='t3145' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>videogen_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6986. <p id='t3146' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6987. <p id='t3147' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>metadataXml</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6988. <p id='t3148' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6989. <p id='t3149' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video metadata: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6990. <p id='t3150' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  6991. <p id='t3151' class='pln'><span class='strut'>&nbsp;</span></p>
  6992. <p id='t3152' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mdoc</span> <span class='op'>=</span> <span class='nam'>xml</span><span class='op'>.</span><span class='nam'>etree</span><span class='op'>.</span><span class='nam'>ElementTree</span><span class='op'>.</span><span class='nam'>fromstring</span><span class='op'>(</span><span class='nam'>metadataXml</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6993. <p id='t3153' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>renditions</span> <span class='op'>=</span> <span class='nam'>mdoc</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='str'>&#39;.//rendition&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  6994. <p id='t3154' class='pln'><span class='strut'>&nbsp;</span></p>
  6995. <p id='t3155' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># For now, always pick the highest quality.</span><span class='strut'>&nbsp;</span></p>
  6996. <p id='t3156' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>rendition</span> <span class='op'>=</span> <span class='nam'>renditions</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  6997. <p id='t3157' class='pln'><span class='strut'>&nbsp;</span></p>
  6998. <p id='t3158' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  6999. <p id='t3159' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>_</span><span class='op'>,</span><span class='nam'>_</span><span class='op'>,</span><span class='nam'>ext</span> <span class='op'>=</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;type&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>partition</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7000. <p id='t3160' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='nam'>ext</span> <span class='op'>+</span> <span class='str'>&#39;-&#39;</span> <span class='op'>+</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;width&#39;</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;x&#39;</span> <span class='op'>+</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;height&#39;</span><span class='op'>]</span> <span class='op'>+</span> <span class='str'>&#39;_&#39;</span> <span class='op'>+</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>attrib</span><span class='op'>[</span><span class='str'>&#39;bitrate&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7001. <p id='t3161' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>rendition</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='str'>&#39;./src&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>text</span><span class='strut'>&nbsp;</span></p>
  7002. <p id='t3162' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>KeyError</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7003. <p id='t3163' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>&#39;Invalid rendition field.&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7004. <p id='t3164' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7005. <p id='t3165' class='pln'><span class='strut'>&nbsp;</span></p>
  7006. <p id='t3166' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7007. <p id='t3167' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7008. <p id='t3168' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7009. <p id='t3169' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>performer</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7010. <p id='t3170' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7011. <p id='t3171' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7012. <p id='t3172' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>ext</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7013. <p id='t3173' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;format&#39;</span><span class='op'>:</span> <span class='nam'>format</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7014. <p id='t3174' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7015. <p id='t3175' class='pln'><span class='strut'>&nbsp;</span></p>
  7016. <p id='t3176' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7017. <p id='t3177' class='pln'><span class='strut'>&nbsp;</span></p>
  7018. <p id='t3178' class='pln'><span class='strut'>&nbsp;</span></p>
  7019. <p id='t3179' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>YoukuIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7020. <p id='t3180' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span>&nbsp; <span class='str'>r&#39;(?:http://)?v\.youku\.com/v_show/id_(?P&lt;ID&gt;[A-Za-z0-9]+)\.html&#39;</span><span class='strut'>&nbsp;</span></p>
  7021. <p id='t3181' class='pln'><span class='strut'>&nbsp;</span></p>
  7022. <p id='t3182' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7023. <p id='t3183' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report webpage download.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7024. <p id='t3184' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7025. <p id='t3185' class='pln'><span class='strut'>&nbsp;</span></p>
  7026. <p id='t3186' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7027. <p id='t3187' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7028. <p id='t3188' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7029. <p id='t3189' class='pln'><span class='strut'>&nbsp;</span></p>
  7030. <p id='t3190' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_gen_sid</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7031. <p id='t3191' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>nowTime</span> <span class='op'>=</span> <span class='nam'>int</span><span class='op'>(</span><span class='nam'>time</span><span class='op'>.</span><span class='nam'>time</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>*</span> <span class='num'>1000</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7032. <p id='t3192' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>random1</span> <span class='op'>=</span> <span class='nam'>random</span><span class='op'>.</span><span class='nam'>randint</span><span class='op'>(</span><span class='num'>1000</span><span class='op'>,</span><span class='num'>1998</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7033. <p id='t3193' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>random2</span> <span class='op'>=</span> <span class='nam'>random</span><span class='op'>.</span><span class='nam'>randint</span><span class='op'>(</span><span class='num'>1000</span><span class='op'>,</span><span class='num'>9999</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7034. <p id='t3194' class='pln'><span class='strut'>&nbsp;</span></p>
  7035. <p id='t3195' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&quot;%d%d%d&quot;</span> <span class='op'>%</span><span class='op'>(</span><span class='nam'>nowTime</span><span class='op'>,</span><span class='nam'>random1</span><span class='op'>,</span><span class='nam'>random2</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7036. <p id='t3196' class='pln'><span class='strut'>&nbsp;</span></p>
  7037. <p id='t3197' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_get_file_ID_mix_string</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>seed</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7038. <p id='t3198' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixed</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7039. <p id='t3199' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>source</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='str'>&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7040. <p id='t3200' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>seed</span> <span class='op'>=</span> <span class='nam'>float</span><span class='op'>(</span><span class='nam'>seed</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7041. <p id='t3201' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>i</span> <span class='key'>in</span> <span class='nam'>range</span><span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>)</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7042. <p id='t3202' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>seed</span>&nbsp; <span class='op'>=</span>&nbsp; <span class='op'>(</span><span class='nam'>seed</span> <span class='op'>*</span> <span class='num'>211</span> <span class='op'>+</span> <span class='num'>30031</span> <span class='op'>)</span> <span class='op'>%</span> <span class='num'>65536</span><span class='strut'>&nbsp;</span></p>
  7043. <p id='t3203' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>index</span>&nbsp; <span class='op'>=</span>&nbsp; <span class='nam'>math</span><span class='op'>.</span><span class='nam'>floor</span><span class='op'>(</span><span class='nam'>seed</span> <span class='op'>/</span> <span class='num'>65536</span> <span class='op'>*</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>)</span> <span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7044. <p id='t3204' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixed</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>[</span><span class='nam'>int</span><span class='op'>(</span><span class='nam'>index</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7045. <p id='t3205' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>source</span><span class='op'>.</span><span class='nam'>remove</span><span class='op'>(</span><span class='nam'>source</span><span class='op'>[</span><span class='nam'>int</span><span class='op'>(</span><span class='nam'>index</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7046. <p id='t3206' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#return &#39;&#39;.join(mixed)</span><span class='strut'>&nbsp;</span></p>
  7047. <p id='t3207' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>mixed</span><span class='strut'>&nbsp;</span></p>
  7048. <p id='t3208' class='pln'><span class='strut'>&nbsp;</span></p>
  7049. <p id='t3209' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_get_file_id</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fileId</span><span class='op'>,</span> <span class='nam'>seed</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7050. <p id='t3210' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mixed</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_get_file_ID_mix_string</span><span class='op'>(</span><span class='nam'>seed</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7051. <p id='t3211' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ids</span> <span class='op'>=</span> <span class='nam'>fileId</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>&#39;*&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7052. <p id='t3212' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>realId</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7053. <p id='t3213' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>ch</span> <span class='key'>in</span> <span class='nam'>ids</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7054. <p id='t3214' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>ch</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7055. <p id='t3215' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>realId</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>mixed</span><span class='op'>[</span><span class='nam'>int</span><span class='op'>(</span><span class='nam'>ch</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7056. <p id='t3216' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='str'>&#39;&#39;</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>realId</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7057. <p id='t3217' class='pln'><span class='strut'>&nbsp;</span></p>
  7058. <p id='t3218' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7059. <p id='t3219' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7060. <p id='t3220' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7061. <p id='t3221' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7062. <p id='t3222' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7063. <p id='t3223' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;ID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7064. <p id='t3224' class='pln'><span class='strut'>&nbsp;</span></p>
  7065. <p id='t3225' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info_url</span> <span class='op'>=</span> <span class='str'>&#39;http://v.youku.com/player/getPlayList/VideoIDS/&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  7066. <p id='t3226' class='pln'><span class='strut'>&nbsp;</span></p>
  7067. <p id='t3227' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>info_url</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>,</span> <span class='nam'>std_headers</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7068. <p id='t3228' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7069. <p id='t3229' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7070. <p id='t3230' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>jsondata</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7071. <p id='t3231' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7072. <p id='t3232' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7073. <p id='t3233' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7074. <p id='t3234' class='pln'><span class='strut'>&nbsp;</span></p>
  7075. <p id='t3235' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7076. <p id='t3236' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7077. <p id='t3237' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>jsonstr</span> <span class='op'>=</span> <span class='nam'>jsondata</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7078. <p id='t3238' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>config</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>jsonstr</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7079. <p id='t3239' class='pln'><span class='strut'>&nbsp;</span></p>
  7080. <p id='t3240' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span>&nbsp; <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7081. <p id='t3241' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>seed</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;seed&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7082. <p id='t3242' class='pln'><span class='strut'>&nbsp;</span></p>
  7083. <p id='t3243' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>params</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;format&#39;</span><span class='op'>,</span> <span class='nam'>None</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7084. <p id='t3244' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>supported_format</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;streamfileids&#39;</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>keys</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7085. <p id='t3245' class='pln'><span class='strut'>&nbsp;</span></p>
  7086. <p id='t3246' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>format</span> <span class='key'>is</span> <span class='nam'>None</span> <span class='key'>or</span> <span class='nam'>format</span> <span class='op'>==</span> <span class='str'>&#39;best&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7087. <p id='t3247' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='str'>&#39;hd2&#39;</span> <span class='key'>in</span> <span class='nam'>supported_format</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7088. <p id='t3248' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='str'>&#39;hd2&#39;</span><span class='strut'>&nbsp;</span></p>
  7089. <p id='t3249' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7090. <p id='t3250' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='str'>&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  7091. <p id='t3251' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='str'>u&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  7092. <p id='t3252' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>elif</span> <span class='nam'>format</span> <span class='op'>==</span> <span class='str'>&#39;worst&#39;</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7093. <p id='t3253' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='str'>&#39;mp4&#39;</span><span class='strut'>&nbsp;</span></p>
  7094. <p id='t3254' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='str'>u&#39;mp4&#39;</span><span class='strut'>&nbsp;</span></p>
  7095. <p id='t3255' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7096. <p id='t3256' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>format</span> <span class='op'>=</span> <span class='str'>&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  7097. <p id='t3257' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ext</span> <span class='op'>=</span> <span class='str'>u&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  7098. <p id='t3258' class='pln'><span class='strut'>&nbsp;</span></p>
  7099. <p id='t3259' class='pln'><span class='strut'>&nbsp;</span></p>
  7100. <p id='t3260' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>fileid</span> <span class='op'>=</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;streamfileids&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>format</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7101. <p id='t3261' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>keys</span> <span class='op'>=</span> <span class='op'>[</span><span class='nam'>s</span><span class='op'>[</span><span class='str'>&#39;k&#39;</span><span class='op'>]</span> <span class='key'>for</span> <span class='nam'>s</span> <span class='key'>in</span> <span class='nam'>config</span><span class='op'>[</span><span class='str'>&#39;data&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='str'>&#39;segs&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='nam'>format</span><span class='op'>]</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7102. <p id='t3262' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>UnicodeDecodeError</span><span class='op'>,</span> <span class='nam'>ValueError</span><span class='op'>,</span> <span class='nam'>KeyError</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7103. <p id='t3263' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract info section&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7104. <p id='t3264' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7105. <p id='t3265' class='pln'><span class='strut'>&nbsp;</span></p>
  7106. <p id='t3266' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files_info</span><span class='op'>=</span><span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7107. <p id='t3267' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>sid</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_gen_sid</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7108. <p id='t3268' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>fileid</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_get_file_id</span><span class='op'>(</span><span class='nam'>fileid</span><span class='op'>,</span> <span class='nam'>seed</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7109. <p id='t3269' class='pln'><span class='strut'>&nbsp;</span></p>
  7110. <p id='t3270' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#column 8,9 of fileid represent the segment number</span><span class='strut'>&nbsp;</span></p>
  7111. <p id='t3271' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'>#fileid[7:9] should be changed</span><span class='strut'>&nbsp;</span></p>
  7112. <p id='t3272' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>index</span><span class='op'>,</span> <span class='nam'>key</span> <span class='key'>in</span> <span class='nam'>enumerate</span><span class='op'>(</span><span class='nam'>keys</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7113. <p id='t3273' class='pln'><span class='strut'>&nbsp;</span></p>
  7114. <p id='t3274' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>temp_fileid</span> <span class='op'>=</span> <span class='str'>&#39;%s%02X%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>fileid</span><span class='op'>[</span><span class='num'>0</span><span class='op'>:</span><span class='num'>8</span><span class='op'>]</span><span class='op'>,</span> <span class='nam'>index</span><span class='op'>,</span> <span class='nam'>fileid</span><span class='op'>[</span><span class='num'>10</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7115. <p id='t3275' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>download_url</span> <span class='op'>=</span> <span class='str'>&#39;http://f.youku.com/player/getFlvPath/sid/%s_%02X/st/flv/fileid/%s?k=%s&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>sid</span><span class='op'>,</span> <span class='nam'>index</span><span class='op'>,</span> <span class='nam'>temp_fileid</span><span class='op'>,</span> <span class='nam'>key</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7116. <p id='t3276' class='pln'><span class='strut'>&nbsp;</span></p>
  7117. <p id='t3277' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7118. <p id='t3278' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='str'>&#39;%s_part%02d&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>index</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7119. <p id='t3279' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>download_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7120. <p id='t3280' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7121. <p id='t3281' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7122. <p id='t3282' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7123. <p id='t3283' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>ext</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7124. <p id='t3284' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7125. <p id='t3285' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>files_info</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7126. <p id='t3286' class='pln'><span class='strut'>&nbsp;</span></p>
  7127. <p id='t3287' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>files_info</span><span class='strut'>&nbsp;</span></p>
  7128. <p id='t3288' class='pln'><span class='strut'>&nbsp;</span></p>
  7129. <p id='t3289' class='pln'><span class='strut'>&nbsp;</span></p>
  7130. <p id='t3290' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>XNXXIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7131. <p id='t3291' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for xnxx.com&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7132. <p id='t3292' class='pln'><span class='strut'>&nbsp;</span></p>
  7133. <p id='t3293' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^http://video\.xnxx\.com/video([0-9]+)/(.*)&#39;</span><span class='strut'>&nbsp;</span></p>
  7134. <p id='t3294' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;xnxx&#39;</span><span class='strut'>&nbsp;</span></p>
  7135. <p id='t3295' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>VIDEO_URL_RE</span> <span class='op'>=</span> <span class='str'>r&#39;flv_url=(.*?)&amp;amp;&#39;</span><span class='strut'>&nbsp;</span></p>
  7136. <p id='t3296' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>VIDEO_TITLE_RE</span> <span class='op'>=</span> <span class='str'>r&#39;&lt;title&gt;(.*?)\s+-\s+XNXX.COM&#39;</span><span class='strut'>&nbsp;</span></p>
  7137. <p id='t3297' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>VIDEO_THUMB_RE</span> <span class='op'>=</span> <span class='str'>r&#39;url_bigthumb=(.*?)&amp;amp;&#39;</span><span class='strut'>&nbsp;</span></p>
  7138. <p id='t3298' class='pln'><span class='strut'>&nbsp;</span></p>
  7139. <p id='t3299' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_webpage</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7140. <p id='t3300' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7141. <p id='t3301' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Downloading webpage&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7142. <p id='t3302' class='pln'><span class='strut'>&nbsp;</span></p>
  7143. <p id='t3303' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7144. <p id='t3304' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7145. <p id='t3305' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7146. <p id='t3306' class='pln'><span class='strut'>&nbsp;</span></p>
  7147. <p id='t3307' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7148. <p id='t3308' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7149. <p id='t3309' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7150. <p id='t3310' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7151. <p id='t3311' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7152. <p id='t3312' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7153. <p id='t3313' class='pln'><span class='strut'>&nbsp;</span></p>
  7154. <p id='t3314' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_webpage</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7155. <p id='t3315' class='pln'><span class='strut'>&nbsp;</span></p>
  7156. <p id='t3316' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get webpage content</span><span class='strut'>&nbsp;</span></p>
  7157. <p id='t3317' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7158. <p id='t3318' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage_bytes</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7159. <p id='t3319' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7160. <p id='t3320' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7161. <p id='t3321' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>err</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7162. <p id='t3322' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7163. <p id='t3323' class='pln'><span class='strut'>&nbsp;</span></p>
  7164. <p id='t3324' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>VIDEO_URL_RE</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7165. <p id='t3325' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>result</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7166. <p id='t3326' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video url&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7167. <p id='t3327' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7168. <p id='t3328' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>compat_urllib_parse</span><span class='op'>.</span><span class='nam'>unquote</span><span class='op'>(</span><span class='nam'>result</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7169. <p id='t3329' class='pln'><span class='strut'>&nbsp;</span></p>
  7170. <p id='t3330' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>VIDEO_TITLE_RE</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7171. <p id='t3331' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>result</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7172. <p id='t3332' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7173. <p id='t3333' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7174. <p id='t3334' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>result</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7175. <p id='t3335' class='pln'><span class='strut'>&nbsp;</span></p>
  7176. <p id='t3336' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>result</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>VIDEO_THUMB_RE</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7177. <p id='t3337' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>result</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7178. <p id='t3338' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video thumbnail&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7179. <p id='t3339' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7180. <p id='t3340' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_thumbnail</span> <span class='op'>=</span> <span class='nam'>result</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7181. <p id='t3341' class='pln'><span class='strut'>&nbsp;</span></p>
  7182. <p id='t3342' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7183. <p id='t3343' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7184. <p id='t3344' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7185. <p id='t3345' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7186. <p id='t3346' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7187. <p id='t3347' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7188. <p id='t3348' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7189. <p id='t3349' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;thumbnail&#39;</span><span class='op'>:</span> <span class='nam'>video_thumbnail</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7190. <p id='t3350' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>None</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7191. <p id='t3351' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7192. <p id='t3352' class='pln'><span class='strut'>&nbsp;</span></p>
  7193. <p id='t3353' class='pln'><span class='strut'>&nbsp;</span></p>
  7194. <p id='t3354' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>GooglePlusIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7195. <p id='t3355' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for plus.google.com.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7196. <p id='t3356' class='pln'><span class='strut'>&nbsp;</span></p>
  7197. <p id='t3357' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;(?:https://)?plus\.google\.com/(?:[^/]+/)*?posts/(\w+)&#39;</span><span class='strut'>&nbsp;</span></p>
  7198. <p id='t3358' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;plus.google&#39;</span><span class='strut'>&nbsp;</span></p>
  7199. <p id='t3359' class='pln'><span class='strut'>&nbsp;</span></p>
  7200. <p id='t3360' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7201. <p id='t3361' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoExtractor</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>downloader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7202. <p id='t3362' class='pln'><span class='strut'>&nbsp;</span></p>
  7203. <p id='t3363' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extract_entry</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7204. <p id='t3364' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report downloading extry&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7205. <p id='t3365' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[plus.google] Downloading entry: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7206. <p id='t3366' class='pln'><span class='strut'>&nbsp;</span></p>
  7207. <p id='t3367' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_date</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>upload_date</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7208. <p id='t3368' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report downloading extry&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7209. <p id='t3369' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[plus.google] Entry date: %s&#39;</span> <span class='op'>%</span> <span class='nam'>upload_date</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7210. <p id='t3370' class='pln'><span class='strut'>&nbsp;</span></p>
  7211. <p id='t3371' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_uploader</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>uploader</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7212. <p id='t3372' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report downloading extry&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7213. <p id='t3373' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[plus.google] Uploader: %s&#39;</span> <span class='op'>%</span> <span class='nam'>uploader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7214. <p id='t3374' class='pln'><span class='strut'>&nbsp;</span></p>
  7215. <p id='t3375' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_title</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_title</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7216. <p id='t3376' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report downloading extry&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7217. <p id='t3377' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[plus.google] Title: %s&#39;</span> <span class='op'>%</span> <span class='nam'>video_title</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7218. <p id='t3378' class='pln'><span class='strut'>&nbsp;</span></p>
  7219. <p id='t3379' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extract_vid_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>video_page</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7220. <p id='t3380' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7221. <p id='t3381' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[plus.google] Extracting video page: %s&#39;</span> <span class='op'>%</span> <span class='nam'>video_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7222. <p id='t3382' class='pln'><span class='strut'>&nbsp;</span></p>
  7223. <p id='t3383' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7224. <p id='t3384' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract id from URL</span><span class='strut'>&nbsp;</span></p>
  7225. <p id='t3385' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7226. <p id='t3386' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7227. <p id='t3387' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7228. <p id='t3388' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7229. <p id='t3389' class='pln'><span class='strut'>&nbsp;</span></p>
  7230. <p id='t3390' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>post_url</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7231. <p id='t3391' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7232. <p id='t3392' class='pln'><span class='strut'>&nbsp;</span></p>
  7233. <p id='t3393' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='str'>&#39;flv&#39;</span><span class='strut'>&nbsp;</span></p>
  7234. <p id='t3394' class='pln'><span class='strut'>&nbsp;</span></p>
  7235. <p id='t3395' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Step 1, Retrieve post webpage to extract further information</span><span class='strut'>&nbsp;</span></p>
  7236. <p id='t3396' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extract_entry</span><span class='op'>(</span><span class='nam'>post_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7237. <p id='t3397' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>post_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7238. <p id='t3398' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7239. <p id='t3399' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7240. <p id='t3400' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7241. <p id='t3401' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve entry webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7242. <p id='t3402' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7243. <p id='t3403' class='pln'><span class='strut'>&nbsp;</span></p>
  7244. <p id='t3404' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract update date</span><span class='strut'>&nbsp;</span></p>
  7245. <p id='t3405' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  7246. <p id='t3406' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pattern</span> <span class='op'>=</span> <span class='str'>&#39;title=&quot;Timestamp&quot;&gt;(.*?)&lt;/a&gt;&#39;</span><span class='strut'>&nbsp;</span></p>
  7247. <p id='t3407' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7248. <p id='t3408' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7249. <p id='t3409' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7250. <p id='t3410' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Convert timestring to a format suitable for filename</span><span class='strut'>&nbsp;</span></p>
  7251. <p id='t3411' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>strptime</span><span class='op'>(</span><span class='nam'>upload_date</span><span class='op'>,</span> <span class='str'>&quot;%Y-%m-%d&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7252. <p id='t3412' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>upload_date</span><span class='op'>.</span><span class='nam'>strftime</span><span class='op'>(</span><span class='str'>&#39;%Y%m%d&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7253. <p id='t3413' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_date</span><span class='op'>(</span><span class='nam'>upload_date</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7254. <p id='t3414' class='pln'><span class='strut'>&nbsp;</span></p>
  7255. <p id='t3415' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract uploader</span><span class='strut'>&nbsp;</span></p>
  7256. <p id='t3416' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  7257. <p id='t3417' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pattern</span> <span class='op'>=</span> <span class='str'>r&#39;rel\=&quot;author&quot;.*?&gt;(.*?)&lt;/a&gt;&#39;</span><span class='strut'>&nbsp;</span></p>
  7258. <p id='t3418' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7259. <p id='t3419' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7260. <p id='t3420' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7261. <p id='t3421' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_uploader</span><span class='op'>(</span><span class='nam'>uploader</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7262. <p id='t3422' class='pln'><span class='strut'>&nbsp;</span></p>
  7263. <p id='t3423' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract title</span><span class='strut'>&nbsp;</span></p>
  7264. <p id='t3424' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Get the first line for title</span><span class='strut'>&nbsp;</span></p>
  7265. <p id='t3425' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='str'>u&#39;NA&#39;</span><span class='strut'>&nbsp;</span></p>
  7266. <p id='t3426' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pattern</span> <span class='op'>=</span> <span class='str'>r&#39;&lt;meta name\=\&quot;Description\&quot; content\=\&quot;(.*?)[\n&lt;&quot;]&#39;</span><span class='strut'>&nbsp;</span></p>
  7267. <p id='t3427' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7268. <p id='t3428' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7269. <p id='t3429' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_title</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7270. <p id='t3430' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_title</span><span class='op'>(</span><span class='nam'>video_title</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7271. <p id='t3431' class='pln'><span class='strut'>&nbsp;</span></p>
  7272. <p id='t3432' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Step 2, Stimulate clicking the image box to launch video</span><span class='strut'>&nbsp;</span></p>
  7273. <p id='t3433' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pattern</span> <span class='op'>=</span> <span class='str'>&#39;&quot;(https\://plus\.google\.com/photos/.*?)&quot;,,&quot;image/jpeg&quot;,&quot;video&quot;\]&#39;</span><span class='strut'>&nbsp;</span></p>
  7274. <p id='t3434' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7275. <p id='t3435' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7276. <p id='t3436' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video page URL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7277. <p id='t3437' class='pln'><span class='strut'>&nbsp;</span></p>
  7278. <p id='t3438' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_page</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7279. <p id='t3439' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>request</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>Request</span><span class='op'>(</span><span class='nam'>video_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7280. <p id='t3440' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7281. <p id='t3441' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>request</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7282. <p id='t3442' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7283. <p id='t3443' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Unable to retrieve video webpage: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7284. <p id='t3444' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7285. <p id='t3445' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extract_vid_page</span><span class='op'>(</span><span class='nam'>video_page</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7286. <p id='t3446' class='pln'><span class='strut'>&nbsp;</span></p>
  7287. <p id='t3447' class='pln'><span class='strut'>&nbsp;</span></p>
  7288. <p id='t3448' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Extract video links on video page</span><span class='strut'>&nbsp;</span></p>
  7289. <p id='t3449' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Extract video links of all sizes&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7290. <p id='t3450' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>pattern</span> <span class='op'>=</span> <span class='str'>&#39;\d+,\d+,(\d+),&quot;(http\://redirector\.googlevideo\.com.*?)&quot;&#39;</span><span class='strut'>&nbsp;</span></p>
  7291. <p id='t3451' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>findall</span><span class='op'>(</span><span class='nam'>pattern</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7292. <p id='t3452' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>len</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>)</span> <span class='op'>==</span> <span class='num'>0</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7293. <p id='t3453' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to extract video links&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7294. <p id='t3454' class='pln'><span class='strut'>&nbsp;</span></p>
  7295. <p id='t3455' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Sort in resolution</span><span class='strut'>&nbsp;</span></p>
  7296. <p id='t3456' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>links</span> <span class='op'>=</span> <span class='nam'>sorted</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7297. <p id='t3457' class='pln'><span class='strut'>&nbsp;</span></p>
  7298. <p id='t3458' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Choose the lowest of the sort, i.e. highest resolution</span><span class='strut'>&nbsp;</span></p>
  7299. <p id='t3459' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>links</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7300. <p id='t3460' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Only get the url. The resolution part in the tuple has no use anymore</span><span class='strut'>&nbsp;</span></p>
  7301. <p id='t3461' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>video_url</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7302. <p id='t3462' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='com'># Treat escaped \u0026 style hex</span><span class='strut'>&nbsp;</span></p>
  7303. <p id='t3463' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7304. <p id='t3464' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>video_url</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&quot;unicode_escape&quot;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7305. <p id='t3465' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='nam'>AttributeError</span><span class='op'>:</span> <span class='com'># Python 3</span><span class='strut'>&nbsp;</span></p>
  7306. <p id='t3466' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>bytes</span><span class='op'>(</span><span class='nam'>video_url</span><span class='op'>,</span> <span class='str'>&#39;ascii&#39;</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;unicode-escape&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7307. <p id='t3467' class='pln'><span class='strut'>&nbsp;</span></p>
  7308. <p id='t3468' class='pln'><span class='strut'>&nbsp;</span></p>
  7309. <p id='t3469' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7310. <p id='t3470' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp;&nbsp; <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7311. <p id='t3471' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7312. <p id='t3472' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7313. <p id='t3473' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span>&nbsp; <span class='nam'>upload_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7314. <p id='t3474' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span>&nbsp; &nbsp; <span class='nam'>video_title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7315. <p id='t3475' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span>&nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7316. <p id='t3476' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7317. <p id='t3477' class='pln'><span class='strut'>&nbsp;</span></p>
  7318. <p id='t3478' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>NBAIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7319. <p id='t3479' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:watch\.|www\.)?nba\.com/(?:nba/)?video(/[^?]*)(\?.*)?$&#39;</span><span class='strut'>&nbsp;</span></p>
  7320. <p id='t3480' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;nba&#39;</span><span class='strut'>&nbsp;</span></p>
  7321. <p id='t3481' class='pln'><span class='strut'>&nbsp;</span></p>
  7322. <p id='t3482' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7323. <p id='t3483' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7324. <p id='t3484' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7325. <p id='t3485' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7326. <p id='t3486' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7327. <p id='t3487' class='pln'><span class='strut'>&nbsp;</span></p>
  7328. <p id='t3488' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7329. <p id='t3489' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>endswith</span><span class='op'>(</span><span class='str'>&#39;/index.html&#39;</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7330. <p id='t3490' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>video_id</span><span class='op'>[</span><span class='op'>:</span><span class='op'>-</span><span class='nam'>len</span><span class='op'>(</span><span class='str'>&#39;/index.html&#39;</span><span class='op'>)</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7331. <p id='t3491' class='pln'><span class='strut'>&nbsp;</span></p>
  7332. <p id='t3492' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7333. <p id='t3493' class='pln'><span class='strut'>&nbsp;</span></p>
  7334. <p id='t3494' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>u&#39;http://ht-mobile.cdn.turner.com/nba/big&#39;</span> <span class='op'>+</span> <span class='nam'>video_id</span> <span class='op'>+</span> <span class='str'>&#39;_nba_1280x720.mp4&#39;</span><span class='strut'>&nbsp;</span></p>
  7335. <p id='t3495' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_findProp</span><span class='op'>(</span><span class='nam'>rexp</span><span class='op'>,</span> <span class='nam'>default</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7336. <p id='t3496' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>rexp</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7337. <p id='t3497' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7338. <p id='t3498' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7339. <p id='t3499' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7340. <p id='t3500' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>default</span><span class='strut'>&nbsp;</span></p>
  7341. <p id='t3501' class='pln'><span class='strut'>&nbsp;</span></p>
  7342. <p id='t3502' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>shortened_video_id</span> <span class='op'>=</span> <span class='nam'>video_id</span><span class='op'>.</span><span class='nam'>rpartition</span><span class='op'>(</span><span class='str'>&#39;/&#39;</span><span class='op'>)</span><span class='op'>[</span><span class='num'>2</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7343. <p id='t3503' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>_findProp</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta property=&quot;og:title&quot; content=&quot;(.*?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>shortened_video_id</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>&#39;NBA.com: &#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7344. <p id='t3504' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7345. <p id='t3505' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>shortened_video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7346. <p id='t3506' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7347. <p id='t3507' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7348. <p id='t3508' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7349. <p id='t3509' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader_date&#39;</span><span class='op'>:</span> <span class='nam'>_findProp</span><span class='op'>(</span><span class='str'>r&#39;&lt;b&gt;Date:&lt;/b&gt; (.*?)&lt;/div&gt;&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7350. <p id='t3510' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>_findProp</span><span class='op'>(</span><span class='str'>r&#39;&lt;div class=&quot;description&quot;&gt;(.*?)&lt;/h1&gt;&#39;</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7351. <p id='t3511' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7352. <p id='t3512' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7353. <p id='t3513' class='pln'><span class='strut'>&nbsp;</span></p>
  7354. <p id='t3514' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>JustinTVIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7355. <p id='t3515' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Information extractor for justin.tv and twitch.tv&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7356. <p id='t3516' class='pln'>&nbsp; &nbsp; <span class='com'># TODO: One broadcast may be split into multiple videos. The key</span><span class='strut'>&nbsp;</span></p>
  7357. <p id='t3517' class='pln'>&nbsp; &nbsp; <span class='com'># &#39;broadcast_id&#39; is the same for all parts, and &#39;broadcast_part&#39;</span><span class='strut'>&nbsp;</span></p>
  7358. <p id='t3518' class='pln'>&nbsp; &nbsp; <span class='com'># starts at 1 and increases. Can we treat all parts as one video?</span><span class='strut'>&nbsp;</span></p>
  7359. <p id='t3519' class='pln'><span class='strut'>&nbsp;</span></p>
  7360. <p id='t3520' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&quot;&quot;&quot;(?x)^(?:http://)?(?:www\.)?(?:twitch|justin)\.tv/</span><span class='strut'>&nbsp;</span></p>
  7361. <p id='t3521' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; ([^/]+)(?:/b/([^/]+))?/?(?:\#.*)?$&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7362. <p id='t3522' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_JUSTIN_PAGE_LIMIT</span> <span class='op'>=</span> <span class='num'>100</span><span class='strut'>&nbsp;</span></p>
  7363. <p id='t3523' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;justin.tv&#39;</span><span class='strut'>&nbsp;</span></p>
  7364. <p id='t3524' class='pln'><span class='strut'>&nbsp;</span></p>
  7365. <p id='t3525' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7366. <p id='t3526' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report information extraction.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7367. <p id='t3527' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Extracting information&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>file_id</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7368. <p id='t3528' class='pln'><span class='strut'>&nbsp;</span></p>
  7369. <p id='t3529' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>channel</span><span class='op'>,</span> <span class='nam'>offset</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7370. <p id='t3530' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Report attempt to download a single page of videos.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7371. <p id='t3531' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>to_screen</span><span class='op'>(</span><span class='str'>u&#39;[%s] %s: Downloading video information from %d to %d&#39;</span> <span class='op'>%</span><span class='strut'>&nbsp;</span></p>
  7372. <p id='t3532' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>IE_NAME</span><span class='op'>,</span> <span class='nam'>channel</span><span class='op'>,</span> <span class='nam'>offset</span><span class='op'>,</span> <span class='nam'>offset</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_JUSTIN_PAGE_LIMIT</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7373. <p id='t3533' class='pln'><span class='strut'>&nbsp;</span></p>
  7374. <p id='t3534' class='pln'>&nbsp; &nbsp; <span class='com'># Return count of items, list of *valid* items</span><span class='strut'>&nbsp;</span></p>
  7375. <p id='t3535' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_parse_page</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7376. <p id='t3536' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>try</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7377. <p id='t3537' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlh</span> <span class='op'>=</span> <span class='nam'>compat_urllib_request</span><span class='op'>.</span><span class='nam'>urlopen</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7378. <p id='t3538' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage_bytes</span> <span class='op'>=</span> <span class='nam'>urlh</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7379. <p id='t3539' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>webpage_bytes</span><span class='op'>.</span><span class='nam'>decode</span><span class='op'>(</span><span class='str'>&#39;utf-8&#39;</span><span class='op'>,</span> <span class='str'>&#39;ignore&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7380. <p id='t3540' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>except</span> <span class='op'>(</span><span class='nam'>compat_urllib_error</span><span class='op'>.</span><span class='nam'>URLError</span><span class='op'>,</span> <span class='nam'>compat_http_client</span><span class='op'>.</span><span class='nam'>HTTPException</span><span class='op'>,</span> <span class='nam'>socket</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>)</span> <span class='key'>as</span> <span class='nam'>err</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7381. <p id='t3541' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to download video info JSON: %s&#39;</span> <span class='op'>%</span> <span class='nam'>compat_str</span><span class='op'>(</span><span class='nam'>err</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7382. <p id='t3542' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7383. <p id='t3543' class='pln'><span class='strut'>&nbsp;</span></p>
  7384. <p id='t3544' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>response</span> <span class='op'>=</span> <span class='nam'>json</span><span class='op'>.</span><span class='nam'>loads</span><span class='op'>(</span><span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7385. <p id='t3545' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7386. <p id='t3546' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>clip</span> <span class='key'>in</span> <span class='nam'>response</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7387. <p id='t3547' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>clip</span><span class='op'>[</span><span class='str'>&#39;video_file_url&#39;</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7388. <p id='t3548' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>video_url</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7389. <p id='t3549' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_extension</span> <span class='op'>=</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>splitext</span><span class='op'>(</span><span class='nam'>video_url</span><span class='op'>)</span><span class='op'>[</span><span class='num'>1</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7390. <p id='t3550' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_date</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='str'>&#39;-&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>,</span> <span class='nam'>clip</span><span class='op'>[</span><span class='str'>&#39;created_on&#39;</span><span class='op'>]</span><span class='op'>[</span><span class='op'>:</span><span class='num'>10</span><span class='op'>]</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7391. <p id='t3551' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7392. <p id='t3552' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>clip</span><span class='op'>[</span><span class='str'>&#39;id&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7393. <p id='t3553' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7394. <p id='t3554' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>clip</span><span class='op'>[</span><span class='str'>&#39;title&#39;</span><span class='op'>]</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7395. <p id='t3555' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>clip</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;user_id&#39;</span><span class='op'>,</span> <span class='nam'>clip</span><span class='op'>.</span><span class='nam'>get</span><span class='op'>(</span><span class='str'>&#39;channel_id&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7396. <p id='t3556' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>video_date</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7397. <p id='t3557' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='nam'>video_extension</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7398. <p id='t3558' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7399. <p id='t3559' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>(</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>response</span><span class='op'>)</span><span class='op'>,</span> <span class='nam'>info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7400. <p id='t3560' class='pln'><span class='strut'>&nbsp;</span></p>
  7401. <p id='t3561' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7402. <p id='t3562' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7403. <p id='t3563' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7404. <p id='t3564' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7405. <p id='t3565' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7406. <p id='t3566' class='pln'><span class='strut'>&nbsp;</span></p>
  7407. <p id='t3567' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api</span> <span class='op'>=</span> <span class='str'>&#39;http://api.justin.tv&#39;</span><span class='strut'>&nbsp;</span></p>
  7408. <p id='t3568' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>lastindex</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7409. <p id='t3569' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>paged</span> <span class='op'>=</span> <span class='nam'>False</span><span class='strut'>&nbsp;</span></p>
  7410. <p id='t3570' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>lastindex</span> <span class='op'>==</span> <span class='num'>1</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7411. <p id='t3571' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>paged</span> <span class='op'>=</span> <span class='nam'>True</span><span class='strut'>&nbsp;</span></p>
  7412. <p id='t3572' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api</span> <span class='op'>+=</span> <span class='str'>&#39;/channel/archives/%s.json&#39;</span><span class='strut'>&nbsp;</span></p>
  7413. <p id='t3573' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7414. <p id='t3574' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api</span> <span class='op'>+=</span> <span class='str'>&#39;/clip/show/%s.json&#39;</span><span class='strut'>&nbsp;</span></p>
  7415. <p id='t3575' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>api</span> <span class='op'>=</span> <span class='nam'>api</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7416. <p id='t3576' class='pln'><span class='strut'>&nbsp;</span></p>
  7417. <p id='t3577' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_extraction</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7418. <p id='t3578' class='pln'><span class='strut'>&nbsp;</span></p>
  7419. <p id='t3579' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7420. <p id='t3580' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>offset</span> <span class='op'>=</span> <span class='num'>0</span><span class='strut'>&nbsp;</span></p>
  7421. <p id='t3581' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>limit</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_JUSTIN_PAGE_LIMIT</span><span class='strut'>&nbsp;</span></p>
  7422. <p id='t3582' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>while</span> <span class='nam'>True</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7423. <p id='t3583' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>paged</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7424. <p id='t3584' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>report_download_page</span><span class='op'>(</span><span class='nam'>video_id</span><span class='op'>,</span> <span class='nam'>offset</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7425. <p id='t3585' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page_url</span> <span class='op'>=</span> <span class='nam'>api</span> <span class='op'>+</span> <span class='op'>(</span><span class='str'>&#39;?offset=%d&amp;limit=%d&#39;</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>offset</span><span class='op'>,</span> <span class='nam'>limit</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7426. <p id='t3586' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>page_count</span><span class='op'>,</span> <span class='nam'>page_info</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_parse_page</span><span class='op'>(</span><span class='nam'>page_url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7427. <p id='t3587' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>page_info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7428. <p id='t3588' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>paged</span> <span class='key'>or</span> <span class='nam'>page_count</span> <span class='op'>!=</span> <span class='nam'>limit</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7429. <p id='t3589' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>break</span><span class='strut'>&nbsp;</span></p>
  7430. <p id='t3590' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>offset</span> <span class='op'>+=</span> <span class='nam'>limit</span><span class='strut'>&nbsp;</span></p>
  7431. <p id='t3591' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>info</span><span class='strut'>&nbsp;</span></p>
  7432. <p id='t3592' class='pln'><span class='strut'>&nbsp;</span></p>
  7433. <p id='t3593' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>FunnyOrDieIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7434. <p id='t3594' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?funnyordie\.com/videos/(?P&lt;id&gt;[0-9a-f]+)/.*$&#39;</span><span class='strut'>&nbsp;</span></p>
  7435. <p id='t3595' class='pln'><span class='strut'>&nbsp;</span></p>
  7436. <p id='t3596' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7437. <p id='t3597' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7438. <p id='t3598' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7439. <p id='t3599' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7440. <p id='t3600' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7441. <p id='t3601' class='pln'><span class='strut'>&nbsp;</span></p>
  7442. <p id='t3602' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;id&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7443. <p id='t3603' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7444. <p id='t3604' class='pln'><span class='strut'>&nbsp;</span></p>
  7445. <p id='t3605' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;video[^&gt;]*&gt;\s*&lt;source[^&gt;]*&gt;\s*&lt;source src=&quot;(?P&lt;url&gt;[^&quot;]+)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7446. <p id='t3606' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7447. <p id='t3607' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: unable to find video information&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7448. <p id='t3608' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;url&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7449. <p id='t3609' class='pln'><span class='strut'>&nbsp;</span></p>
  7450. <p id='t3610' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&quot;class=&#39;player_page_h1&#39;&gt;\s+&lt;a.*?&gt;(?P&lt;title&gt;.*?)&lt;/a&gt;&quot;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7451. <p id='t3611' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7452. <p id='t3612' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;Cannot find video title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7453. <p id='t3613' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;title&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7454. <p id='t3614' class='pln'><span class='strut'>&nbsp;</span></p>
  7455. <p id='t3615' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;meta property=&quot;og:description&quot; content=&quot;(?P&lt;desc&gt;.*?)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7456. <p id='t3616' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7457. <p id='t3617' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>desc</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;desc&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7458. <p id='t3618' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>else</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7459. <p id='t3619' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>desc</span> <span class='op'>=</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  7460. <p id='t3620' class='pln'><span class='strut'>&nbsp;</span></p>
  7461. <p id='t3621' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7462. <p id='t3622' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7463. <p id='t3623' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7464. <p id='t3624' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;mp4&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7465. <p id='t3625' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7466. <p id='t3626' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>desc</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7467. <p id='t3627' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7468. <p id='t3628' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7469. <p id='t3629' class='pln'><span class='strut'>&nbsp;</span></p>
  7470. <p id='t3630' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>TweetReelIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7471. <p id='t3631' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;^(?:https?://)?(?:www\.)?tweetreel\.com/[?](?P&lt;id&gt;[0-9a-z]+)$&#39;</span><span class='strut'>&nbsp;</span></p>
  7472. <p id='t3632' class='pln'><span class='strut'>&nbsp;</span></p>
  7473. <p id='t3633' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7474. <p id='t3634' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mobj</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7475. <p id='t3635' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='nam'>mobj</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7476. <p id='t3636' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: invalid URL: %s&#39;</span> <span class='op'>%</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7477. <p id='t3637' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span><span class='strut'>&nbsp;</span></p>
  7478. <p id='t3638' class='pln'><span class='strut'>&nbsp;</span></p>
  7479. <p id='t3639' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>mobj</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;id&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7480. <p id='t3640' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7481. <p id='t3641' class='pln'><span class='strut'>&nbsp;</span></p>
  7482. <p id='t3642' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;div id=&quot;left&quot; status_id=&quot;([0-9]+)&quot;&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7483. <p id='t3643' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7484. <p id='t3644' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Cannot find status ID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7485. <p id='t3645' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>status_id</span> <span class='op'>=</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7486. <p id='t3646' class='pln'><span class='strut'>&nbsp;</span></p>
  7487. <p id='t3647' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;div class=&quot;tweet_text&quot;&gt;(.*?)&lt;/div&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>,</span> <span class='nam'>flags</span><span class='op'>=</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7488. <p id='t3648' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7489. <p id='t3649' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;WARNING: Cannot find description&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7490. <p id='t3650' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>desc</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='str'>&#39;&lt;a.*?&lt;/a&gt;&#39;</span><span class='op'>,</span> <span class='str'>&#39;&#39;</span><span class='op'>,</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7491. <p id='t3651' class='pln'><span class='strut'>&nbsp;</span></p>
  7492. <p id='t3652' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;div class=&quot;tweet_info&quot;&gt;.*?from &lt;a target=&quot;_blank&quot; href=&quot;https?://twitter.com/(?P&lt;uploader_id&gt;.+?)&quot;&gt;(?P&lt;uploader&gt;.+?)&lt;/a&gt;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>,</span> <span class='nam'>flags</span><span class='op'>=</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>DOTALL</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7493. <p id='t3653' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7494. <p id='t3654' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Cannot find uploader&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7495. <p id='t3655' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;uploader&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7496. <p id='t3656' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader_id</span> <span class='op'>=</span> <span class='nam'>unescapeHTML</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;uploader_id&#39;</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7497. <p id='t3657' class='pln'><span class='strut'>&nbsp;</span></p>
  7498. <p id='t3658' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;span unixtime=&quot;([0-9]+)&quot;&#39;</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7499. <p id='t3659' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>m</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7500. <p id='t3660' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Cannot find upload date&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7501. <p id='t3661' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>upload_date</span> <span class='op'>=</span> <span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>datetime</span><span class='op'>.</span><span class='nam'>fromtimestamp</span><span class='op'>(</span><span class='nam'>int</span><span class='op'>(</span><span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>1</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>strftime</span><span class='op'>(</span><span class='str'>&#39;%Y%m%d&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7502. <p id='t3662' class='pln'><span class='strut'>&nbsp;</span></p>
  7503. <p id='t3663' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>desc</span><span class='strut'>&nbsp;</span></p>
  7504. <p id='t3664' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>&#39;http://files.tweetreel.com/video/&#39;</span> <span class='op'>+</span> <span class='nam'>status_id</span> <span class='op'>+</span> <span class='str'>&#39;.mov&#39;</span><span class='strut'>&nbsp;</span></p>
  7505. <p id='t3665' class='pln'><span class='strut'>&nbsp;</span></p>
  7506. <p id='t3666' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7507. <p id='t3667' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span> <span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7508. <p id='t3668' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span> <span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7509. <p id='t3669' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;mov&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7510. <p id='t3670' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7511. <p id='t3671' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;description&#39;</span><span class='op'>:</span> <span class='nam'>desc</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7512. <p id='t3672' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>uploader</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7513. <p id='t3673' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader_id&#39;</span><span class='op'>:</span> <span class='nam'>uploader_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7514. <p id='t3674' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;internal_id&#39;</span><span class='op'>:</span> <span class='nam'>status_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7515. <p id='t3675' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;upload_date&#39;</span><span class='op'>:</span> <span class='nam'>upload_date</span><span class='strut'>&nbsp;</span></p>
  7516. <p id='t3676' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7517. <p id='t3677' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7518. <p id='t3678' class='pln'><span class='strut'>&nbsp;</span></p>
  7519. <p id='t3679' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>SteamIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7520. <p id='t3680' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&quot;&quot;&quot;http://store.steampowered.com/ </span><span class='strut'>&nbsp;</span></p>
  7521. <p id='t3681' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?P&lt;urltype&gt;video|app)/ #If the page is only for videos or for a game</span><span class='strut'>&nbsp;</span></p>
  7522. <p id='t3682' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?P&lt;gameID&gt;\d+)/?</span><span class='strut'>&nbsp;</span></p>
  7523. <p id='t3683' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?P&lt;videoID&gt;\d*)(?P&lt;extra&gt;\??) #For urltype == video we sometimes get the videoID</span><span class='strut'>&nbsp;</span></p>
  7524. <p id='t3684' class='pln'><span class='str'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7525. <p id='t3685' class='pln'><span class='strut'>&nbsp;</span></p>
  7526. <p id='t3686' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>suitable</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7527. <p id='t3687' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&quot;&quot;&quot;Receives a URL and returns True if suitable for this IE.&quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7528. <p id='t3688' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span> <span class='key'>is</span> <span class='key'>not</span> <span class='nam'>None</span><span class='strut'>&nbsp;</span></p>
  7529. <p id='t3689' class='pln'><span class='strut'>&nbsp;</span></p>
  7530. <p id='t3690' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7531. <p id='t3691' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>VERBOSE</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7532. <p id='t3692' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>urlRE</span> <span class='op'>=</span> <span class='str'>r&quot;&#39;movie_(?P&lt;videoID&gt;\d+)&#39;: \{\s*FILENAME: \&quot;(?P&lt;videoURL&gt;[\w:/\.\?=]+)\&quot;(,\s*MOVIE_NAME: \&quot;(?P&lt;videoName&gt;[\w:/\.\?=\+-]+)\&quot;)?\s*\},&quot;</span><span class='strut'>&nbsp;</span></p>
  7533. <p id='t3693' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>gameID</span> <span class='op'>=</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;gameID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7534. <p id='t3694' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videourl</span> <span class='op'>=</span> <span class='str'>&#39;http://store.steampowered.com/video/%s/&#39;</span> <span class='op'>%</span> <span class='nam'>gameID</span><span class='strut'>&nbsp;</span></p>
  7535. <p id='t3695' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>videourl</span><span class='op'>,</span> <span class='nam'>gameID</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7536. <p id='t3696' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>mweb</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>urlRE</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7537. <p id='t3697' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>namesRE</span> <span class='op'>=</span> <span class='str'>r&#39;&lt;span class=\&quot;title\&quot;&gt;(?P&lt;videoName&gt;[\w:/\.\?=\+\s-]+)&lt;/span&gt;&#39;</span><span class='strut'>&nbsp;</span></p>
  7538. <p id='t3698' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>titles</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>re</span><span class='op'>.</span><span class='nam'>finditer</span><span class='op'>(</span><span class='nam'>namesRE</span><span class='op'>,</span> <span class='nam'>webpage</span><span class='op'>)</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7539. <p id='t3699' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videos</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7540. <p id='t3700' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>for</span> <span class='nam'>vid</span><span class='op'>,</span><span class='nam'>vtitle</span> <span class='key'>in</span> <span class='nam'>zip</span><span class='op'>(</span><span class='nam'>mweb</span><span class='op'>,</span><span class='nam'>titles</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7541. <p id='t3701' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>vid</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7542. <p id='t3702' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>vtitle</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoName&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7543. <p id='t3703' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='nam'>vid</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoURL&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7544. <p id='t3704' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>video_url</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7545. <p id='t3705' class='stm mis'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_downloader</span><span class='op'>.</span><span class='nam'>trouble</span><span class='op'>(</span><span class='str'>u&#39;ERROR: Cannot find video url for %s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7546. <p id='t3706' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7547. <p id='t3707' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span><span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7548. <p id='t3708' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span><span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7549. <p id='t3709' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7550. <p id='t3710' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='strut'>&nbsp;</span></p>
  7551. <p id='t3711' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7552. <p id='t3712' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>videos</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>info</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7553. <p id='t3713' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='nam'>videos</span><span class='strut'>&nbsp;</span></p>
  7554. <p id='t3714' class='pln'><span class='strut'>&nbsp;</span></p>
  7555. <p id='t3715' class='stm run hide_run'><span class='key'>class</span> <span class='nam'>UstreamIE</span><span class='op'>(</span><span class='nam'>InfoExtractor</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7556. <p id='t3716' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>_VALID_URL</span> <span class='op'>=</span> <span class='str'>r&#39;http://www.ustream.tv/recorded/(?P&lt;videoID&gt;\d+)&#39;</span><span class='strut'>&nbsp;</span></p>
  7557. <p id='t3717' class='stm run hide_run'>&nbsp; &nbsp; <span class='nam'>IE_NAME</span> <span class='op'>=</span> <span class='str'>u&#39;ustream&#39;</span><span class='strut'>&nbsp;</span></p>
  7558. <p id='t3718' class='pln'><span class='strut'>&nbsp;</span></p>
  7559. <p id='t3719' class='stm run hide_run'>&nbsp; &nbsp; <span class='key'>def</span> <span class='nam'>_real_extract</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7560. <p id='t3720' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>match</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>_VALID_URL</span><span class='op'>,</span> <span class='nam'>url</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7561. <p id='t3721' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_id</span> <span class='op'>=</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;videoID&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7562. <p id='t3722' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>video_url</span> <span class='op'>=</span> <span class='str'>u&#39;http://tcdn.ustream.tv/video/%s&#39;</span> <span class='op'>%</span> <span class='nam'>video_id</span><span class='strut'>&nbsp;</span></p>
  7563. <p id='t3723' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>webpage</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>_download_webpage</span><span class='op'>(</span><span class='nam'>url</span><span class='op'>,</span> <span class='nam'>video_id</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7564. <p id='t3724' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;data-title=&quot;(?P&lt;title&gt;.+)&quot;&#39;</span><span class='op'>,</span><span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7565. <p id='t3725' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>title</span> <span class='op'>=</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;title&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7566. <p id='t3726' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>m</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='str'>r&#39;&lt;a class=&quot;state&quot; data-content-type=&quot;channel&quot; data-content-id=&quot;(?P&lt;uploader&gt;\d+)&quot;&#39;</span><span class='op'>,</span><span class='nam'>webpage</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7567. <p id='t3727' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>uploader</span> <span class='op'>=</span> <span class='nam'>m</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='str'>&#39;uploader&#39;</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7568. <p id='t3728' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>info</span> <span class='op'>=</span> <span class='op'>{</span><span class='strut'>&nbsp;</span></p>
  7569. <p id='t3729' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;id&#39;</span><span class='op'>:</span><span class='nam'>video_id</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7570. <p id='t3730' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;url&#39;</span><span class='op'>:</span><span class='nam'>video_url</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7571. <p id='t3731' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;ext&#39;</span><span class='op'>:</span> <span class='str'>&#39;flv&#39;</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7572. <p id='t3732' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;title&#39;</span><span class='op'>:</span> <span class='nam'>title</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7573. <p id='t3733' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='str'>&#39;uploader&#39;</span><span class='op'>:</span> <span class='nam'>uploader</span><span class='strut'>&nbsp;</span></p>
  7574. <p id='t3734' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class='op'>}</span><span class='strut'>&nbsp;</span></p>
  7575. <p id='t3735' class='stm run hide_run'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='nam'>info</span><span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7576. <p id='t3736' class='pln'><span class='strut'>&nbsp;</span></p>
  7577. <p id='t3737' class='pln'><span class='strut'>&nbsp;</span></p>
  7578. <p id='t3738' class='stm run hide_run'><span class='key'>def</span> <span class='nam'>gen_extractors</span><span class='op'>(</span><span class='op'>)</span><span class='op'>:</span><span class='strut'>&nbsp;</span></p>
  7579. <p id='t3739' class='pln'>&nbsp; &nbsp; <span class='str'>&quot;&quot;&quot; Return a list of an instance of every supported extractor.</span><span class='strut'>&nbsp;</span></p>
  7580. <p id='t3740' class='pln'><span class='str'>&nbsp; &nbsp; The order does matter; the first extractor matched is the one handling the URL.</span><span class='strut'>&nbsp;</span></p>
  7581. <p id='t3741' class='pln'><span class='str'>&nbsp; &nbsp; &quot;&quot;&quot;</span><span class='strut'>&nbsp;</span></p>
  7582. <p id='t3742' class='stm mis'>&nbsp; &nbsp; <span class='key'>return</span> <span class='op'>[</span><span class='strut'>&nbsp;</span></p>
  7583. <p id='t3743' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoutubePlaylistIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7584. <p id='t3744' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoutubeChannelIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7585. <p id='t3745' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoutubeUserIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7586. <p id='t3746' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoutubeSearchIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7587. <p id='t3747' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoutubeIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7588. <p id='t3748' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>MetacafeIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7589. <p id='t3749' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>DailymotionIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7590. <p id='t3750' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>GoogleSearchIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7591. <p id='t3751' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>PhotobucketIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7592. <p id='t3752' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YahooIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7593. <p id='t3753' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YahooSearchIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7594. <p id='t3754' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>DepositFilesIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7595. <p id='t3755' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>FacebookIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7596. <p id='t3756' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>BlipTVUserIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7597. <p id='t3757' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>BlipTVIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7598. <p id='t3758' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>VimeoIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7599. <p id='t3759' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>MyVideoIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7600. <p id='t3760' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ComedyCentralIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7601. <p id='t3761' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>EscapistIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7602. <p id='t3762' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>CollegeHumorIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7603. <p id='t3763' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>XVideosIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7604. <p id='t3764' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>SoundcloudIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7605. <p id='t3765' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>InfoQIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7606. <p id='t3766' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>MixcloudIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7607. <p id='t3767' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>StanfordOpenClassroomIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7608. <p id='t3768' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>MTVIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7609. <p id='t3769' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>YoukuIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7610. <p id='t3770' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>XNXXIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7611. <p id='t3771' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>GooglePlusIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7612. <p id='t3772' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>ArteTvIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7613. <p id='t3773' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>NBAIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7614. <p id='t3774' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>JustinTVIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7615. <p id='t3775' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>FunnyOrDieIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7616. <p id='t3776' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>TweetReelIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7617. <p id='t3777' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>SteamIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7618. <p id='t3778' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>UstreamIE</span><span class='op'>(</span><span class='op'>)</span><span class='op'>,</span><span class='strut'>&nbsp;</span></p>
  7619. <p id='t3779' class='pln'>&nbsp; &nbsp; &nbsp; &nbsp; <span class='nam'>GenericIE</span><span class='op'>(</span><span class='op'>)</span><span class='strut'>&nbsp;</span></p>
  7620. <p id='t3780' class='pln'>&nbsp; &nbsp; <span class='op'>]</span><span class='strut'>&nbsp;</span></p>
  7621. <p id='t3781' class='pln'><span class='strut'>&nbsp;</span></p>
  7622. <p id='t3782' class='pln'><span class='strut'>&nbsp;</span></p>
  7623. </td>
  7624. </tr>
  7625. </table>
  7626. </div>
  7627. <div id='footer'>
  7628. <div class='content'>
  7629. <p>
  7630. <a class='nav' href='index.html'>&#xab; index</a> &nbsp; &nbsp; <a class='nav' href='http://nedbatchelder.com/code/coverage/3.6b1'>coverage.py v3.6b1</a>
  7631. </p>
  7632. </div>
  7633. </div>
  7634. </body>
  7635. </html>