]> jfr.im git - yt-dlp.git/blame - youtube_dl/extractor/openload.py
Fix W504 and disable W503 (closes #20863)
[yt-dlp.git] / youtube_dl / extractor / openload.py
CommitLineData
2bfeee69 1# coding: utf-8
6c20a0bb 2from __future__ import unicode_literals
95ad9ce5 3
4c54b89e
S
4import json
5import os
7fc3b68a 6import random
17f8deeb 7import re
4c54b89e
S
8import subprocess
9import tempfile
17f8deeb 10
2bfeee69 11from .common import InfoExtractor
011da618
S
12from ..compat import (
13 compat_urlparse,
14 compat_kwargs,
15)
9e3c2f1d 16from ..utils import (
4c54b89e 17 check_executable,
594b0c4c 18 determine_ext,
4c54b89e 19 encodeArgument,
9e3c2f1d 20 ExtractorError,
da57ebaf 21 get_element_by_id,
4c54b89e
S
22 get_exe_version,
23 is_outdated_version,
24 std_headers,
9e3c2f1d 25)
2bfeee69
YCH
26
27
4c54b89e
S
28def cookie_to_dict(cookie):
29 cookie_dict = {
30 'name': cookie.name,
31 'value': cookie.value,
32 }
33 if cookie.port_specified:
34 cookie_dict['port'] = cookie.port
35 if cookie.domain_specified:
36 cookie_dict['domain'] = cookie.domain
37 if cookie.path_specified:
38 cookie_dict['path'] = cookie.path
39 if cookie.expires is not None:
40 cookie_dict['expires'] = cookie.expires
41 if cookie.secure is not None:
42 cookie_dict['secure'] = cookie.secure
43 if cookie.discard is not None:
44 cookie_dict['discard'] = cookie.discard
45 try:
3089bc74
S
46 if (cookie.has_nonstandard_attr('httpOnly')
47 or cookie.has_nonstandard_attr('httponly')
48 or cookie.has_nonstandard_attr('HttpOnly')):
4c54b89e
S
49 cookie_dict['httponly'] = True
50 except TypeError:
51 pass
52 return cookie_dict
53
54
55def cookie_jar_to_list(cookie_jar):
56 return [cookie_to_dict(cookie) for cookie in cookie_jar]
57
58
59class PhantomJSwrapper(object):
60 """PhantomJS wrapper class
61
62 This class is experimental.
63 """
64
65 _TEMPLATE = r'''
66 phantom.onError = function(msg, trace) {{
67 var msgStack = ['PHANTOM ERROR: ' + msg];
68 if(trace && trace.length) {{
69 msgStack.push('TRACE:');
70 trace.forEach(function(t) {{
71 msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line
72 + (t.function ? ' (in function ' + t.function +')' : ''));
73 }});
74 }}
75 console.error(msgStack.join('\n'));
76 phantom.exit(1);
77 }};
78 var page = require('webpage').create();
79 var fs = require('fs');
80 var read = {{ mode: 'r', charset: 'utf-8' }};
81 var write = {{ mode: 'w', charset: 'utf-8' }};
82 JSON.parse(fs.read("{cookies}", read)).forEach(function(x) {{
83 phantom.addCookie(x);
84 }});
85 page.settings.resourceTimeout = {timeout};
86 page.settings.userAgent = "{ua}";
87 page.onLoadStarted = function() {{
88 page.evaluate(function() {{
89 delete window._phantom;
90 delete window.callPhantom;
91 }});
92 }};
93 var saveAndExit = function() {{
94 fs.write("{html}", page.content, write);
95 fs.write("{cookies}", JSON.stringify(phantom.cookies), write);
96 phantom.exit();
97 }};
98 page.onLoadFinished = function(status) {{
99 if(page.url === "") {{
100 page.setContent(fs.read("{html}", read), "{url}");
101 }}
102 else {{
103 {jscode}
104 }}
105 }};
106 page.open("");
107 '''
108
109 _TMP_FILE_NAMES = ['script', 'html', 'cookies']
110
111 @staticmethod
112 def _version():
113 return get_exe_version('phantomjs', version_re=r'([0-9.]+)')
114
115 def __init__(self, extractor, required_version=None, timeout=10000):
a7541958
YCH
116 self._TMP_FILES = {}
117
4c54b89e
S
118 self.exe = check_executable('phantomjs', ['-v'])
119 if not self.exe:
120 raise ExtractorError('PhantomJS executable not found in PATH, '
121 'download it from http://phantomjs.org',
122 expected=True)
123
124 self.extractor = extractor
125
126 if required_version:
127 version = self._version()
128 if is_outdated_version(version, required_version):
129 self.extractor._downloader.report_warning(
130 'Your copy of PhantomJS is outdated, update it to version '
131 '%s or newer if you encounter any errors.' % required_version)
132
133 self.options = {
134 'timeout': timeout,
135 }
4c54b89e
S
136 for name in self._TMP_FILE_NAMES:
137 tmp = tempfile.NamedTemporaryFile(delete=False)
138 tmp.close()
139 self._TMP_FILES[name] = tmp
140
141 def __del__(self):
142 for name in self._TMP_FILE_NAMES:
143 try:
144 os.remove(self._TMP_FILES[name].name)
a7541958 145 except (IOError, OSError, KeyError):
4c54b89e
S
146 pass
147
148 def _save_cookies(self, url):
149 cookies = cookie_jar_to_list(self.extractor._downloader.cookiejar)
150 for cookie in cookies:
151 if 'path' not in cookie:
152 cookie['path'] = '/'
153 if 'domain' not in cookie:
154 cookie['domain'] = compat_urlparse.urlparse(url).netloc
155 with open(self._TMP_FILES['cookies'].name, 'wb') as f:
156 f.write(json.dumps(cookies).encode('utf-8'))
157
158 def _load_cookies(self):
159 with open(self._TMP_FILES['cookies'].name, 'rb') as f:
160 cookies = json.loads(f.read().decode('utf-8'))
161 for cookie in cookies:
162 if cookie['httponly'] is True:
163 cookie['rest'] = {'httpOnly': None}
164 if 'expiry' in cookie:
165 cookie['expire_time'] = cookie['expiry']
011da618 166 self.extractor._set_cookie(**compat_kwargs(cookie))
4c54b89e
S
167
168 def get(self, url, html=None, video_id=None, note=None, note2='Executing JS on webpage', headers={}, jscode='saveAndExit();'):
169 """
170 Downloads webpage (if needed) and executes JS
171
172 Params:
173 url: website url
174 html: optional, html code of website
175 video_id: video id
176 note: optional, displayed when downloading webpage
177 note2: optional, displayed when executing JS
178 headers: custom http headers
179 jscode: code to be executed when page is loaded
180
181 Returns tuple with:
182 * downloaded website (after JS execution)
183 * anything you print with `console.log` (but not inside `page.execute`!)
184
185 In most cases you don't need to add any `jscode`.
186 It is executed in `page.onLoadFinished`.
187 `saveAndExit();` is mandatory, use it instead of `phantom.exit()`
188 It is possible to wait for some element on the webpage, for example:
189 var check = function() {
190 var elementFound = page.evaluate(function() {
191 return document.querySelector('#b.done') !== null;
192 });
193 if(elementFound)
194 saveAndExit();
195 else
196 window.setTimeout(check, 500);
197 }
198
199 page.evaluate(function(){
200 document.querySelector('#a').click();
201 });
202 check();
203 """
204 if 'saveAndExit();' not in jscode:
205 raise ExtractorError('`saveAndExit();` not found in `jscode`')
206 if not html:
207 html = self.extractor._download_webpage(url, video_id, note=note, headers=headers)
208 with open(self._TMP_FILES['html'].name, 'wb') as f:
209 f.write(html.encode('utf-8'))
210
211 self._save_cookies(url)
212
213 replaces = self.options
214 replaces['url'] = url
215 user_agent = headers.get('User-Agent') or std_headers['User-Agent']
216 replaces['ua'] = user_agent.replace('"', '\\"')
217 replaces['jscode'] = jscode
218
219 for x in self._TMP_FILE_NAMES:
220 replaces[x] = self._TMP_FILES[x].name.replace('\\', '\\\\').replace('"', '\\"')
221
222 with open(self._TMP_FILES['script'].name, 'wb') as f:
223 f.write(self._TEMPLATE.format(**replaces).encode('utf-8'))
224
225 if video_id is None:
226 self.extractor.to_screen('%s' % (note2,))
227 else:
228 self.extractor.to_screen('%s: %s' % (video_id, note2))
229
230 p = subprocess.Popen([
231 self.exe, '--ssl-protocol=any',
232 self._TMP_FILES['script'].name
233 ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
234 out, err = p.communicate()
235 if p.returncode != 0:
236 raise ExtractorError(
237 'Executing JS failed\n:' + encodeArgument(err))
238 with open(self._TMP_FILES['html'].name, 'rb') as f:
239 html = f.read().decode('utf-8')
240
241 self._load_cookies()
242
243 return (html, encodeArgument(out))
244
245
2bfeee69 246class OpenloadIE(InfoExtractor):
9abeefd5 247 _DOMAINS = r'(?:openload\.(?:co|io|link|pw)|oload\.(?:tv|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|pw|live|space|services)|oladblock\.(?:services|xyz|me)|openloed\.co)'
d0058c76
S
248 _VALID_URL = r'''(?x)
249 https?://
250 (?P<host>
251 (?:www\.)?
04988b55 252 %s
d0058c76
S
253 )/
254 (?:f|embed)/
255 (?P<id>[a-zA-Z0-9-_]+)
04988b55 256 ''' % _DOMAINS
4eec1127 257 _EMBED_WORD = 'embed'
258 _STREAM_WORD = 'f'
259 _REDIR_WORD = 'stream'
260 _URL_IDS = ('streamurl', 'streamuri', 'streamurj')
9e3c2f1d 261 _TESTS = [{
2bfeee69
YCH
262 'url': 'https://openload.co/f/kUEfGclsU9o',
263 'md5': 'bf1c059b004ebc7a256f89408e65c36e',
264 'info_dict': {
265 'id': 'kUEfGclsU9o',
266 'ext': 'mp4',
267 'title': 'skyrim_no-audio_1080.mp4',
ec85ded8 268 'thumbnail': r're:^https?://.*\.jpg$',
2bfeee69 269 },
0711995b
YCH
270 }, {
271 'url': 'https://openload.co/embed/rjC09fkPLYs',
272 'info_dict': {
273 'id': 'rjC09fkPLYs',
274 'ext': 'mp4',
275 'title': 'movie.mp4',
ec85ded8 276 'thumbnail': r're:^https?://.*\.jpg$',
0711995b
YCH
277 'subtitles': {
278 'en': [{
279 'ext': 'vtt',
280 }],
281 },
282 },
283 'params': {
284 'skip_download': True, # test subtitles only
285 },
9e3c2f1d
YCH
286 }, {
287 'url': 'https://openload.co/embed/kUEfGclsU9o/skyrim_no-audio_1080.mp4',
288 'only_matching': True,
289 }, {
290 'url': 'https://openload.io/f/ZAn6oz-VZGE/',
291 'only_matching': True,
21efee5f
N
292 }, {
293 'url': 'https://openload.co/f/_-ztPaZtMhM/',
294 'only_matching': True,
e9063b5d
S
295 }, {
296 # unavailable via https://openload.co/f/Sxz5sADo82g/, different layout
297 # for title and ext
298 'url': 'https://openload.co/embed/Sxz5sADo82g/',
299 'only_matching': True,
d2c5b5a9
S
300 }, {
301 # unavailable via https://openload.co/embed/e-Ixz9ZR5L0/ but available
302 # via https://openload.co/f/e-Ixz9ZR5L0/
303 'url': 'https://openload.co/f/e-Ixz9ZR5L0/',
304 'only_matching': True,
5c32a5be
YCH
305 }, {
306 'url': 'https://oload.tv/embed/KnG-kKZdcfY/',
307 'only_matching': True,
9ef909f2 308 }, {
309 'url': 'http://www.openload.link/f/KnG-kKZdcfY',
310 'only_matching': True,
273c23d9
S
311 }, {
312 'url': 'https://oload.stream/f/KnG-kKZdcfY',
313 'only_matching': True,
e944737c
S
314 }, {
315 'url': 'https://oload.xyz/f/WwRBpzW8Wtk',
316 'only_matching': True,
0bfdcc14
D
317 }, {
318 'url': 'https://oload.win/f/kUEfGclsU9o',
319 'only_matching': True,
320 }, {
321 'url': 'https://oload.download/f/kUEfGclsU9o',
322 'only_matching': True,
9795d933
E
323 }, {
324 'url': 'https://oload.cloud/f/4ZDnBXRWiB8',
325 'only_matching': True,
85750f89
E
326 }, {
327 # Its title has not got its extension but url has it
328 'url': 'https://oload.download/f/N4Otkw39VCw/Tomb.Raider.2018.HDRip.XviD.AC3-EVO.avi.mp4',
329 'only_matching': True,
5d90a8a5 330 }, {
331 'url': 'https://oload.cc/embed/5NEAbI2BDSk',
332 'only_matching': True,
c901cc38 333 }, {
334 'url': 'https://oload.icu/f/-_i4y_F_Hs8',
061ea3a7 335 'only_matching': True,
336 }, {
337 'url': 'https://oload.fun/f/gb6G1H4sHXY',
338 'only_matching': True,
9713d1d1
S
339 }, {
340 'url': 'https://oload.club/f/Nr1L-aZ2dbQ',
341 'only_matching': True,
15e832ff
BUA
342 }, {
343 'url': 'https://oload.info/f/5NEAbI2BDSk',
344 'only_matching': True,
9613e14a
S
345 }, {
346 'url': 'https://openload.pw/f/WyKgK8s94N0',
347 'only_matching': True,
348 }, {
349 'url': 'https://oload.pw/f/WyKgK8s94N0',
350 'only_matching': True,
7bee705d 351 }, {
352 'url': 'https://oload.live/f/-Z58UZ-GR4M',
353 'only_matching': True,
97157c69 354 }, {
355 'url': 'https://oload.space/f/IY4eZSst3u8/',
356 'only_matching': True,
9abeefd5
S
357 }, {
358 'url': 'https://oload.services/embed/bs1NWj1dCag/',
359 'only_matching': True,
bf6fb8b9 360 }, {
361 'url': 'https://oladblock.services/f/b8NWEgkqNLI/',
362 'only_matching': True,
363 }, {
364 'url': 'https://oladblock.xyz/f/b8NWEgkqNLI/',
365 'only_matching': True,
6104cc15 366 }, {
367 'url': 'https://oladblock.me/f/b8NWEgkqNLI/',
368 'only_matching': True,
f3914b06 369 }, {
370 'url': 'https://openloed.co/f/b8NWEgkqNLI/',
371 'only_matching': True,
9e3c2f1d 372 }]
2bfeee69 373
54f3b612
S
374 _USER_AGENT_TPL = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
375 _CHROME_VERSIONS = (
376 '74.0.3729.129',
377 '76.0.3780.3',
378 '76.0.3780.2',
379 '74.0.3729.128',
380 '76.0.3780.1',
381 '76.0.3780.0',
382 '75.0.3770.15',
383 '74.0.3729.127',
384 '74.0.3729.126',
385 '76.0.3779.1',
386 '76.0.3779.0',
387 '75.0.3770.14',
388 '74.0.3729.125',
389 '76.0.3778.1',
390 '76.0.3778.0',
391 '75.0.3770.13',
392 '74.0.3729.124',
393 '74.0.3729.123',
394 '73.0.3683.121',
395 '76.0.3777.1',
396 '76.0.3777.0',
397 '75.0.3770.12',
398 '74.0.3729.122',
399 '76.0.3776.4',
400 '75.0.3770.11',
401 '74.0.3729.121',
402 '76.0.3776.3',
403 '76.0.3776.2',
404 '73.0.3683.120',
405 '74.0.3729.120',
406 '74.0.3729.119',
407 '74.0.3729.118',
408 '76.0.3776.1',
409 '76.0.3776.0',
410 '76.0.3775.5',
411 '75.0.3770.10',
412 '74.0.3729.117',
413 '76.0.3775.4',
414 '76.0.3775.3',
415 '74.0.3729.116',
416 '75.0.3770.9',
417 '76.0.3775.2',
418 '76.0.3775.1',
419 '76.0.3775.0',
420 '75.0.3770.8',
421 '74.0.3729.115',
422 '74.0.3729.114',
423 '76.0.3774.1',
424 '76.0.3774.0',
425 '75.0.3770.7',
426 '74.0.3729.113',
427 '74.0.3729.112',
428 '74.0.3729.111',
429 '76.0.3773.1',
430 '76.0.3773.0',
431 '75.0.3770.6',
432 '74.0.3729.110',
433 '74.0.3729.109',
434 '76.0.3772.1',
435 '76.0.3772.0',
436 '75.0.3770.5',
437 '74.0.3729.108',
438 '74.0.3729.107',
439 '76.0.3771.1',
440 '76.0.3771.0',
441 '75.0.3770.4',
442 '74.0.3729.106',
443 '74.0.3729.105',
444 '75.0.3770.3',
445 '74.0.3729.104',
446 '74.0.3729.103',
447 '74.0.3729.102',
448 '75.0.3770.2',
449 '74.0.3729.101',
450 '75.0.3770.1',
451 '75.0.3770.0',
452 '74.0.3729.100',
453 '75.0.3769.5',
454 '75.0.3769.4',
455 '74.0.3729.99',
456 '75.0.3769.3',
457 '75.0.3769.2',
458 '75.0.3768.6',
459 '74.0.3729.98',
460 '75.0.3769.1',
461 '75.0.3769.0',
462 '74.0.3729.97',
463 '73.0.3683.119',
464 '73.0.3683.118',
465 '74.0.3729.96',
466 '75.0.3768.5',
467 '75.0.3768.4',
468 '75.0.3768.3',
469 '75.0.3768.2',
470 '74.0.3729.95',
471 '74.0.3729.94',
472 '75.0.3768.1',
473 '75.0.3768.0',
474 '74.0.3729.93',
475 '74.0.3729.92',
476 '73.0.3683.117',
477 '74.0.3729.91',
478 '75.0.3766.3',
479 '74.0.3729.90',
480 '75.0.3767.2',
481 '75.0.3767.1',
482 '75.0.3767.0',
483 '74.0.3729.89',
484 '73.0.3683.116',
485 '75.0.3766.2',
486 '74.0.3729.88',
487 '75.0.3766.1',
488 '75.0.3766.0',
489 '74.0.3729.87',
490 '73.0.3683.115',
491 '74.0.3729.86',
492 '75.0.3765.1',
493 '75.0.3765.0',
494 '74.0.3729.85',
495 '73.0.3683.114',
496 '74.0.3729.84',
497 '75.0.3764.1',
498 '75.0.3764.0',
499 '74.0.3729.83',
500 '73.0.3683.113',
501 '75.0.3763.2',
502 '75.0.3761.4',
503 '74.0.3729.82',
504 '75.0.3763.1',
505 '75.0.3763.0',
506 '74.0.3729.81',
507 '73.0.3683.112',
508 '75.0.3762.1',
509 '75.0.3762.0',
510 '74.0.3729.80',
511 '75.0.3761.3',
512 '74.0.3729.79',
513 '73.0.3683.111',
514 '75.0.3761.2',
515 '74.0.3729.78',
516 '74.0.3729.77',
517 '75.0.3761.1',
518 '75.0.3761.0',
519 '73.0.3683.110',
520 '74.0.3729.76',
521 '74.0.3729.75',
522 '75.0.3760.0',
523 '74.0.3729.74',
524 '75.0.3759.8',
525 '75.0.3759.7',
526 '75.0.3759.6',
527 '74.0.3729.73',
528 '75.0.3759.5',
529 '74.0.3729.72',
530 '73.0.3683.109',
531 '75.0.3759.4',
532 '75.0.3759.3',
533 '74.0.3729.71',
534 '75.0.3759.2',
535 '74.0.3729.70',
536 '73.0.3683.108',
537 '74.0.3729.69',
538 '75.0.3759.1',
539 '75.0.3759.0',
540 '74.0.3729.68',
541 '73.0.3683.107',
542 '74.0.3729.67',
543 '75.0.3758.1',
544 '75.0.3758.0',
545 '74.0.3729.66',
546 '73.0.3683.106',
547 '74.0.3729.65',
548 '75.0.3757.1',
549 '75.0.3757.0',
550 '74.0.3729.64',
551 '73.0.3683.105',
552 '74.0.3729.63',
553 '75.0.3756.1',
554 '75.0.3756.0',
555 '74.0.3729.62',
556 '73.0.3683.104',
557 '75.0.3755.3',
558 '75.0.3755.2',
559 '73.0.3683.103',
560 '75.0.3755.1',
561 '75.0.3755.0',
562 '74.0.3729.61',
563 '73.0.3683.102',
564 '74.0.3729.60',
565 '75.0.3754.2',
566 '74.0.3729.59',
567 '75.0.3753.4',
568 '74.0.3729.58',
569 '75.0.3754.1',
570 '75.0.3754.0',
571 '74.0.3729.57',
572 '73.0.3683.101',
573 '75.0.3753.3',
574 '75.0.3752.2',
575 '75.0.3753.2',
576 '74.0.3729.56',
577 '75.0.3753.1',
578 '75.0.3753.0',
579 '74.0.3729.55',
580 '73.0.3683.100',
581 '74.0.3729.54',
582 '75.0.3752.1',
583 '75.0.3752.0',
584 '74.0.3729.53',
585 '73.0.3683.99',
586 '74.0.3729.52',
587 '75.0.3751.1',
588 '75.0.3751.0',
589 '74.0.3729.51',
590 '73.0.3683.98',
591 '74.0.3729.50',
592 '75.0.3750.0',
593 '74.0.3729.49',
594 '74.0.3729.48',
595 '74.0.3729.47',
596 '75.0.3749.3',
597 '74.0.3729.46',
598 '73.0.3683.97',
599 '75.0.3749.2',
600 '74.0.3729.45',
601 '75.0.3749.1',
602 '75.0.3749.0',
603 '74.0.3729.44',
604 '73.0.3683.96',
605 '74.0.3729.43',
606 '74.0.3729.42',
607 '75.0.3748.1',
608 '75.0.3748.0',
609 '74.0.3729.41',
610 '75.0.3747.1',
611 '73.0.3683.95',
612 '75.0.3746.4',
613 '74.0.3729.40',
614 '74.0.3729.39',
615 '75.0.3747.0',
616 '75.0.3746.3',
617 '75.0.3746.2',
618 '74.0.3729.38',
619 '75.0.3746.1',
620 '75.0.3746.0',
621 '74.0.3729.37',
622 '73.0.3683.94',
623 '75.0.3745.5',
624 '75.0.3745.4',
625 '75.0.3745.3',
626 '75.0.3745.2',
627 '74.0.3729.36',
628 '75.0.3745.1',
629 '75.0.3745.0',
630 '75.0.3744.2',
631 '74.0.3729.35',
632 '73.0.3683.93',
633 '74.0.3729.34',
634 '75.0.3744.1',
635 '75.0.3744.0',
636 '74.0.3729.33',
637 '73.0.3683.92',
638 '74.0.3729.32',
639 '74.0.3729.31',
640 '73.0.3683.91',
641 '75.0.3741.2',
642 '75.0.3740.5',
643 '74.0.3729.30',
644 '75.0.3741.1',
645 '75.0.3741.0',
646 '74.0.3729.29',
647 '75.0.3740.4',
648 '73.0.3683.90',
649 '74.0.3729.28',
650 '75.0.3740.3',
651 '73.0.3683.89',
652 '75.0.3740.2',
653 '74.0.3729.27',
654 '75.0.3740.1',
655 '75.0.3740.0',
656 '74.0.3729.26',
657 '73.0.3683.88',
658 '73.0.3683.87',
659 '74.0.3729.25',
660 '75.0.3739.1',
661 '75.0.3739.0',
662 '73.0.3683.86',
663 '74.0.3729.24',
664 '73.0.3683.85',
665 '75.0.3738.4',
666 '75.0.3738.3',
667 '75.0.3738.2',
668 '75.0.3738.1',
669 '75.0.3738.0',
670 '74.0.3729.23',
671 '73.0.3683.84',
672 '74.0.3729.22',
673 '74.0.3729.21',
674 '75.0.3737.1',
675 '75.0.3737.0',
676 '74.0.3729.20',
677 '73.0.3683.83',
678 '74.0.3729.19',
679 '75.0.3736.1',
680 '75.0.3736.0',
681 '74.0.3729.18',
682 '73.0.3683.82',
683 '74.0.3729.17',
684 '75.0.3735.1',
685 '75.0.3735.0',
686 '74.0.3729.16',
687 '73.0.3683.81',
688 '75.0.3734.1',
689 '75.0.3734.0',
690 '74.0.3729.15',
691 '73.0.3683.80',
692 '74.0.3729.14',
693 '75.0.3733.1',
694 '75.0.3733.0',
695 '75.0.3732.1',
696 '74.0.3729.13',
697 '74.0.3729.12',
698 '73.0.3683.79',
699 '74.0.3729.11',
700 '75.0.3732.0',
701 '74.0.3729.10',
702 '73.0.3683.78',
703 '74.0.3729.9',
704 '74.0.3729.8',
705 '74.0.3729.7',
706 '75.0.3731.3',
707 '75.0.3731.2',
708 '75.0.3731.0',
709 '74.0.3729.6',
710 '73.0.3683.77',
711 '73.0.3683.76',
712 '75.0.3730.5',
713 '75.0.3730.4',
714 '73.0.3683.75',
715 '74.0.3729.5',
716 '73.0.3683.74',
717 '75.0.3730.3',
718 '75.0.3730.2',
719 '74.0.3729.4',
720 '73.0.3683.73',
721 '73.0.3683.72',
722 '75.0.3730.1',
723 '75.0.3730.0',
724 '74.0.3729.3',
725 '73.0.3683.71',
726 '74.0.3729.2',
727 '73.0.3683.70',
728 '74.0.3729.1',
729 '74.0.3729.0',
730 '74.0.3726.4',
731 '73.0.3683.69',
732 '74.0.3726.3',
733 '74.0.3728.0',
734 '74.0.3726.2',
735 '73.0.3683.68',
736 '74.0.3726.1',
737 '74.0.3726.0',
738 '74.0.3725.4',
739 '73.0.3683.67',
740 '73.0.3683.66',
741 '74.0.3725.3',
742 '74.0.3725.2',
743 '74.0.3725.1',
744 '74.0.3724.8',
745 '74.0.3725.0',
746 '73.0.3683.65',
747 '74.0.3724.7',
748 '74.0.3724.6',
749 '74.0.3724.5',
750 '74.0.3724.4',
751 '74.0.3724.3',
752 '74.0.3724.2',
753 '74.0.3724.1',
754 '74.0.3724.0',
755 '73.0.3683.64',
756 '74.0.3723.1',
757 '74.0.3723.0',
758 '73.0.3683.63',
759 '74.0.3722.1',
760 '74.0.3722.0',
761 '73.0.3683.62',
762 '74.0.3718.9',
763 '74.0.3702.3',
764 '74.0.3721.3',
765 '74.0.3721.2',
766 '74.0.3721.1',
767 '74.0.3721.0',
768 '74.0.3720.6',
769 '73.0.3683.61',
770 '72.0.3626.122',
771 '73.0.3683.60',
772 '74.0.3720.5',
773 '72.0.3626.121',
774 '74.0.3718.8',
775 '74.0.3720.4',
776 '74.0.3720.3',
777 '74.0.3718.7',
778 '74.0.3720.2',
779 '74.0.3720.1',
780 '74.0.3720.0',
781 '74.0.3718.6',
782 '74.0.3719.5',
783 '73.0.3683.59',
784 '74.0.3718.5',
785 '74.0.3718.4',
786 '74.0.3719.4',
787 '74.0.3719.3',
788 '74.0.3719.2',
789 '74.0.3719.1',
790 '73.0.3683.58',
791 '74.0.3719.0',
792 '73.0.3683.57',
793 '73.0.3683.56',
794 '74.0.3718.3',
795 '73.0.3683.55',
796 '74.0.3718.2',
797 '74.0.3718.1',
798 '74.0.3718.0',
799 '73.0.3683.54',
800 '74.0.3717.2',
801 '73.0.3683.53',
802 '74.0.3717.1',
803 '74.0.3717.0',
804 '73.0.3683.52',
805 '74.0.3716.1',
806 '74.0.3716.0',
807 '73.0.3683.51',
808 '74.0.3715.1',
809 '74.0.3715.0',
810 '73.0.3683.50',
811 '74.0.3711.2',
812 '74.0.3714.2',
813 '74.0.3713.3',
814 '74.0.3714.1',
815 '74.0.3714.0',
816 '73.0.3683.49',
817 '74.0.3713.1',
818 '74.0.3713.0',
819 '72.0.3626.120',
820 '73.0.3683.48',
821 '74.0.3712.2',
822 '74.0.3712.1',
823 '74.0.3712.0',
824 '73.0.3683.47',
825 '72.0.3626.119',
826 '73.0.3683.46',
827 '74.0.3710.2',
828 '72.0.3626.118',
829 '74.0.3711.1',
830 '74.0.3711.0',
831 '73.0.3683.45',
832 '72.0.3626.117',
833 '74.0.3710.1',
834 '74.0.3710.0',
835 '73.0.3683.44',
836 '72.0.3626.116',
837 '74.0.3709.1',
838 '74.0.3709.0',
839 '74.0.3704.9',
840 '73.0.3683.43',
841 '72.0.3626.115',
842 '74.0.3704.8',
843 '74.0.3704.7',
844 '74.0.3708.0',
845 '74.0.3706.7',
846 '74.0.3704.6',
847 '73.0.3683.42',
848 '72.0.3626.114',
849 '74.0.3706.6',
850 '72.0.3626.113',
851 '74.0.3704.5',
852 '74.0.3706.5',
853 '74.0.3706.4',
854 '74.0.3706.3',
855 '74.0.3706.2',
856 '74.0.3706.1',
857 '74.0.3706.0',
858 '73.0.3683.41',
859 '72.0.3626.112',
860 '74.0.3705.1',
861 '74.0.3705.0',
862 '73.0.3683.40',
863 '72.0.3626.111',
864 '73.0.3683.39',
865 '74.0.3704.4',
866 '73.0.3683.38',
867 '74.0.3704.3',
868 '74.0.3704.2',
869 '74.0.3704.1',
870 '74.0.3704.0',
871 '73.0.3683.37',
872 '72.0.3626.110',
873 '72.0.3626.109',
874 '74.0.3703.3',
875 '74.0.3703.2',
876 '73.0.3683.36',
877 '74.0.3703.1',
878 '74.0.3703.0',
879 '73.0.3683.35',
880 '72.0.3626.108',
881 '74.0.3702.2',
882 '74.0.3699.3',
883 '74.0.3702.1',
884 '74.0.3702.0',
885 '73.0.3683.34',
886 '72.0.3626.107',
887 '73.0.3683.33',
888 '74.0.3701.1',
889 '74.0.3701.0',
890 '73.0.3683.32',
891 '73.0.3683.31',
892 '72.0.3626.105',
893 '74.0.3700.1',
894 '74.0.3700.0',
895 '73.0.3683.29',
896 '72.0.3626.103',
897 '74.0.3699.2',
898 '74.0.3699.1',
899 '74.0.3699.0',
900 '73.0.3683.28',
901 '72.0.3626.102',
902 '73.0.3683.27',
903 '73.0.3683.26',
904 '74.0.3698.0',
905 '74.0.3696.2',
906 '72.0.3626.101',
907 '73.0.3683.25',
908 '74.0.3696.1',
909 '74.0.3696.0',
910 '74.0.3694.8',
911 '72.0.3626.100',
912 '74.0.3694.7',
913 '74.0.3694.6',
914 '74.0.3694.5',
915 '74.0.3694.4',
916 '72.0.3626.99',
917 '72.0.3626.98',
918 '74.0.3694.3',
919 '73.0.3683.24',
920 '72.0.3626.97',
921 '72.0.3626.96',
922 '72.0.3626.95',
923 '73.0.3683.23',
924 '72.0.3626.94',
925 '73.0.3683.22',
926 '73.0.3683.21',
927 '72.0.3626.93',
928 '74.0.3694.2',
929 '72.0.3626.92',
930 '74.0.3694.1',
931 '74.0.3694.0',
932 '74.0.3693.6',
933 '73.0.3683.20',
934 '72.0.3626.91',
935 '74.0.3693.5',
936 '74.0.3693.4',
937 '74.0.3693.3',
938 '74.0.3693.2',
939 '73.0.3683.19',
940 '74.0.3693.1',
941 '74.0.3693.0',
942 '73.0.3683.18',
943 '72.0.3626.90',
944 '74.0.3692.1',
945 '74.0.3692.0',
946 '73.0.3683.17',
947 '72.0.3626.89',
948 '74.0.3687.3',
949 '74.0.3691.1',
950 '74.0.3691.0',
951 '73.0.3683.16',
952 '72.0.3626.88',
953 '72.0.3626.87',
954 '73.0.3683.15',
955 '74.0.3690.1',
956 '74.0.3690.0',
957 '73.0.3683.14',
958 '72.0.3626.86',
959 '73.0.3683.13',
960 '73.0.3683.12',
961 '74.0.3689.1',
962 '74.0.3689.0',
963 '73.0.3683.11',
964 '72.0.3626.85',
965 '73.0.3683.10',
966 '72.0.3626.84',
967 '73.0.3683.9',
968 '74.0.3688.1',
969 '74.0.3688.0',
970 '73.0.3683.8',
971 '72.0.3626.83',
972 '74.0.3687.2',
973 '74.0.3687.1',
974 '74.0.3687.0',
975 '73.0.3683.7',
976 '72.0.3626.82',
977 '74.0.3686.4',
978 '72.0.3626.81',
979 '74.0.3686.3',
980 '74.0.3686.2',
981 '74.0.3686.1',
982 '74.0.3686.0',
983 '73.0.3683.6',
984 '72.0.3626.80',
985 '74.0.3685.1',
986 '74.0.3685.0',
987 '73.0.3683.5',
988 '72.0.3626.79',
989 '74.0.3684.1',
990 '74.0.3684.0',
991 '73.0.3683.4',
992 '72.0.3626.78',
993 '72.0.3626.77',
994 '73.0.3683.3',
995 '73.0.3683.2',
996 '72.0.3626.76',
997 '73.0.3683.1',
998 '73.0.3683.0',
999 '72.0.3626.75',
1000 '71.0.3578.141',
1001 '73.0.3682.1',
1002 '73.0.3682.0',
1003 '72.0.3626.74',
1004 '71.0.3578.140',
1005 '73.0.3681.4',
1006 '73.0.3681.3',
1007 '73.0.3681.2',
1008 '73.0.3681.1',
1009 '73.0.3681.0',
1010 '72.0.3626.73',
1011 '71.0.3578.139',
1012 '72.0.3626.72',
1013 '72.0.3626.71',
1014 '73.0.3680.1',
1015 '73.0.3680.0',
1016 '72.0.3626.70',
1017 '71.0.3578.138',
1018 '73.0.3678.2',
1019 '73.0.3679.1',
1020 '73.0.3679.0',
1021 '72.0.3626.69',
1022 '71.0.3578.137',
1023 '73.0.3678.1',
1024 '73.0.3678.0',
1025 '71.0.3578.136',
1026 '73.0.3677.1',
1027 '73.0.3677.0',
1028 '72.0.3626.68',
1029 '72.0.3626.67',
1030 '71.0.3578.135',
1031 '73.0.3676.1',
1032 '73.0.3676.0',
1033 '73.0.3674.2',
1034 '72.0.3626.66',
1035 '71.0.3578.134',
1036 '73.0.3674.1',
1037 '73.0.3674.0',
1038 '72.0.3626.65',
1039 '71.0.3578.133',
1040 '73.0.3673.2',
1041 '73.0.3673.1',
1042 '73.0.3673.0',
1043 '72.0.3626.64',
1044 '71.0.3578.132',
1045 '72.0.3626.63',
1046 '72.0.3626.62',
1047 '72.0.3626.61',
1048 '72.0.3626.60',
1049 '73.0.3672.1',
1050 '73.0.3672.0',
1051 '72.0.3626.59',
1052 '71.0.3578.131',
1053 '73.0.3671.3',
1054 '73.0.3671.2',
1055 '73.0.3671.1',
1056 '73.0.3671.0',
1057 '72.0.3626.58',
1058 '71.0.3578.130',
1059 '73.0.3670.1',
1060 '73.0.3670.0',
1061 '72.0.3626.57',
1062 '71.0.3578.129',
1063 '73.0.3669.1',
1064 '73.0.3669.0',
1065 '72.0.3626.56',
1066 '71.0.3578.128',
1067 '73.0.3668.2',
1068 '73.0.3668.1',
1069 '73.0.3668.0',
1070 '72.0.3626.55',
1071 '71.0.3578.127',
1072 '73.0.3667.2',
1073 '73.0.3667.1',
1074 '73.0.3667.0',
1075 '72.0.3626.54',
1076 '71.0.3578.126',
1077 '73.0.3666.1',
1078 '73.0.3666.0',
1079 '72.0.3626.53',
1080 '71.0.3578.125',
1081 '73.0.3665.4',
1082 '73.0.3665.3',
1083 '72.0.3626.52',
1084 '73.0.3665.2',
1085 '73.0.3664.4',
1086 '73.0.3665.1',
1087 '73.0.3665.0',
1088 '72.0.3626.51',
1089 '71.0.3578.124',
1090 '72.0.3626.50',
1091 '73.0.3664.3',
1092 '73.0.3664.2',
1093 '73.0.3664.1',
1094 '73.0.3664.0',
1095 '73.0.3663.2',
1096 '72.0.3626.49',
1097 '71.0.3578.123',
1098 '73.0.3663.1',
1099 '73.0.3663.0',
1100 '72.0.3626.48',
1101 '71.0.3578.122',
1102 '73.0.3662.1',
1103 '73.0.3662.0',
1104 '72.0.3626.47',
1105 '71.0.3578.121',
1106 '73.0.3661.1',
1107 '72.0.3626.46',
1108 '73.0.3661.0',
1109 '72.0.3626.45',
1110 '71.0.3578.120',
1111 '73.0.3660.2',
1112 '73.0.3660.1',
1113 '73.0.3660.0',
1114 '72.0.3626.44',
1115 '71.0.3578.119',
1116 '73.0.3659.1',
1117 '73.0.3659.0',
1118 '72.0.3626.43',
1119 '71.0.3578.118',
1120 '73.0.3658.1',
1121 '73.0.3658.0',
1122 '72.0.3626.42',
1123 '71.0.3578.117',
1124 '73.0.3657.1',
1125 '73.0.3657.0',
1126 '72.0.3626.41',
1127 '71.0.3578.116',
1128 '73.0.3656.1',
1129 '73.0.3656.0',
1130 '72.0.3626.40',
1131 '71.0.3578.115',
1132 '73.0.3655.1',
1133 '73.0.3655.0',
1134 '72.0.3626.39',
1135 '71.0.3578.114',
1136 '73.0.3654.1',
1137 '73.0.3654.0',
1138 '72.0.3626.38',
1139 '71.0.3578.113',
1140 '73.0.3653.1',
1141 '73.0.3653.0',
1142 '72.0.3626.37',
1143 '71.0.3578.112',
1144 '73.0.3652.1',
1145 '73.0.3652.0',
1146 '72.0.3626.36',
1147 '71.0.3578.111',
1148 '73.0.3651.1',
1149 '73.0.3651.0',
1150 '72.0.3626.35',
1151 '71.0.3578.110',
1152 '73.0.3650.1',
1153 '73.0.3650.0',
1154 '72.0.3626.34',
1155 '71.0.3578.109',
1156 '73.0.3649.1',
1157 '73.0.3649.0',
1158 '72.0.3626.33',
1159 '71.0.3578.108',
1160 '73.0.3648.2',
1161 '73.0.3648.1',
1162 '73.0.3648.0',
1163 '72.0.3626.32',
1164 '71.0.3578.107',
1165 '73.0.3647.2',
1166 '73.0.3647.1',
1167 '73.0.3647.0',
1168 '72.0.3626.31',
1169 '71.0.3578.106',
1170 '73.0.3635.3',
1171 '73.0.3646.2',
1172 '73.0.3646.1',
1173 '73.0.3646.0',
1174 '72.0.3626.30',
1175 '71.0.3578.105',
1176 '72.0.3626.29',
1177 '73.0.3645.2',
1178 '73.0.3645.1',
1179 '73.0.3645.0',
1180 '72.0.3626.28',
1181 '71.0.3578.104',
1182 '72.0.3626.27',
1183 '72.0.3626.26',
1184 '72.0.3626.25',
1185 '72.0.3626.24',
1186 '73.0.3644.0',
1187 '73.0.3643.2',
1188 '72.0.3626.23',
1189 '71.0.3578.103',
1190 '73.0.3643.1',
1191 '73.0.3643.0',
1192 '72.0.3626.22',
1193 '71.0.3578.102',
1194 '73.0.3642.1',
1195 '73.0.3642.0',
1196 '72.0.3626.21',
1197 '71.0.3578.101',
1198 '73.0.3641.1',
1199 '73.0.3641.0',
1200 '72.0.3626.20',
1201 '71.0.3578.100',
1202 '72.0.3626.19',
1203 '73.0.3640.1',
1204 '73.0.3640.0',
1205 '72.0.3626.18',
1206 '73.0.3639.1',
1207 '71.0.3578.99',
1208 '73.0.3639.0',
1209 '72.0.3626.17',
1210 '73.0.3638.2',
1211 '72.0.3626.16',
1212 '73.0.3638.1',
1213 '73.0.3638.0',
1214 '72.0.3626.15',
1215 '71.0.3578.98',
1216 '73.0.3635.2',
1217 '71.0.3578.97',
1218 '73.0.3637.1',
1219 '73.0.3637.0',
1220 '72.0.3626.14',
1221 '71.0.3578.96',
1222 '71.0.3578.95',
1223 '72.0.3626.13',
1224 '71.0.3578.94',
1225 '73.0.3636.2',
1226 '71.0.3578.93',
1227 '73.0.3636.1',
1228 '73.0.3636.0',
1229 '72.0.3626.12',
1230 '71.0.3578.92',
1231 '73.0.3635.1',
1232 '73.0.3635.0',
1233 '72.0.3626.11',
1234 '71.0.3578.91',
1235 '73.0.3634.2',
1236 '73.0.3634.1',
1237 '73.0.3634.0',
1238 '72.0.3626.10',
1239 '71.0.3578.90',
1240 '71.0.3578.89',
1241 '73.0.3633.2',
1242 '73.0.3633.1',
1243 '73.0.3633.0',
1244 '72.0.3610.4',
1245 '72.0.3626.9',
1246 '71.0.3578.88',
1247 '73.0.3632.5',
1248 '73.0.3632.4',
1249 '73.0.3632.3',
1250 '73.0.3632.2',
1251 '73.0.3632.1',
1252 '73.0.3632.0',
1253 '72.0.3626.8',
1254 '71.0.3578.87',
1255 '73.0.3631.2',
1256 '73.0.3631.1',
1257 '73.0.3631.0',
1258 '72.0.3626.7',
1259 '71.0.3578.86',
1260 '72.0.3626.6',
1261 '73.0.3630.1',
1262 '73.0.3630.0',
1263 '72.0.3626.5',
1264 '71.0.3578.85',
1265 '72.0.3626.4',
1266 '73.0.3628.3',
1267 '73.0.3628.2',
1268 '73.0.3629.1',
1269 '73.0.3629.0',
1270 '72.0.3626.3',
1271 '71.0.3578.84',
1272 '73.0.3628.1',
1273 '73.0.3628.0',
1274 '71.0.3578.83',
1275 '73.0.3627.1',
1276 '73.0.3627.0',
1277 '72.0.3626.2',
1278 '71.0.3578.82',
1279 '71.0.3578.81',
1280 '71.0.3578.80',
1281 '72.0.3626.1',
1282 '72.0.3626.0',
1283 '71.0.3578.79',
1284 '70.0.3538.124',
1285 '71.0.3578.78',
1286 '72.0.3623.4',
1287 '72.0.3625.2',
1288 '72.0.3625.1',
1289 '72.0.3625.0',
1290 '71.0.3578.77',
1291 '70.0.3538.123',
1292 '72.0.3624.4',
1293 '72.0.3624.3',
1294 '72.0.3624.2',
1295 '71.0.3578.76',
1296 '72.0.3624.1',
1297 '72.0.3624.0',
1298 '72.0.3623.3',
1299 '71.0.3578.75',
1300 '70.0.3538.122',
1301 '71.0.3578.74',
1302 '72.0.3623.2',
1303 '72.0.3610.3',
1304 '72.0.3623.1',
1305 '72.0.3623.0',
1306 '72.0.3622.3',
1307 '72.0.3622.2',
1308 '71.0.3578.73',
1309 '70.0.3538.121',
1310 '72.0.3622.1',
1311 '72.0.3622.0',
1312 '71.0.3578.72',
1313 '70.0.3538.120',
1314 '72.0.3621.1',
1315 '72.0.3621.0',
1316 '71.0.3578.71',
1317 '70.0.3538.119',
1318 '72.0.3620.1',
1319 '72.0.3620.0',
1320 '71.0.3578.70',
1321 '70.0.3538.118',
1322 '71.0.3578.69',
1323 '72.0.3619.1',
1324 '72.0.3619.0',
1325 '71.0.3578.68',
1326 '70.0.3538.117',
1327 '71.0.3578.67',
1328 '72.0.3618.1',
1329 '72.0.3618.0',
1330 '71.0.3578.66',
1331 '70.0.3538.116',
1332 '72.0.3617.1',
1333 '72.0.3617.0',
1334 '71.0.3578.65',
1335 '70.0.3538.115',
1336 '72.0.3602.3',
1337 '71.0.3578.64',
1338 '72.0.3616.1',
1339 '72.0.3616.0',
1340 '71.0.3578.63',
1341 '70.0.3538.114',
1342 '71.0.3578.62',
1343 '72.0.3615.1',
1344 '72.0.3615.0',
1345 '71.0.3578.61',
1346 '70.0.3538.113',
1347 '72.0.3614.1',
1348 '72.0.3614.0',
1349 '71.0.3578.60',
1350 '70.0.3538.112',
1351 '72.0.3613.1',
1352 '72.0.3613.0',
1353 '71.0.3578.59',
1354 '70.0.3538.111',
1355 '72.0.3612.2',
1356 '72.0.3612.1',
1357 '72.0.3612.0',
1358 '70.0.3538.110',
1359 '71.0.3578.58',
1360 '70.0.3538.109',
1361 '72.0.3611.2',
1362 '72.0.3611.1',
1363 '72.0.3611.0',
1364 '71.0.3578.57',
1365 '70.0.3538.108',
1366 '72.0.3610.2',
1367 '71.0.3578.56',
1368 '71.0.3578.55',
1369 '72.0.3610.1',
1370 '72.0.3610.0',
1371 '71.0.3578.54',
1372 '70.0.3538.107',
1373 '71.0.3578.53',
1374 '72.0.3609.3',
1375 '71.0.3578.52',
1376 '72.0.3609.2',
1377 '71.0.3578.51',
1378 '72.0.3608.5',
1379 '72.0.3609.1',
1380 '72.0.3609.0',
1381 '71.0.3578.50',
1382 '70.0.3538.106',
1383 '72.0.3608.4',
1384 '72.0.3608.3',
1385 '72.0.3608.2',
1386 '71.0.3578.49',
1387 '72.0.3608.1',
1388 '72.0.3608.0',
1389 '70.0.3538.105',
1390 '71.0.3578.48',
1391 '72.0.3607.1',
1392 '72.0.3607.0',
1393 '71.0.3578.47',
1394 '70.0.3538.104',
1395 '72.0.3606.2',
1396 '72.0.3606.1',
1397 '72.0.3606.0',
1398 '71.0.3578.46',
1399 '70.0.3538.103',
1400 '70.0.3538.102',
1401 '72.0.3605.3',
1402 '72.0.3605.2',
1403 '72.0.3605.1',
1404 '72.0.3605.0',
1405 '71.0.3578.45',
1406 '70.0.3538.101',
1407 '71.0.3578.44',
1408 '71.0.3578.43',
1409 '70.0.3538.100',
1410 '70.0.3538.99',
1411 '71.0.3578.42',
1412 '72.0.3604.1',
1413 '72.0.3604.0',
1414 '71.0.3578.41',
1415 '70.0.3538.98',
1416 '71.0.3578.40',
1417 '72.0.3603.2',
1418 '72.0.3603.1',
1419 '72.0.3603.0',
1420 '71.0.3578.39',
1421 '70.0.3538.97',
1422 '72.0.3602.2',
1423 '71.0.3578.38',
1424 '71.0.3578.37',
1425 '72.0.3602.1',
1426 '72.0.3602.0',
1427 '71.0.3578.36',
1428 '70.0.3538.96',
1429 '72.0.3601.1',
1430 '72.0.3601.0',
1431 '71.0.3578.35',
1432 '70.0.3538.95',
1433 '72.0.3600.1',
1434 '72.0.3600.0',
1435 '71.0.3578.34',
1436 '70.0.3538.94',
1437 '72.0.3599.3',
1438 '72.0.3599.2',
1439 '72.0.3599.1',
1440 '72.0.3599.0',
1441 '71.0.3578.33',
1442 '70.0.3538.93',
1443 '72.0.3598.1',
1444 '72.0.3598.0',
1445 '71.0.3578.32',
1446 '70.0.3538.87',
1447 '72.0.3597.1',
1448 '72.0.3597.0',
1449 '72.0.3596.2',
1450 '71.0.3578.31',
1451 '70.0.3538.86',
1452 '71.0.3578.30',
1453 '71.0.3578.29',
1454 '72.0.3596.1',
1455 '72.0.3596.0',
1456 '71.0.3578.28',
1457 '70.0.3538.85',
1458 '72.0.3595.2',
1459 '72.0.3591.3',
1460 '72.0.3595.1',
1461 '72.0.3595.0',
1462 '71.0.3578.27',
1463 '70.0.3538.84',
1464 '72.0.3594.1',
1465 '72.0.3594.0',
1466 '71.0.3578.26',
1467 '70.0.3538.83',
1468 '72.0.3593.2',
1469 '72.0.3593.1',
1470 '72.0.3593.0',
1471 '71.0.3578.25',
1472 '70.0.3538.82',
1473 '72.0.3589.3',
1474 '72.0.3592.2',
1475 '72.0.3592.1',
1476 '72.0.3592.0',
1477 '71.0.3578.24',
1478 '72.0.3589.2',
1479 '70.0.3538.81',
1480 '70.0.3538.80',
1481 '72.0.3591.2',
1482 '72.0.3591.1',
1483 '72.0.3591.0',
1484 '71.0.3578.23',
1485 '70.0.3538.79',
1486 '71.0.3578.22',
1487 '72.0.3590.1',
1488 '72.0.3590.0',
1489 '71.0.3578.21',
1490 '70.0.3538.78',
1491 '70.0.3538.77',
1492 '72.0.3589.1',
1493 '72.0.3589.0',
1494 '71.0.3578.20',
1495 '70.0.3538.76',
1496 '71.0.3578.19',
1497 '70.0.3538.75',
1498 '72.0.3588.1',
1499 '72.0.3588.0',
1500 '71.0.3578.18',
1501 '70.0.3538.74',
1502 '72.0.3586.2',
1503 '72.0.3587.0',
1504 '71.0.3578.17',
1505 '70.0.3538.73',
1506 '72.0.3586.1',
1507 '72.0.3586.0',
1508 '71.0.3578.16',
1509 '70.0.3538.72',
1510 '72.0.3585.1',
1511 '72.0.3585.0',
1512 '71.0.3578.15',
1513 '70.0.3538.71',
1514 '71.0.3578.14',
1515 '72.0.3584.1',
1516 '72.0.3584.0',
1517 '71.0.3578.13',
1518 '70.0.3538.70',
1519 '72.0.3583.2',
1520 '71.0.3578.12',
1521 '72.0.3583.1',
1522 '72.0.3583.0',
1523 '71.0.3578.11',
1524 '70.0.3538.69',
1525 '71.0.3578.10',
1526 '72.0.3582.0',
1527 '72.0.3581.4',
1528 '71.0.3578.9',
1529 '70.0.3538.67',
1530 '72.0.3581.3',
1531 '72.0.3581.2',
1532 '72.0.3581.1',
1533 '72.0.3581.0',
1534 '71.0.3578.8',
1535 '70.0.3538.66',
1536 '72.0.3580.1',
1537 '72.0.3580.0',
1538 '71.0.3578.7',
1539 '70.0.3538.65',
1540 '71.0.3578.6',
1541 '72.0.3579.1',
1542 '72.0.3579.0',
1543 '71.0.3578.5',
1544 '70.0.3538.64',
1545 '71.0.3578.4',
1546 '71.0.3578.3',
1547 '71.0.3578.2',
1548 '71.0.3578.1',
1549 '71.0.3578.0',
1550 '70.0.3538.63',
1551 '69.0.3497.128',
1552 '70.0.3538.62',
1553 '70.0.3538.61',
1554 '70.0.3538.60',
1555 '70.0.3538.59',
1556 '71.0.3577.1',
1557 '71.0.3577.0',
1558 '70.0.3538.58',
1559 '69.0.3497.127',
1560 '71.0.3576.2',
1561 '71.0.3576.1',
1562 '71.0.3576.0',
1563 '70.0.3538.57',
1564 '70.0.3538.56',
1565 '71.0.3575.2',
1566 '70.0.3538.55',
1567 '69.0.3497.126',
1568 '70.0.3538.54',
1569 '71.0.3575.1',
1570 '71.0.3575.0',
1571 '71.0.3574.1',
1572 '71.0.3574.0',
1573 '70.0.3538.53',
1574 '69.0.3497.125',
1575 '70.0.3538.52',
1576 '71.0.3573.1',
1577 '71.0.3573.0',
1578 '70.0.3538.51',
1579 '69.0.3497.124',
1580 '71.0.3572.1',
1581 '71.0.3572.0',
1582 '70.0.3538.50',
1583 '69.0.3497.123',
1584 '71.0.3571.2',
1585 '70.0.3538.49',
1586 '69.0.3497.122',
1587 '71.0.3571.1',
1588 '71.0.3571.0',
1589 '70.0.3538.48',
1590 '69.0.3497.121',
1591 '71.0.3570.1',
1592 '71.0.3570.0',
1593 '70.0.3538.47',
1594 '69.0.3497.120',
1595 '71.0.3568.2',
1596 '71.0.3569.1',
1597 '71.0.3569.0',
1598 '70.0.3538.46',
1599 '69.0.3497.119',
1600 '70.0.3538.45',
1601 '71.0.3568.1',
1602 '71.0.3568.0',
1603 '70.0.3538.44',
1604 '69.0.3497.118',
1605 '70.0.3538.43',
1606 '70.0.3538.42',
1607 '71.0.3567.1',
1608 '71.0.3567.0',
1609 '70.0.3538.41',
1610 '69.0.3497.117',
1611 '71.0.3566.1',
1612 '71.0.3566.0',
1613 '70.0.3538.40',
1614 '69.0.3497.116',
1615 '71.0.3565.1',
1616 '71.0.3565.0',
1617 '70.0.3538.39',
1618 '69.0.3497.115',
1619 '71.0.3564.1',
1620 '71.0.3564.0',
1621 '70.0.3538.38',
1622 '69.0.3497.114',
1623 '71.0.3563.0',
1624 '71.0.3562.2',
1625 '70.0.3538.37',
1626 '69.0.3497.113',
1627 '70.0.3538.36',
1628 '70.0.3538.35',
1629 '71.0.3562.1',
1630 '71.0.3562.0',
1631 '70.0.3538.34',
1632 '69.0.3497.112',
1633 '70.0.3538.33',
1634 '71.0.3561.1',
1635 '71.0.3561.0',
1636 '70.0.3538.32',
1637 '69.0.3497.111',
1638 '71.0.3559.6',
1639 '71.0.3560.1',
1640 '71.0.3560.0',
1641 '71.0.3559.5',
1642 '71.0.3559.4',
1643 '70.0.3538.31',
1644 '69.0.3497.110',
1645 '71.0.3559.3',
1646 '70.0.3538.30',
1647 '69.0.3497.109',
1648 '71.0.3559.2',
1649 '71.0.3559.1',
1650 '71.0.3559.0',
1651 '70.0.3538.29',
1652 '69.0.3497.108',
1653 '71.0.3558.2',
1654 '71.0.3558.1',
1655 '71.0.3558.0',
1656 '70.0.3538.28',
1657 '69.0.3497.107',
1658 '71.0.3557.2',
1659 '71.0.3557.1',
1660 '71.0.3557.0',
1661 '70.0.3538.27',
1662 '69.0.3497.106',
1663 '71.0.3554.4',
1664 '70.0.3538.26',
1665 '71.0.3556.1',
1666 '71.0.3556.0',
1667 '70.0.3538.25',
1668 '71.0.3554.3',
1669 '69.0.3497.105',
1670 '71.0.3554.2',
1671 '70.0.3538.24',
1672 '69.0.3497.104',
1673 '71.0.3555.2',
1674 '70.0.3538.23',
1675 '71.0.3555.1',
1676 '71.0.3555.0',
1677 '70.0.3538.22',
1678 '69.0.3497.103',
1679 '71.0.3554.1',
1680 '71.0.3554.0',
1681 '70.0.3538.21',
1682 '69.0.3497.102',
1683 '71.0.3553.3',
1684 '70.0.3538.20',
1685 '69.0.3497.101',
1686 '71.0.3553.2',
1687 '69.0.3497.100',
1688 '71.0.3553.1',
1689 '71.0.3553.0',
1690 '70.0.3538.19',
1691 '69.0.3497.99',
1692 '69.0.3497.98',
1693 '69.0.3497.97',
1694 '71.0.3552.6',
1695 '71.0.3552.5',
1696 '71.0.3552.4',
1697 '71.0.3552.3',
1698 '71.0.3552.2',
1699 '71.0.3552.1',
1700 '71.0.3552.0',
1701 '70.0.3538.18',
1702 '69.0.3497.96',
1703 '71.0.3551.3',
1704 '71.0.3551.2',
1705 '71.0.3551.1',
1706 '71.0.3551.0',
1707 '70.0.3538.17',
1708 '69.0.3497.95',
1709 '71.0.3550.3',
1710 '71.0.3550.2',
1711 '71.0.3550.1',
1712 '71.0.3550.0',
1713 '70.0.3538.16',
1714 '69.0.3497.94',
1715 '71.0.3549.1',
1716 '71.0.3549.0',
1717 '70.0.3538.15',
1718 '69.0.3497.93',
1719 '69.0.3497.92',
1720 '71.0.3548.1',
1721 '71.0.3548.0',
1722 '70.0.3538.14',
1723 '69.0.3497.91',
1724 '71.0.3547.1',
1725 '71.0.3547.0',
1726 '70.0.3538.13',
1727 '69.0.3497.90',
1728 '71.0.3546.2',
1729 '69.0.3497.89',
1730 '71.0.3546.1',
1731 '71.0.3546.0',
1732 '70.0.3538.12',
1733 '69.0.3497.88',
1734 '71.0.3545.4',
1735 '71.0.3545.3',
1736 '71.0.3545.2',
1737 '71.0.3545.1',
1738 '71.0.3545.0',
1739 '70.0.3538.11',
1740 '69.0.3497.87',
1741 '71.0.3544.5',
1742 '71.0.3544.4',
1743 '71.0.3544.3',
1744 '71.0.3544.2',
1745 '71.0.3544.1',
1746 '71.0.3544.0',
1747 '69.0.3497.86',
1748 '70.0.3538.10',
1749 '69.0.3497.85',
1750 '70.0.3538.9',
1751 '69.0.3497.84',
1752 '71.0.3543.4',
1753 '70.0.3538.8',
1754 '71.0.3543.3',
1755 '71.0.3543.2',
1756 '71.0.3543.1',
1757 '71.0.3543.0',
1758 '70.0.3538.7',
1759 '69.0.3497.83',
1760 '71.0.3542.2',
1761 '71.0.3542.1',
1762 '71.0.3542.0',
1763 '70.0.3538.6',
1764 '69.0.3497.82',
1765 '69.0.3497.81',
1766 '71.0.3541.1',
1767 '71.0.3541.0',
1768 '70.0.3538.5',
1769 '69.0.3497.80',
1770 '71.0.3540.1',
1771 '71.0.3540.0',
1772 '70.0.3538.4',
1773 '69.0.3497.79',
1774 '70.0.3538.3',
1775 '71.0.3539.1',
1776 '71.0.3539.0',
1777 '69.0.3497.78',
1778 '68.0.3440.134',
1779 '69.0.3497.77',
1780 '70.0.3538.2',
1781 '70.0.3538.1',
1782 '70.0.3538.0',
1783 '69.0.3497.76',
1784 '68.0.3440.133',
1785 '69.0.3497.75',
1786 '70.0.3537.2',
1787 '70.0.3537.1',
1788 '70.0.3537.0',
1789 '69.0.3497.74',
1790 '68.0.3440.132',
1791 '70.0.3536.0',
1792 '70.0.3535.5',
1793 '70.0.3535.4',
1794 '70.0.3535.3',
1795 '69.0.3497.73',
1796 '68.0.3440.131',
1797 '70.0.3532.8',
1798 '70.0.3532.7',
1799 '69.0.3497.72',
1800 '69.0.3497.71',
1801 '70.0.3535.2',
1802 '70.0.3535.1',
1803 '70.0.3535.0',
1804 '69.0.3497.70',
1805 '68.0.3440.130',
1806 '69.0.3497.69',
1807 '68.0.3440.129',
1808 '70.0.3534.4',
1809 '70.0.3534.3',
1810 '70.0.3534.2',
1811 '70.0.3534.1',
1812 '70.0.3534.0',
1813 '69.0.3497.68',
1814 '68.0.3440.128',
1815 '70.0.3533.2',
1816 '70.0.3533.1',
1817 '70.0.3533.0',
1818 '69.0.3497.67',
1819 '68.0.3440.127',
1820 '70.0.3532.6',
1821 '70.0.3532.5',
1822 '70.0.3532.4',
1823 '69.0.3497.66',
1824 '68.0.3440.126',
1825 '70.0.3532.3',
1826 '70.0.3532.2',
1827 '70.0.3532.1',
1828 '69.0.3497.60',
1829 '69.0.3497.65',
1830 '69.0.3497.64',
1831 '70.0.3532.0',
1832 '70.0.3531.0',
1833 '70.0.3530.4',
1834 '70.0.3530.3',
1835 '70.0.3530.2',
1836 '69.0.3497.58',
1837 '68.0.3440.125',
1838 '69.0.3497.57',
1839 '69.0.3497.56',
1840 '69.0.3497.55',
1841 '69.0.3497.54',
1842 '70.0.3530.1',
1843 '70.0.3530.0',
1844 '69.0.3497.53',
1845 '68.0.3440.124',
1846 '69.0.3497.52',
1847 '70.0.3529.3',
1848 '70.0.3529.2',
1849 '70.0.3529.1',
1850 '70.0.3529.0',
1851 '69.0.3497.51',
1852 '70.0.3528.4',
1853 '68.0.3440.123',
1854 '70.0.3528.3',
1855 '70.0.3528.2',
1856 '70.0.3528.1',
1857 '70.0.3528.0',
1858 '69.0.3497.50',
1859 '68.0.3440.122',
1860 '70.0.3527.1',
1861 '70.0.3527.0',
1862 '69.0.3497.49',
1863 '68.0.3440.121',
1864 '70.0.3526.1',
1865 '70.0.3526.0',
1866 '68.0.3440.120',
1867 '69.0.3497.48',
1868 '69.0.3497.47',
1869 '68.0.3440.119',
1870 '68.0.3440.118',
1871 '70.0.3525.5',
1872 '70.0.3525.4',
1873 '70.0.3525.3',
1874 '68.0.3440.117',
1875 '69.0.3497.46',
1876 '70.0.3525.2',
1877 '70.0.3525.1',
1878 '70.0.3525.0',
1879 '69.0.3497.45',
1880 '68.0.3440.116',
1881 '70.0.3524.4',
1882 '70.0.3524.3',
1883 '69.0.3497.44',
1884 '70.0.3524.2',
1885 '70.0.3524.1',
1886 '70.0.3524.0',
1887 '70.0.3523.2',
1888 '69.0.3497.43',
1889 '68.0.3440.115',
1890 '70.0.3505.9',
1891 '69.0.3497.42',
1892 '70.0.3505.8',
1893 '70.0.3523.1',
1894 '70.0.3523.0',
1895 '69.0.3497.41',
1896 '68.0.3440.114',
1897 '70.0.3505.7',
1898 '69.0.3497.40',
1899 '70.0.3522.1',
1900 '70.0.3522.0',
1901 '70.0.3521.2',
1902 '69.0.3497.39',
1903 '68.0.3440.113',
1904 '70.0.3505.6',
1905 '70.0.3521.1',
1906 '70.0.3521.0',
1907 '69.0.3497.38',
1908 '68.0.3440.112',
1909 '70.0.3520.1',
1910 '70.0.3520.0',
1911 '69.0.3497.37',
1912 '68.0.3440.111',
1913 '70.0.3519.3',
1914 '70.0.3519.2',
1915 '70.0.3519.1',
1916 '70.0.3519.0',
1917 '69.0.3497.36',
1918 '68.0.3440.110',
1919 '70.0.3518.1',
1920 '70.0.3518.0',
1921 '69.0.3497.35',
1922 '69.0.3497.34',
1923 '68.0.3440.109',
1924 '70.0.3517.1',
1925 '70.0.3517.0',
1926 '69.0.3497.33',
1927 '68.0.3440.108',
1928 '69.0.3497.32',
1929 '70.0.3516.3',
1930 '70.0.3516.2',
1931 '70.0.3516.1',
1932 '70.0.3516.0',
1933 '69.0.3497.31',
1934 '68.0.3440.107',
1935 '70.0.3515.4',
1936 '68.0.3440.106',
1937 '70.0.3515.3',
1938 '70.0.3515.2',
1939 '70.0.3515.1',
1940 '70.0.3515.0',
1941 '69.0.3497.30',
1942 '68.0.3440.105',
1943 '68.0.3440.104',
1944 '70.0.3514.2',
1945 '70.0.3514.1',
1946 '70.0.3514.0',
1947 '69.0.3497.29',
1948 '68.0.3440.103',
1949 '70.0.3513.1',
1950 '70.0.3513.0',
1951 '69.0.3497.28',
1952 )
47e0cef4 1953
4eec1127 1954 @classmethod
1955 def _extract_urls(cls, webpage):
17f8deeb 1956 return re.findall(
4eec1127 1957 r'<iframe[^>]+src=["\']((?:https?://)?%s/%s/[a-zA-Z0-9-_]+)'
1958 % (cls._DOMAINS, cls._EMBED_WORD), webpage)
1959
1960 def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
1961 phantom = PhantomJSwrapper(self, required_version='2.0')
1962 webpage, _ = phantom.get(page_url, html=webpage, video_id=video_id, headers=headers)
1963 return webpage
17f8deeb 1964
2bfeee69 1965 def _real_extract(self, url):
d0058c76
S
1966 mobj = re.match(self._VALID_URL, url)
1967 host = mobj.group('host')
1968 video_id = mobj.group('id')
1969
1970 url_pattern = 'https://%s/%%s/%s/' % (host, video_id)
da57ebaf 1971 headers = {
54f3b612 1972 'User-Agent': self._USER_AGENT_TPL % random.choice(self._CHROME_VERSIONS),
da57ebaf
TF
1973 }
1974
4eec1127 1975 for path in (self._EMBED_WORD, self._STREAM_WORD):
d2c5b5a9 1976 page_url = url_pattern % path
4eec1127 1977 last = path == self._STREAM_WORD
d2c5b5a9
S
1978 webpage = self._download_webpage(
1979 page_url, video_id, 'Downloading %s webpage' % path,
1980 headers=headers, fatal=last)
1981 if not webpage:
1982 continue
1983 if 'File not found' in webpage or 'deleted by the owner' in webpage:
1984 if not last:
1985 continue
1986 raise ExtractorError('File not found', expected=True, video_id=video_id)
1987 break
47e0cef4 1988
4eec1127 1989 webpage = self._extract_decrypted_page(page_url, webpage, video_id, headers)
1990 for element_id in self._URL_IDS:
1991 decoded_id = get_element_by_id(element_id, webpage)
1992 if decoded_id:
1993 break
1994 if not decoded_id:
1995 decoded_id = self._search_regex(
1996 (r'>\s*([\w-]+~\d{10,}~\d+\.\d+\.0\.0~[\w-]+)\s*<',
1997 r'>\s*([\w~-]+~\d+\.\d+\.\d+\.\d+~[\w~-]+)',
1998 r'>\s*([\w-]+~\d{10,}~(?:[a-f\d]+:){2}:~[\w-]+)\s*<',
1999 r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)\s*<',
2000 r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)'), webpage,
2001 'stream URL')
2002 video_url = 'https://%s/%s/%s?mime=true' % (host, self._REDIR_WORD, decoded_id)
a1394b82 2003
da57ebaf
TF
2004 title = self._og_search_title(webpage, default=None) or self._search_regex(
2005 r'<span[^>]+class=["\']title["\'][^>]*>([^<]+)', webpage,
2006 'title', default=None) or self._html_search_meta(
2007 'description', webpage, 'title', fatal=True)
2008
d2c5b5a9 2009 entries = self._parse_html5_media_entries(page_url, webpage, video_id)
47e0cef4
TF
2010 entry = entries[0] if entries else {}
2011 subtitles = entry.get('subtitles')
0711995b 2012
d0058c76 2013 return {
2bfeee69 2014 'id': video_id,
a1394b82 2015 'title': title,
47e0cef4 2016 'thumbnail': entry.get('thumbnail') or self._og_search_thumbnail(webpage, default=None),
2bfeee69 2017 'url': video_url,
85750f89 2018 'ext': determine_ext(title, None) or determine_ext(url, 'mp4'),
0711995b 2019 'subtitles': subtitles,
da57ebaf 2020 'http_headers': headers,
2bfeee69 2021 }
4eec1127 2022
2023
2024class VerystreamIE(OpenloadIE):
2025 IE_NAME = 'verystream'
2026
2027 _DOMAINS = r'(?:verystream\.com)'
2028 _VALID_URL = r'''(?x)
2029 https?://
2030 (?P<host>
2031 (?:www\.)?
2032 %s
2033 )/
2034 (?:stream|e)/
2035 (?P<id>[a-zA-Z0-9-_]+)
2036 ''' % _DOMAINS
2037 _EMBED_WORD = 'e'
2038 _STREAM_WORD = 'stream'
2039 _REDIR_WORD = 'gettoken'
2040 _URL_IDS = ('videolink', )
2041 _TESTS = [{
2042 'url': 'https://verystream.com/stream/c1GWQ9ngBBx/',
2043 'md5': 'd3e8c5628ccb9970b65fd65269886795',
2044 'info_dict': {
2045 'id': 'c1GWQ9ngBBx',
2046 'ext': 'mp4',
2047 'title': 'Big Buck Bunny.mp4',
2048 'thumbnail': r're:^https?://.*\.jpg$',
2049 },
2050 }, {
2051 'url': 'https://verystream.com/e/c1GWQ9ngBBx/',
2052 'only_matching': True,
2053 }]
2054
2055 def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
2056 return webpage # for Verystream, the webpage is already decrypted