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