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)