You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2057 lines
53KB

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