2 from __future__
import unicode_literals
8 from .common
import InfoExtractor
23 class GloboIE(InfoExtractor
):
24 _VALID_URL
= r
'(?:globo:|https?://.+?\.globo\.com/(?:[^/]+/)*(?:v/(?:[^/]+/)?|videos/))(?P<id>\d{7,})'
26 _API_URL_TEMPLATE
= 'http://api.globovideos.com/videos/%s/playlist'
27 _SECURITY_URL_TEMPLATE
= 'http://security.video.globo.com/videos/%s/hash?player=flash&version=17.0.0.132&resource_id=%s'
29 _RESIGN_EXPIRATION
= 86400
32 'url': 'http://g1.globo.com/carros/autoesporte/videos/t/exclusivos-do-g1/v/mercedes-benz-gla-passa-por-teste-de-colisao-na-europa/3607726/',
33 'md5': 'b3ccc801f75cd04a914d51dadb83a78d',
37 'title': 'Mercedes-Benz GLA passa por teste de colisão na Europa',
39 'uploader': 'Globo.com',
43 'url': 'http://globoplay.globo.com/v/4581987/',
44 'md5': 'f36a1ecd6a50da1577eee6dd17f67eff',
48 'title': 'Acidentes de trânsito estão entre as maiores causas de queda de energia em SP',
50 'uploader': 'Rede Globo',
54 'url': 'http://canalbrasil.globo.com/programas/sangue-latino/videos/3928201.html',
55 'only_matching': True,
57 'url': 'http://globosatplay.globo.com/globonews/v/4472924/',
58 'only_matching': True,
60 'url': 'http://globotv.globo.com/t/programa/v/clipe-sexo-e-as-negas-adeus/3836166/',
61 'only_matching': True,
63 'url': 'http://globotv.globo.com/canal-brasil/sangue-latino/t/todos-os-videos/v/ator-e-diretor-argentino-ricado-darin-fala-sobre-utopias-e-suas-perdas/3928201/',
64 'only_matching': True,
66 'url': 'http://canaloff.globo.com/programas/desejar-profundo/videos/4518560.html',
67 'only_matching': True,
69 'url': 'globo:3607726',
70 'only_matching': True,
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 video
= self
._download
_json
(
341 self
._API
_URL
_TEMPLATE
% video_id
, video_id
)['videos'][0]
343 title
= video
['title']
346 for resource
in video
['resources']:
347 resource_id
= resource
.get('_id')
348 if not resource_id
or resource_id
.endswith('manifest'):
351 security
= self
._download
_json
(
352 self
._SECURITY
_URL
_TEMPLATE
% (video_id
, resource_id
),
353 video_id
, 'Downloading security hash for %s' % resource_id
)
355 security_hash
= security
.get('hash')
356 if not security_hash
:
357 message
= security
.get('message')
359 raise ExtractorError(
360 '%s returned error: %s' % (self
.IE_NAME
, message
), expected
=True)
363 hash_code
= security_hash
[:2]
364 received_time
= int(security_hash
[2:12])
365 received_random
= security_hash
[12:22]
366 received_md5
= security_hash
[22:]
368 sign_time
= received_time
+ self
._RESIGN
_EXPIRATION
369 padding
= '%010d' % random
.randint(1, 10000000000)
371 signed_md5
= self
.MD5
.b64_md5(received_md5
+ compat_str(sign_time
) + padding
)
372 signed_hash
= hash_code
+ compat_str(received_time
) + received_random
+ compat_str(sign_time
) + padding
+ signed_md5
374 resource_url
= resource
['url']
375 signed_url
= '%s?h=%s&k=%s' % (resource_url
, signed_hash
, 'flash')
376 if resource_id
.endswith('m3u8') or resource_url
.endswith('.m3u8'):
377 formats
.extend(self
._extract
_m
3u8_formats
(
378 signed_url
, resource_id
, 'mp4', entry_protocol
='m3u8_native',
379 m3u8_id
='hls', fatal
=False))
383 'format_id': 'http-%s' % resource_id
,
384 'height': int_or_none(resource
.get('height')),
387 self
._sort
_formats
(formats
)
389 duration
= float_or_none(video
.get('duration'), 1000)
390 uploader
= video
.get('channel')
391 uploader_id
= str_or_none(video
.get('channel_id'))
396 'duration': duration
,
397 'uploader': uploader
,
398 'uploader_id': uploader_id
,
403 class GloboArticleIE(InfoExtractor
):
404 _VALID_URL
= r
'https?://.+?\.globo\.com/(?:[^/]+/)*(?P<id>[^/.]+)(?:\.html)?'
407 r
'\bdata-video-id=["\'](\d
{7,})',
408 r'\bdata
-player
-videosids
=["\'](\d{7,})',
409 r'\bvideosIDs\s*:\s*["\']?
(\d
{7,})',
410 r'\bdata
-id=["\'](\d{7,})',
411 r'<div[^>]+\bid=["\'](\d
{7,})',
415 'url
': 'http
://g1
.globo
.com
/jornal
-nacional
/noticia
/2014/09/novidade
-na
-fiscalizacao
-de
-bagagem
-pela
-receita
-provoca
-discussoes
.html
',
417 'id': 'novidade
-na
-fiscalizacao
-de
-bagagem
-pela
-receita
-provoca
-discussoes
',
418 'title
': 'Novidade na fiscalização de bagagem pela Receita provoca discussões
',
419 'description
': 'md5
:c3c4b4d4c30c32fce460040b1ac46b12
',
423 'url
': 'http
://g1
.globo
.com
/pr
/parana
/noticia
/2016/09/mpf
-denuncia
-lula
-marisa
-e
-mais
-seis
-na
-operacao
-lava
-jato
.html
',
425 'id': 'mpf
-denuncia
-lula
-marisa
-e
-mais
-seis
-na
-operacao
-lava
-jato
',
426 'title
': "Lula era o 'comandante máximo
' do esquema da Lava Jato, diz MPF",
427 'description
': 'md5
:8aa7cc8beda4dc71cc8553e00b77c54c
',
431 'url
': 'http
://gq
.globo
.com
/Prazeres
/Poder
/noticia
/2015/10/all
-o
-desafio
-assista
-ao
-segundo
-capitulo
-da
-serie
.html
',
432 'only_matching
': True,
434 'url
': 'http
://gshow
.globo
.com
/programas
/tv
-xuxa
/O
-Programa
/noticia
/2014/01/xuxa
-e
-junno
-namoram
-muuuito
-em
-luau
-de
-zeze
-di
-camargo
-e
-luciano
.html
',
435 'only_matching
': True,
437 'url
': 'http
://oglobo
.globo
.com
/rio
/a
-amizade
-entre
-um
-entregador
-de
-farmacia
-um
-piano
-19946271',
438 'only_matching
': True,
442 def suitable(cls, url):
443 return False if GloboIE.suitable(url) else super(GloboArticleIE, cls).suitable(url)
445 def _real_extract(self, url):
446 display_id = self._match_id(url)
447 webpage = self._download_webpage(url, display_id)
449 for video_regex in self._VIDEOID_REGEXES:
450 video_ids.extend(re.findall(video_regex, webpage))
452 self.url_result('globo
:%s' % video_id, GloboIE.ie_key())
453 for video_id in orderedSet(video_ids)]
454 title = self._og_search_title(webpage, fatal=False)
455 description = self._html_search_meta('description
', webpage)
456 return self.playlist_result(entries, display_id, title, description)