-
- request = compat_urllib_request.Request(api_url, json.dumps(data))
-
- video_json_page = self._download_webpage(request, video_id, u'Downloading video JSON')
- video_json = json.loads(video_json_page)
-
- if u'error' in video_json:
- error = video_json[u'error']
- if error[u'origin'] == u'NoRedisValidData':
- raise ExtractorError(u'Video %s does not exist' % video_id, expected=True)
- raise ExtractorError(u'Unable to download video %s: %s' % (video_id, error[u'message']), expected=True)
-
- result = video_json[u'result']
-
- formats = [{'url': x[u'url'],
- 'format_id': x[u'content_format']
- } for x in result[u'files'] if x[u'content_format'] in self._known_formats]
- formats.sort(key=lambda fmt: self._known_formats.index(fmt['format_id']))
-
- if len(formats) == 0:
- self._downloader.report_warning(u'No media links available for %s' % video_id)
- return
-
- duration = result[u'duration']
- compilation = result[u'compilation']
- title = result[u'title']
-
- title = '%s - %s' % (compilation, title) if compilation is not None else title
-
- previews = result[u'preview']
- previews.sort(key=lambda fmt: self._known_thumbnails.index(fmt['content_format']))
- thumbnail = previews[-1][u'url'] if len(previews) > 0 else None
-
- video_page = self._download_webpage(url, video_id, u'Downloading video page')
- description = self._extract_description(video_page)
- comment_count = self._extract_comment_count(video_page)
+ ]
+ }).encode()
+
+ try:
+ from Crypto.Cipher import Blowfish
+ from Crypto.Hash import CMAC
+
+ timestamp = self._download_json(
+ self._LIGHT_URL, video_id,
+ 'Downloading timestamp JSON', data=json.dumps({
+ 'method': 'da.timestamp.get',
+ 'params': []
+ }).encode())['result']
+
+ data = data % 353
+ query = {
+ 'ts': timestamp,
+ 'sign': CMAC.new(self._LIGHT_KEY, timestamp.encode() + data, Blowfish).hexdigest(),
+ }
+ except ImportError:
+ data = data % 183
+ query = {}
+
+ video_json = self._download_json(
+ self._LIGHT_URL, video_id,
+ 'Downloading video JSON', data=data, query=query)
+
+ error = video_json.get('error')
+ if error:
+ origin = error.get('origin')
+ message = error.get('message') or error.get('user_message')
+ extractor_msg = 'Unable to download video %s'
+ if origin == 'NotAllowedForLocation':
+ self.raise_geo_restricted(message, self._GEO_COUNTRIES)
+ elif origin == 'NoRedisValidData':
+ extractor_msg = 'Video %s does not exist'
+ elif message:
+ if 'недоступен для просмотра на площадке s183' in message:
+ raise ExtractorError(
+ 'pycryptodome not found. Please install it.',
+ expected=True)
+ extractor_msg += ': ' + message
+ raise ExtractorError(extractor_msg % video_id, expected=True)
+
+ result = video_json['result']
+ title = result['title']
+
+ quality = qualities(self._KNOWN_FORMATS)
+
+ formats = []
+ for f in result.get('files', []):
+ f_url = f.get('url')
+ content_format = f.get('content_format')
+ if not f_url or '-MDRM-' in content_format or '-FPS-' in content_format:
+ continue
+ formats.append({
+ 'url': f_url,
+ 'format_id': content_format,
+ 'quality': quality(content_format),
+ 'filesize': int_or_none(f.get('size_in_bytes')),
+ })
+ self._sort_formats(formats)
+
+ compilation = result.get('compilation')
+ episode = title if compilation else None
+
+ title = '%s - %s' % (compilation, title) if compilation is not None else title
+
+ thumbnails = [{
+ 'url': preview['url'],
+ 'id': preview.get('content_format'),
+ } for preview in result.get('preview', []) if preview.get('url')]
+
+ webpage = self._download_webpage(url, video_id)
+
+ season = self._search_regex(
+ r'<li[^>]+class="season active"[^>]*><a[^>]+>([^<]+)',
+ webpage, 'season', default=None)
+ season_number = int_or_none(self._search_regex(
+ r'<li[^>]+class="season active"[^>]*><a[^>]+data-season(?:-index)?="(\d+)"',
+ webpage, 'season number', default=None))
+
+ episode_number = int_or_none(self._search_regex(
+ r'[^>]+itemprop="episode"[^>]*>\s*<meta[^>]+itemprop="episodeNumber"[^>]+content="(\d+)',
+ webpage, 'episode number', default=None))
+
+ description = self._og_search_description(webpage, default=None) or self._html_search_meta(
+ 'description', webpage, 'description', default=None)