2 from __future__
import unicode_literals
7 from .common
import InfoExtractor
21 class GloboIE(InfoExtractor
):
22 _VALID_URL
= '(?:globo:|https?://.+?\.globo\.com/(?:[^/]+/)*(?:v/(?:[^/]+/)?|videos/))(?P<id>\d{7,})'
24 _API_URL_TEMPLATE
= 'http://api.globovideos.com/videos/%s/playlist'
25 _SECURITY_URL_TEMPLATE
= 'http://security.video.globo.com/videos/%s/hash?player=flash&version=17.0.0.132&resource_id=%s'
27 _RESIGN_EXPIRATION
= 86400
30 'url': 'http://g1.globo.com/carros/autoesporte/videos/t/exclusivos-do-g1/v/mercedes-benz-gla-passa-por-teste-de-colisao-na-europa/3607726/',
31 'md5': 'b3ccc801f75cd04a914d51dadb83a78d',
35 'title': 'Mercedes-Benz GLA passa por teste de colisão na Europa',
37 'uploader': 'Globo.com',
41 'url': 'http://globoplay.globo.com/v/4581987/',
42 'md5': 'f36a1ecd6a50da1577eee6dd17f67eff',
46 'title': 'Acidentes de trânsito estão entre as maiores causas de queda de energia em SP',
48 'uploader': 'Rede Globo',
52 'url': 'http://canalbrasil.globo.com/programas/sangue-latino/videos/3928201.html',
53 'only_matching': True,
55 'url': 'http://globosatplay.globo.com/globonews/v/4472924/',
56 'only_matching': True,
58 'url': 'http://globotv.globo.com/t/programa/v/clipe-sexo-e-as-negas-adeus/3836166/',
59 'only_matching': True,
61 '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/',
62 'only_matching': True,
64 'url': 'http://canaloff.globo.com/programas/desejar-profundo/videos/4518560.html',
65 'only_matching': True,
69 HEX_FORMAT_LOWERCASE
= 0
70 HEX_FORMAT_UPPERCASE
= 1
71 BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE
= ''
72 BASE64_PAD_CHARACTER_RFC_COMPLIANCE
= '='
81 def __getitem__(self
, y
):
83 return list.__getitem
__(self
, y
)
87 def __setitem__(self
, i
, y
):
89 return list.__setitem
__(self
, i
, y
)
91 self
.extend([0] * (i
- len(self
) + 1))
95 def hex_md5(cls
, param1
):
96 return cls
.rstr2hex(cls
.rstr_md5(cls
.str2rstr_utf8(param1
)))
99 def b64_md5(cls
, param1
, param2
=None):
100 return cls
.rstr2b64(cls
.rstr_md5(cls
.str2rstr_utf8(param1
, param2
)))
103 def any_md5(cls
, param1
, param2
):
104 return cls
.rstr2any(cls
.rstr_md5(cls
.str2rstr_utf8(param1
)), param2
)
107 def rstr_md5(cls
, param1
):
108 return cls
.binl2rstr(cls
.binl_md5(cls
.rstr2binl(param1
), len(param1
) * 8))
111 def rstr2hex(cls
, param1
):
112 _loc_2
= '0123456789ABCDEF' if cls
.hexcase
else '0123456789abcdef'
114 for _loc_5
in range(0, len(param1
)):
115 _loc_4
= compat_ord(param1
[_loc_5
])
116 _loc_3
+= _loc_2
[_loc_4
>> 4 & 15] + _loc_2
[_loc_4
& 15]
120 def rstr2b64(cls
, param1
):
121 _loc_2
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
124 for _loc_5
in range(0, _loc_4
, 3):
125 _loc_6_1
= compat_ord(param1
[_loc_5
]) << 16
126 _loc_6_2
= compat_ord(param1
[_loc_5
+ 1]) << 8 if _loc_5
+ 1 < _loc_4
else 0
127 _loc_6_3
= compat_ord(param1
[_loc_5
+ 2]) if _loc_5
+ 2 < _loc_4
else 0
128 _loc_6
= _loc_6_1 | _loc_6_2 | _loc_6_3
129 for _loc_7
in range(0, 4):
130 if _loc_5
* 8 + _loc_7
* 6 > len(param1
) * 8:
133 _loc_3
+= _loc_2
[_loc_6
>> 6 * (3 - _loc_7
) & 63]
137 def rstr2any(param1
, param2
):
140 _loc_9
= [0] * ((len(param1
) >> 2) + 1)
141 for _loc_5
in range(0, len(_loc_9
)):
142 _loc_9
[_loc_5
] = compat_ord(param1
[_loc_5
* 2]) << 8 |
compat_ord(param1
[_loc_5
* 2 + 1])
144 while len(_loc_9
) > 0:
147 for _loc_5
in range(0, len(_loc_9
)):
148 _loc_7
= (_loc_7
<< 16) + _loc_9
[_loc_5
]
149 _loc_6
= math
.floor(_loc_7
/ _loc_3
)
150 _loc_7
-= _loc_6
* _loc_3
151 if len(_loc_8
) > 0 or _loc_6
> 0:
152 _loc_8
[len(_loc_8
)] = _loc_6
154 _loc_4
[len(_loc_4
)] = _loc_7
158 _loc_5
= len(_loc_4
) - 1
160 _loc_10
+= param2
[_loc_4
[_loc_5
]]
166 def str2rstr_utf8(cls
, param1
, param2
=None):
171 param1
= param1
+ param2
[1:9]
174 if _loc_4
>= len(param1
):
176 _loc_5
= compat_ord(param1
[_loc_4
])
177 _loc_6
= compat_ord(param1
[_loc_4
+ 1]) if _loc_4
+ 1 < len(param1
) else 0
178 if 55296 <= _loc_5
<= 56319 and 56320 <= _loc_6
<= 57343:
179 _loc_5
= 65536 + ((_loc_5
& 1023) << 10) + (_loc_6
& 1023)
182 _loc_3
+= compat_chr(_loc_5
)
185 _loc_3
+= compat_chr(192 | _loc_5
>> 6 & 31) + compat_chr(128 | _loc_5
& 63)
188 _loc_3
+= compat_chr(224 | _loc_5
>> 12 & 15) + compat_chr(128 | _loc_5
>> 6 & 63) + compat_chr(
191 if _loc_5
<= 2097151:
192 _loc_3
+= compat_chr(240 | _loc_5
>> 18 & 7) + compat_chr(128 | _loc_5
>> 12 & 63) + compat_chr(
193 128 | _loc_5
>> 6 & 63) + compat_chr(128 | _loc_5
& 63)
197 def rstr2binl(param1
):
198 _loc_2
= [0] * ((len(param1
) >> 2) + 1)
199 for _loc_3
in range(0, len(_loc_2
)):
201 for _loc_3
in range(0, len(param1
) * 8, 8):
202 _loc_2
[_loc_3
>> 5] |
= (compat_ord(param1
[_loc_3
// 8]) & 255) << _loc_3
% 32
206 def binl2rstr(param1
):
208 for _loc_3
in range(0, len(param1
) * 32, 8):
209 _loc_2
+= compat_chr(param1
[_loc_3
>> 5] >> _loc_3
% 32 & 255)
213 def binl_md5(cls
, param1
, param2
):
214 param1
= cls
.JSArray(param1
)
215 param1
[param2
>> 5] |
= 128 << param2
% 32
216 param1
[(param2
+ 64 >> 9 << 4) + 14] = param2
221 for _loc_7
in range(0, len(param1
), 16):
226 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 0], 7, -680876936)
227 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 1], 12, -389564586)
228 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 2], 17, 606105819)
229 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 3], 22, -1044525330)
230 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 4], 7, -176418897)
231 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 5], 12, 1200080426)
232 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 6], 17, -1473231341)
233 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 7], 22, -45705983)
234 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 8], 7, 1770035416)
235 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 9], 12, -1958414417)
236 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 10], 17, -42063)
237 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 11], 22, -1990404162)
238 _loc_3
= cls
.md5_ff(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 12], 7, 1804603682)
239 _loc_6
= cls
.md5_ff(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 13], 12, -40341101)
240 _loc_5
= cls
.md5_ff(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 14], 17, -1502002290)
241 _loc_4
= cls
.md5_ff(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 15], 22, 1236535329)
242 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 1], 5, -165796510)
243 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 6], 9, -1069501632)
244 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 11], 14, 643717713)
245 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 0], 20, -373897302)
246 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 5], 5, -701558691)
247 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 10], 9, 38016083)
248 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 15], 14, -660478335)
249 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 4], 20, -405537848)
250 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 9], 5, 568446438)
251 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 14], 9, -1019803690)
252 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 3], 14, -187363961)
253 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 8], 20, 1163531501)
254 _loc_3
= cls
.md5_gg(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 13], 5, -1444681467)
255 _loc_6
= cls
.md5_gg(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 2], 9, -51403784)
256 _loc_5
= cls
.md5_gg(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 7], 14, 1735328473)
257 _loc_4
= cls
.md5_gg(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 12], 20, -1926607734)
258 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 5], 4, -378558)
259 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 8], 11, -2022574463)
260 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 11], 16, 1839030562)
261 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 14], 23, -35309556)
262 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 1], 4, -1530992060)
263 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 4], 11, 1272893353)
264 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 7], 16, -155497632)
265 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 10], 23, -1094730640)
266 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 13], 4, 681279174)
267 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 0], 11, -358537222)
268 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 3], 16, -722521979)
269 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 6], 23, 76029189)
270 _loc_3
= cls
.md5_hh(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 9], 4, -640364487)
271 _loc_6
= cls
.md5_hh(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 12], 11, -421815835)
272 _loc_5
= cls
.md5_hh(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 15], 16, 530742520)
273 _loc_4
= cls
.md5_hh(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 2], 23, -995338651)
274 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 0], 6, -198630844)
275 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 7], 10, 1126891415)
276 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 14], 15, -1416354905)
277 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 5], 21, -57434055)
278 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 12], 6, 1700485571)
279 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 3], 10, -1894986606)
280 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 10], 15, -1051523)
281 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 1], 21, -2054922799)
282 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 8], 6, 1873313359)
283 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 15], 10, -30611744)
284 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 6], 15, -1560198380)
285 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 13], 21, 1309151649)
286 _loc_3
= cls
.md5_ii(_loc_3
, _loc_4
, _loc_5
, _loc_6
, param1
[_loc_7
+ 4], 6, -145523070)
287 _loc_6
= cls
.md5_ii(_loc_6
, _loc_3
, _loc_4
, _loc_5
, param1
[_loc_7
+ 11], 10, -1120210379)
288 _loc_5
= cls
.md5_ii(_loc_5
, _loc_6
, _loc_3
, _loc_4
, param1
[_loc_7
+ 2], 15, 718787259)
289 _loc_4
= cls
.md5_ii(_loc_4
, _loc_5
, _loc_6
, _loc_3
, param1
[_loc_7
+ 9], 21, -343485551)
290 _loc_3
= cls
.safe_add(_loc_3
, _loc_8
)
291 _loc_4
= cls
.safe_add(_loc_4
, _loc_9
)
292 _loc_5
= cls
.safe_add(_loc_5
, _loc_10
)
293 _loc_6
= cls
.safe_add(_loc_6
, _loc_11
)
294 return [_loc_3
, _loc_4
, _loc_5
, _loc_6
]
297 def md5_cmn(cls
, param1
, param2
, param3
, param4
, param5
, param6
):
299 cls
.bit_rol(cls
.safe_add(cls
.safe_add(param2
, param1
), cls
.safe_add(param4
, param6
)), param5
), param3
)
302 def md5_ff(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
303 return cls
.md5_cmn(param2
& param3 | ~param2
& param4
, param1
, param2
, param5
, param6
, param7
)
306 def md5_gg(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
307 return cls
.md5_cmn(param2
& param4 | param3
& ~param4
, param1
, param2
, param5
, param6
, param7
)
310 def md5_hh(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
311 return cls
.md5_cmn(param2 ^ param3 ^ param4
, param1
, param2
, param5
, param6
, param7
)
314 def md5_ii(cls
, param1
, param2
, param3
, param4
, param5
, param6
, param7
):
315 return cls
.md5_cmn(param3 ^
(param2 | ~param4
), param1
, param2
, param5
, param6
, param7
)
318 def safe_add(cls
, param1
, param2
):
319 _loc_3
= (param1
& 65535) + (param2
& 65535)
320 _loc_4
= (param1
>> 16) + (param2
>> 16) + (_loc_3
>> 16)
321 return cls
.lshift(_loc_4
, 16) | _loc_3
& 65535
324 def bit_rol(cls
, param1
, param2
):
325 return cls
.lshift(param1
, param2
) |
(param1
& 0xFFFFFFFF) >> (32 - param2
)
328 def lshift(value
, count
):
329 r
= (0xFFFFFFFF & value
) << count
330 return -(~
(r
- 1) & 0xFFFFFFFF) if r
> 0x7FFFFFFF else r
332 def _real_extract(self
, url
):
333 video_id
= self
._match
_id
(url
)
335 video
= self
._download
_json
(
336 self
._API
_URL
_TEMPLATE
% video_id
, video_id
)['videos'][0]
338 title
= video
['title']
341 for resource
in video
['resources']:
342 resource_id
= resource
.get('_id')
343 if not resource_id
or resource_id
.endswith('manifest'):
346 security
= self
._download
_json
(
347 self
._SECURITY
_URL
_TEMPLATE
% (video_id
, resource_id
),
348 video_id
, 'Downloading security hash for %s' % resource_id
)
350 security_hash
= security
.get('hash')
351 if not security_hash
:
352 message
= security
.get('message')
354 raise ExtractorError(
355 '%s returned error: %s' % (self
.IE_NAME
, message
), expected
=True)
358 hash_code
= security_hash
[:2]
359 received_time
= int(security_hash
[2:12])
360 received_random
= security_hash
[12:22]
361 received_md5
= security_hash
[22:]
363 sign_time
= received_time
+ self
._RESIGN
_EXPIRATION
364 padding
= '%010d' % random
.randint(1, 10000000000)
366 signed_md5
= self
.MD5
.b64_md5(received_md5
+ compat_str(sign_time
) + padding
)
367 signed_hash
= hash_code
+ compat_str(received_time
) + received_random
+ compat_str(sign_time
) + padding
+ signed_md5
369 resource_url
= resource
['url']
370 signed_url
= '%s?h=%s&k=%s' % (resource_url
, signed_hash
, 'flash')
371 if resource_id
.endswith('m3u8') or resource_url
.endswith('.m3u8'):
372 m3u8_formats
= self
._extract
_m
3u8_formats
(
373 signed_url
, resource_id
, 'mp4', entry_protocol
='m3u8_native',
374 m3u8_id
='hls', fatal
=False)
376 formats
.extend(m3u8_formats
)
380 'format_id': 'http-%s' % resource_id
,
381 'height': int_or_none(resource
.get('height')),
384 self
._sort
_formats
(formats
)
386 duration
= float_or_none(video
.get('duration'), 1000)
387 uploader
= video
.get('channel')
388 uploader_id
= str_or_none(video
.get('channel_id'))
393 'duration': duration
,
394 'uploader': uploader
,
395 'uploader_id': uploader_id
,
400 class GloboArticleIE(InfoExtractor
):
401 _VALID_URL
= 'https?://.+?\.globo\.com/(?:[^/]+/)*(?P<id>[^/]+)\.html'
404 r
'\bdata-video-id=["\'](\d
{7,})',
405 r'\bdata
-player
-videosids
=["\'](\d{7,})',
406 r'\bvideosIDs\s*:\s*["\'](\d
{7,})',
407 r'\bdata
-id=["\'](\d{7,})',
408 r'<div[^>]+\bid=["\'](\d
{7,})',
412 'url
': 'http
://g1
.globo
.com
/jornal
-nacional
/noticia
/2014/09/novidade
-na
-fiscalizacao
-de
-bagagem
-pela
-receita
-provoca
-discussoes
.html
',
413 'md5
': '307fdeae4390ccfe6ba1aa198cf6e72b
',
417 'title
': 'Receita Federal explica como vai fiscalizar bagagens de quem retorna ao Brasil de avião
',
419 'uploader
': 'Rede Globo
',
420 'uploader_id
': '196',
423 'url
': 'http
://gq
.globo
.com
/Prazeres
/Poder
/noticia
/2015/10/all
-o
-desafio
-assista
-ao
-segundo
-capitulo
-da
-serie
.html
',
424 'only_matching
': True,
426 '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
',
427 'only_matching
': True,
431 def suitable(cls, url):
432 return False if GloboIE.suitable(url) else super(GloboArticleIE, cls).suitable(url)
434 def _real_extract(self, url):
435 display_id = self._match_id(url)
436 webpage = self._download_webpage(url, display_id)
437 video_id = self._search_regex(self._VIDEOID_REGEXES, webpage, 'video
id')
438 return self.url_result('globo
:%s' % video_id, 'Globo
')