2 from __future__
import unicode_literals
7 from .common
import InfoExtractor
17 class GloboIE(InfoExtractor
):
18 _VALID_URL
= 'https?://.+?\.globo\.com/(?P<id>.+)'
20 _API_URL_TEMPLATE
= 'http://api.globovideos.com/videos/%s/playlist'
21 _SECURITY_URL_TEMPLATE
= 'http://security.video.globo.com/videos/%s/hash?player=flash&version=2.9.9.50&resource_id=%s'
24 r
'\bdata-video-id="(\d+)"',
25 r
'\bdata-player-videosids="(\d+)"',
26 r
'<div[^>]+\bid="(\d+)"',
29 _RESIGN_EXPIRATION
= 86400
33 'url': 'http://globotv.globo.com/sportv/futebol-nacional/v/os-gols-de-atletico-mg-3-x-2-santos-pela-24a-rodada-do-brasileirao/3654973/',
34 'md5': '03ebf41cb7ade43581608b7d9b71fab0',
38 'title': 'Os gols de Atlético-MG 3 x 2 Santos pela 24ª rodada do Brasileirão',
46 'url': 'http://g1.globo.com/carros/autoesporte/videos/t/exclusivos-do-g1/v/mercedes-benz-gla-passa-por-teste-de-colisao-na-europa/3607726/',
47 'md5': 'b3ccc801f75cd04a914d51dadb83a78d',
51 'title': 'Mercedes-Benz GLA passa por teste de colisão na Europa',
53 'uploader': 'Globo.com',
59 'url': 'http://g1.globo.com/jornal-nacional/noticia/2014/09/novidade-na-fiscalizacao-de-bagagem-pela-receita-provoca-discussoes.html',
60 'md5': '307fdeae4390ccfe6ba1aa198cf6e72b',
64 'title': 'Receita Federal explica como vai fiscalizar bagagens de quem retorna ao Brasil de avião',
66 'uploader': 'Rede Globo',
74 HEX_FORMAT_LOWERCASE
= 0
75 HEX_FORMAT_UPPERCASE
= 1
76 BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE
= ''
77 BASE64_PAD_CHARACTER_RFC_COMPLIANCE
= '='
86 def __getitem__(self
, y
):
88 return list.__getitem
__(self
, y
)
92 def __setitem__(self
, i
, y
):
94 return list.__setitem
__(self
, i
, y
)
96 self
.extend([0] * (i
- len(self
) + 1))
100 def hex_md5(cls
, param1
):
101 return cls
.rstr2hex(cls
.rstr_md5(cls
.str2rstr_utf8(param1
)))
104 def b64_md5(cls
, param1
, param2
=None):
105 return cls
.rstr2b64(cls
.rstr_md5(cls
.str2rstr_utf8(param1
, param2
)))
108 def any_md5(cls
, param1
, param2
):
109 return cls
.rstr2any(cls
.rstr_md5(cls
.str2rstr_utf8(param1
)), param2
)
112 def rstr_md5(cls
, param1
):
113 return cls
.binl2rstr(cls
.binl_md5(cls
.rstr2binl(param1
), len(param1
) * 8))
116 def rstr2hex(cls
, param1
):
117 _loc_2
= '0123456789ABCDEF' if cls
.hexcase
else '0123456789abcdef'
119 for _loc_5
in range(0, len(param1
)):
120 _loc_4
= compat_ord(param1
[_loc_5
])
121 _loc_3
+= _loc_2
[_loc_4
>> 4 & 15] + _loc_2
[_loc_4
& 15]
125 def rstr2b64(cls
, param1
):
126 _loc_2
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
129 for _loc_5
in range(0, _loc_4
, 3):
130 _loc_6_1
= compat_ord(param1
[_loc_5
]) << 16
131 _loc_6_2
= compat_ord(param1
[_loc_5
+ 1]) << 8 if _loc_5
+ 1 < _loc_4
else 0
132 _loc_6_3
= compat_ord(param1
[_loc_5
+ 2]) if _loc_5
+ 2 < _loc_4
else 0
133 _loc_6
= _loc_6_1 | _loc_6_2 | _loc_6_3
134 for _loc_7
in range(0, 4):
135 if _loc_5
* 8 + _loc_7
* 6 > len(param1
) * 8:
138 _loc_3
+= _loc_2
[_loc_6
>> 6 * (3 - _loc_7
) & 63]
142 def rstr2any(param1
, param2
):
145 _loc_9
= [0] * ((len(param1
) >> 2) + 1)
146 for _loc_5
in range(0, len(_loc_9
)):
147 _loc_9
[_loc_5
] = compat_ord(param1
[_loc_5
* 2]) << 8 |
compat_ord(param1
[_loc_5
* 2 + 1])
149 while len(_loc_9
) > 0:
152 for _loc_5
in range(0, len(_loc_9
)):
153 _loc_7
= (_loc_7
<< 16) + _loc_9
[_loc_5
]
154 _loc_6
= math
.floor(_loc_7
/ _loc_3
)
155 _loc_7
-= _loc_6
* _loc_3
156 if len(_loc_8
) > 0 or _loc_6
> 0:
157 _loc_8
[len(_loc_8
)] = _loc_6
159 _loc_4
[len(_loc_4
)] = _loc_7
163 _loc_5
= len(_loc_4
) - 1
165 _loc_10
+= param2
[_loc_4
[_loc_5
]]
171 def str2rstr_utf8(cls
, param1
, param2
=None):
176 param1
= param1
+ param2
[1:9]
179 if _loc_4
>= len(param1
):
181 _loc_5
= compat_ord(param1
[_loc_4
])
182 _loc_6
= compat_ord(param1
[_loc_4
+ 1]) if _loc_4
+ 1 < len(param1
) else 0
183 if 55296 <= _loc_5
<= 56319 and 56320 <= _loc_6
<= 57343:
184 _loc_5
= 65536 + ((_loc_5
& 1023) << 10) + (_loc_6
& 1023)
187 _loc_3
+= compat_chr(_loc_5
)
190 _loc_3
+= compat_chr(192 | _loc_5
>> 6 & 31) + compat_chr(128 | _loc_5
& 63)
193 _loc_3
+= compat_chr(224 | _loc_5
>> 12 & 15) + compat_chr(128 | _loc_5
>> 6 & 63) + compat_chr(
196 if _loc_5
<= 2097151:
197 _loc_3
+= compat_chr(240 | _loc_5
>> 18 & 7) + compat_chr(128 | _loc_5
>> 12 & 63) + compat_chr(
198 128 | _loc_5
>> 6 & 63) + compat_chr(128 | _loc_5
& 63)
202 def rstr2binl(param1
):
203 _loc_2
= [0] * ((len(param1
) >> 2) + 1)
204 for _loc_3
in range(0, len(_loc_2
)):
206 for _loc_3
in range(0, len(param1
) * 8, 8):
207 _loc_2
[_loc_3
>> 5] |
= (compat_ord(param1
[_loc_3
// 8]) & 255) << _loc_3
% 32
211 def binl2rstr(param1
):
213 for _loc_3
in range(0, len(param1
) * 32, 8):
214 _loc_2
+= compat_chr(param1
[_loc_3
>> 5] >> _loc_3
% 32 & 255)
218 def binl_md5(cls
, param1
, param2
):
219 param1
= cls
.JSArray(param1
)
220 param1
[param2
>> 5] |
= 128 << param2
% 32
221 param1
[(param2
+ 64 >> 9 << 4) + 14] = param2
226 for _loc_7
in range(0, len(param1
), 16):
231 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 0], 7, -680876936)
232 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 1], 12, -389564586)
233 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 2], 17, 606105819)
234 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 3], 22, -1044525330)
235 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 4], 7, -176418897)
236 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 5], 12, 1200080426)
237 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 6], 17, -1473231341)
238 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 7], 22, -45705983)
239 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 8], 7, 1770035416)
240 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 9], 12, -1958414417)
241 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 10], 17, -42063)
242 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 11], 22, -1990404162)
243 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 12], 7, 1804603682)
244 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 13], 12, -40341101)
245 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 14], 17, -1502002290)
246 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 15], 22, 1236535329)
247 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 1], 5, -165796510)
248 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 6], 9, -1069501632)
249 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 11], 14, 643717713)
250 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 0], 20, -373897302)
251 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 5], 5, -701558691)
252 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 10], 9, 38016083)
253 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 15], 14, -660478335)
254 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 4], 20, -405537848)
255 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 9], 5, 568446438)
256 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 14], 9, -1019803690)
257 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 3], 14, -187363961)
258 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 8], 20, 1163531501)
259 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 13], 5, -1444681467)
260 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 2], 9, -51403784)
261 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 7], 14, 1735328473)
262 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 12], 20, -1926607734)
263 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 5], 4, -378558)
264 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 8], 11, -2022574463)
265 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 11], 16, 1839030562)
266 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 14], 23, -35309556)
267 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 1], 4, -1530992060)
268 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 4], 11, 1272893353)
269 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 7], 16, -155497632)
270 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 10], 23, -1094730640)
271 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 13], 4, 681279174)
272 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 0], 11, -358537222)
273 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 3], 16, -722521979)
274 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 6], 23, 76029189)
275 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 9], 4, -640364487)
276 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 12], 11, -421815835)
277 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 15], 16, 530742520)
278 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 2], 23, -995338651)
279 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 0], 6, -198630844)
280 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 7], 10, 1126891415)
281 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 14], 15, -1416354905)
282 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 5], 21, -57434055)
283 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 12], 6, 1700485571)
284 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 3], 10, -1894986606)
285 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 10], 15, -1051523)
286 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 1], 21, -2054922799)
287 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 8], 6, 1873313359)
288 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 15], 10, -30611744)
289 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 6], 15, -1560198380)
290 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 13], 21, 1309151649)
291 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 4], 6, -145523070)
292 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 11], 10, -1120210379)
293 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 2], 15, 718787259)
294 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 9], 21, -343485551)
295 _loc_3
= cls
.safe_add(_loc_3
, _loc_8
)
296 _loc_4
= cls
.safe_add(_loc_4
, _loc_9
)
297 _loc_5
= cls
.safe_add(_loc_5
, _loc_10
)
298 _loc_6
= cls
.safe_add(_loc_6
, _loc_11
)
299 return [_loc_3
, _loc_4
, _loc_5
, _loc_6
]
302 def md5_cmn(cls
, param1
, param2
, param3
, param4
, param5
, param6
):
304 cls
.bit_rol(cls
.safe_add(cls
.safe_add(param2
, param1
), cls
.safe_add(param4
, param6
)), param5
), param3
)
307 def md5_ff(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
308 return cls
.md5_cmn(param2
& param3 | ~param2
& param4
, param1
, param2
, param5
, param6
, param7
)
311 def md5_gg(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
312 return cls
.md5_cmn(param2
& param4 | param3
& ~param4
, param1
, param2
, param5
, param6
, param7
)
315 def md5_hh(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
316 return cls
.md5_cmn(param2 ^ param3 ^ param4
, param1
, param2
, param5
, param6
, param7
)
319 def md5_ii(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
320 return cls
.md5_cmn(param3 ^
(param2 | ~param4
), param1
, param2
, param5
, param6
, param7
)
323 def safe_add(cls
, param1
, param2
):
324 _loc_3
= (param1
& 65535) + (param2
& 65535)
325 _loc_4
= (param1
>> 16) + (param2
>> 16) + (_loc_3
>> 16)
326 return cls
.lshift(_loc_4
, 16) | _loc_3
& 65535
329 def bit_rol(cls
, param1
, param2
):
330 return cls
.lshift(param1
, param2
) |
(param1
& 0xFFFFFFFF) >> (32 - param2
)
333 def lshift(value
, count
):
334 r
= (0xFFFFFFFF & value
) << count
335 return -(~
(r
- 1) & 0xFFFFFFFF) if r
> 0x7FFFFFFF else r
337 def _real_extract(self
, url
):
338 video_id
= self
._match
_id
(url
)
340 webpage
= self
._download
_webpage
(url
, video_id
)
341 video_id
= self
._search
_regex
(self
._VIDEOID
_REGEXES
, webpage
, 'video id')
343 video
= self
._download
_json
(
344 self
._API
_URL
_TEMPLATE
% video_id
, video_id
)['videos'][0]
346 title
= video
['title']
347 duration
= float_or_none(video
['duration'], 1000)
348 like_count
= video
['likes']
349 uploader
= video
['channel']
350 uploader_id
= video
['channel_id']
354 for resource
in video
['resources']:
355 resource_id
= resource
.get('_id')
359 security
= self
._download
_json
(
360 self
._SECURITY
_URL
_TEMPLATE
% (video_id
, resource_id
),
361 video_id
, 'Downloading security hash for %s' % resource_id
)
363 security_hash
= security
.get('hash')
364 if not security_hash
:
365 message
= security
.get('message')
367 raise ExtractorError(
368 '%s returned error: %s' % (self
.IE_NAME
, message
), expected
=True)
371 hash_code
= security_hash
[:2]
372 received_time
= int(security_hash
[2:12])
373 received_random
= security_hash
[12:22]
374 received_md5
= security_hash
[22:]
376 sign_time
= received_time
+ self
._RESIGN
_EXPIRATION
377 padding
= '%010d' % random
.randint(1, 10000000000)
379 signed_md5
= self
.MD5
.b64_md5(received_md5
+ compat_str(sign_time
) + padding
)
380 signed_hash
= hash_code
+ compat_str(received_time
) + received_random
+ compat_str(sign_time
) + padding
+ signed_md5
383 'url': '%s?h=%s&k=%s' % (resource
['url'], signed_hash
, 'flash'),
384 'format_id': resource_id
,
385 'height': resource
['height']
388 self
._sort
_formats
(formats
)
393 'duration': duration
,
394 'uploader': uploader
,
395 'uploader_id': uploader_id
,
396 'like_count': like_count
,