From c65c6fe2ee9963c48fc30f3c579ae84cb9ae22cc Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 30 Dec 2019 15:20:55 +0200 Subject: [PATCH 1/3] update ivi.ru extractor to get list of formats --- youtube_dl/extractor/ivi.py | 108 +++++++++++++++++------------------- 1 file changed, 51 insertions(+), 57 deletions(-) diff --git a/youtube_dl/extractor/ivi.py b/youtube_dl/extractor/ivi.py index a502e8806..8e12423a0 100644 --- a/youtube_dl/extractor/ivi.py +++ b/youtube_dl/extractor/ivi.py @@ -78,81 +78,75 @@ class IviIE(InfoExtractor): # Sorted by quality _KNOWN_FORMATS = ( 'MP4-low-mobile', 'MP4-mobile', 'FLV-lo', 'MP4-lo', 'FLV-hi', 'MP4-hi', - 'MP4-SHQ', 'MP4-HD720', 'MP4-HD1080') + 'MP4-SHQ', 'MP4-HD720', 'MP4-HD1080', 'VODDASH-MDRM-HD1080', 'VODHLS-FPS-HD1080', + 'DASH-MDRM-HD1080') def _real_extract(self, url): video_id = self._match_id(url) + session = self._get_cookies(url).get('sessivi') + if session: + session = session.value + data = json.dumps({ 'method': 'da.content.get', 'params': [ video_id, { + 'app_version': 5459, + 'session': session, 'site': 's%d', - 'referrer': 'http://www.ivi.ru/watch/%s' % video_id, + '_url': 'https://www.ivi.ru/watch/%s' % video_id, 'contentid': video_id } ] }) bundled = hasattr(sys, 'frozen') + site = 353 - for site in (353, 183): - content_data = (data % site).encode() - if site == 353: - if bundled: - continue - try: - from Cryptodome.Cipher import Blowfish - from Cryptodome.Hash import CMAC - pycryptodomex_found = True - except ImportError: - pycryptodomex_found = False - continue + content_data = (data % site).encode() + try: + from Cryptodome.Cipher import Blowfish + from Cryptodome.Hash import CMAC + except ImportError: + raise ExtractorError( + 'pycryptodomex not found. Please install it.', + expected=True) - timestamp = (self._download_json( - self._LIGHT_URL, video_id, - 'Downloading timestamp JSON', data=json.dumps({ - 'method': 'da.timestamp.get', - 'params': [] - }).encode(), fatal=False) or {}).get('result') - if not timestamp: - continue + timestamp = (self._download_json( + self._LIGHT_URL, video_id, + 'Downloading timestamp JSON', data=json.dumps({ + 'method': 'da.timestamp.get', + 'params': [] + }).encode(), fatal=False) or {}).get('result') - query = { - 'ts': timestamp, - 'sign': CMAC.new(self._LIGHT_KEY, timestamp.encode() + content_data, Blowfish).hexdigest(), - } - else: - query = {} + query = { + 'app_version': 5459, + 'ts': timestamp, + 'sign': CMAC.new(self._LIGHT_KEY, timestamp.encode() + content_data, Blowfish).hexdigest(), + } - video_json = self._download_json( - self._LIGHT_URL, video_id, - 'Downloading video JSON', data=content_data, query=query) + video_json = self._download_json( + self._LIGHT_URL, video_id, + 'Downloading video JSON', data=content_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 bundled: + raise ExtractorError( + 'This feature does not work from bundled exe. Run youtube-dl from sources.', + expected=True) + elif message: + extractor_msg += ': ' + message + raise ExtractorError(extractor_msg % video_id, expected=True) - 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 site == 353: - continue - elif bundled: - raise ExtractorError( - 'This feature does not work from bundled exe. Run youtube-dl from sources.', - expected=True) - elif not pycryptodomex_found: - raise ExtractorError( - 'pycryptodomex not found. Please install it.', - expected=True) - elif message: - extractor_msg += ': ' + message - raise ExtractorError(extractor_msg % video_id, expected=True) - else: - break result = video_json['result'] title = result['title'] @@ -163,8 +157,8 @@ class IviIE(InfoExtractor): 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 + # if not f_url or '-MDRM-' in content_format or '-FPS-' in content_format: + # continue formats.append({ 'url': f_url, 'format_id': content_format, From da7e91683629049d831c47c6f614b0eccb339f00 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 30 Dec 2019 21:47:47 +0200 Subject: [PATCH 2/3] ivi.ru notifies when all video formats are DRM-encrypted --- youtube_dl/extractor/ivi.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/youtube_dl/extractor/ivi.py b/youtube_dl/extractor/ivi.py index 8e12423a0..2dd1bcac7 100644 --- a/youtube_dl/extractor/ivi.py +++ b/youtube_dl/extractor/ivi.py @@ -78,8 +78,7 @@ class IviIE(InfoExtractor): # Sorted by quality _KNOWN_FORMATS = ( 'MP4-low-mobile', 'MP4-mobile', 'FLV-lo', 'MP4-lo', 'FLV-hi', 'MP4-hi', - 'MP4-SHQ', 'MP4-HD720', 'MP4-HD1080', 'VODDASH-MDRM-HD1080', 'VODHLS-FPS-HD1080', - 'DASH-MDRM-HD1080') + 'MP4-SHQ', 'MP4-HD720', 'MP4-HD1080') def _real_extract(self, url): video_id = self._match_id(url) @@ -157,14 +156,18 @@ class IviIE(InfoExtractor): 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 + 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')), }) + if len(formats) == 0: + raise ExtractorError( + 'All formats are DRM-crypted. They are not supported', + expected=True) self._sort_formats(formats) compilation = result.get('compilation') From 17bf73ee1acdc2dd99fd4f5e7e706ebe0469efbb Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 30 Dec 2019 21:51:23 +0200 Subject: [PATCH 3/3] rm empty line for flake8 --- youtube_dl/extractor/ivi.py | 1 - 1 file changed, 1 deletion(-) diff --git a/youtube_dl/extractor/ivi.py b/youtube_dl/extractor/ivi.py index 2dd1bcac7..ee74f49c1 100644 --- a/youtube_dl/extractor/ivi.py +++ b/youtube_dl/extractor/ivi.py @@ -146,7 +146,6 @@ class IviIE(InfoExtractor): extractor_msg += ': ' + message raise ExtractorError(extractor_msg % video_id, expected=True) - result = video_json['result'] title = result['title']