From 8940aa036b25f83370896e4a8bfee887bb90e5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Sat, 13 Jul 2019 22:44:10 +0200 Subject: [PATCH 01/15] [televizeseznam] add support for televizeseznam.cz --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/televizeseznam.py | 85 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 youtube_dl/extractor/televizeseznam.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 1cab440f4..d7d1bc7ea 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1110,6 +1110,7 @@ from .telequebec import ( TeleQuebecLiveIE, ) from .teletask import TeleTaskIE +from .televizeseznam import TelevizeSeznamIE from .telewebion import TelewebionIE from .tennistv import TennisTVIE from .tenplay import TenPlayIE diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py new file mode 100644 index 000000000..21aef878f --- /dev/null +++ b/youtube_dl/extractor/televizeseznam.py @@ -0,0 +1,85 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import json + +from .common import InfoExtractor +from ..compat import compat_urlparse + + +class TelevizeSeznamIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/video/.+/(?P.+)' + + _API_BASE = 'https://www.televizeseznam.cz' + _GRAPHQL_URL = '%s/api/graphql' % _API_BASE + _GRAPHQL_QUERY = '''query LoadEpisode($urlName : String){ episode(urlName: $urlName){ ...VideoDetailFragmentOnEpisode } } + fragment VideoDetailFragmentOnEpisode on Episode { + id + spl + urlName + name + perex + } +''' + + _TEST = { + 'url': 'https://www.televizeseznam.cz/video/lajna/buh-57953890', + 'md5': '40c41ade1464a390a0b447e333df4239', + 'info_dict': { + 'id': 'buh-57953890', + 'title': 'Bůh', + 'ext': 'mp4', + } + } + + def extract_subtitles(self, spl_url, play_list): + + if not play_list: + return None + + subtitles = {} + for k, v in play_list.items(): + subtitles.update({ + v['language']: { + 'ext': 'srt', + 'url': compat_urlparse.urljoin(spl_url, v['urls']['srt']) + } + }) + return subtitles + + def extract_formats(self, spl_url, play_list, subtitles): + formats = [] + for r, v in play_list.items(): + formats.append({ + 'url': compat_urlparse.urljoin(spl_url, v['url']), + 'width': v['resolution'][0], + 'height': v['resolution'][1], + 'resolution': '%sx%s' % (v['resolution'][0], v['resolution'][1]), + 'protocol': 'https', + 'ext': 'mp4', + 'subtitles': subtitles, + }) + return formats + + def _real_extract(self, url): + video_id = self._match_id(url) + + data = self._download_json( + self._GRAPHQL_URL, video_id, 'Downloading GraphQL result', + data=json.dumps({ + 'query': self._GRAPHQL_QUERY, + 'variables': {'urlName': video_id} + }).encode('utf-8'), + headers={'Content-Type': 'application/json;charset=UTF-8'} + )['data'] + + spl_url = data['episode']['spl'] + play_list = self._download_json(spl_url + 'spl2,3', video_id, 'Downloading playlist')['data'] + subtitles = self.extract_subtitles(spl_url, play_list.get('subtitles')) + formats = self.extract_formats(spl_url, play_list['mp4'], subtitles) + + return { + 'id': video_id, + 'title': data['episode'].get('name'), + 'formats': formats + } From bd7328bbd7ddc5e4d851c5733b623a9afc763b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 17 Jul 2019 21:26:49 +0200 Subject: [PATCH 02/15] [televizeseznam] extract description from perex --- youtube_dl/extractor/televizeseznam.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 21aef878f..7813f5d08 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -28,6 +28,7 @@ class TelevizeSeznamIE(InfoExtractor): 'info_dict': { 'id': 'buh-57953890', 'title': 'Bůh', + 'description': 'Trenér Hrouzek je plný rozporů. Na pomoc si povolá i toho nejvyššího. Kdo to ale je? Pomůže mu vyřešit několik dilemat, která se mu v poslední době v životě nahromadila?', 'ext': 'mp4', } } @@ -81,5 +82,6 @@ class TelevizeSeznamIE(InfoExtractor): return { 'id': video_id, 'title': data['episode'].get('name'), + 'description': data['episode'].get('perex'), 'formats': formats } From eb88210ac39bd66cdb57316f96f857e5bc8a5e89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 17 Jul 2019 21:30:14 +0200 Subject: [PATCH 03/15] [televizeseznam] use urljoin from ..utils --- youtube_dl/extractor/televizeseznam.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 7813f5d08..cd55249d7 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import json from .common import InfoExtractor -from ..compat import compat_urlparse +from ..utils import urljoin class TelevizeSeznamIE(InfoExtractor): @@ -43,7 +43,7 @@ class TelevizeSeznamIE(InfoExtractor): subtitles.update({ v['language']: { 'ext': 'srt', - 'url': compat_urlparse.urljoin(spl_url, v['urls']['srt']) + 'url': urljoin(spl_url, v['urls']['srt']) } }) return subtitles @@ -52,7 +52,7 @@ class TelevizeSeznamIE(InfoExtractor): formats = [] for r, v in play_list.items(): formats.append({ - 'url': compat_urlparse.urljoin(spl_url, v['url']), + 'url': urljoin(spl_url, v['url']), 'width': v['resolution'][0], 'height': v['resolution'][1], 'resolution': '%sx%s' % (v['resolution'][0], v['resolution'][1]), From d7ac77111956f226f89e6484d0e2864ff4c421a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 17 Jul 2019 21:35:04 +0200 Subject: [PATCH 04/15] [televizeseznam] resolution is set automatically from width and height --- youtube_dl/extractor/televizeseznam.py | 1 - 1 file changed, 1 deletion(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index cd55249d7..0171a79d8 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -55,7 +55,6 @@ class TelevizeSeznamIE(InfoExtractor): 'url': urljoin(spl_url, v['url']), 'width': v['resolution'][0], 'height': v['resolution'][1], - 'resolution': '%sx%s' % (v['resolution'][0], v['resolution'][1]), 'protocol': 'https', 'ext': 'mp4', 'subtitles': subtitles, From 6dcd00474a9110daff3204281ea1fe8efbb99dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Thu, 18 Jul 2019 11:43:41 +0200 Subject: [PATCH 05/15] [televizeseznam] separate display_id from id --- youtube_dl/extractor/televizeseznam.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 0171a79d8..80a0eece3 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -2,13 +2,14 @@ from __future__ import unicode_literals import json +import re from .common import InfoExtractor from ..utils import urljoin class TelevizeSeznamIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/video/.+/(?P.+)' + _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/(?:.+\/)(?P.+)-(?P[0-9]+)' _API_BASE = 'https://www.televizeseznam.cz' _GRAPHQL_URL = '%s/api/graphql' % _API_BASE @@ -26,7 +27,8 @@ class TelevizeSeznamIE(InfoExtractor): 'url': 'https://www.televizeseznam.cz/video/lajna/buh-57953890', 'md5': '40c41ade1464a390a0b447e333df4239', 'info_dict': { - 'id': 'buh-57953890', + 'id': '57953890', + 'display_id': 'buh', 'title': 'Bůh', 'description': 'Trenér Hrouzek je plný rozporů. Na pomoc si povolá i toho nejvyššího. Kdo to ale je? Pomůže mu vyřešit několik dilemat, která se mu v poslední době v životě nahromadila?', 'ext': 'mp4', @@ -62,7 +64,7 @@ class TelevizeSeznamIE(InfoExtractor): return formats def _real_extract(self, url): - video_id = self._match_id(url) + display_id, video_id = re.match(self._VALID_URL, url).groups() data = self._download_json( self._GRAPHQL_URL, video_id, 'Downloading GraphQL result', @@ -80,6 +82,7 @@ class TelevizeSeznamIE(InfoExtractor): return { 'id': video_id, + 'display_id': display_id, 'title': data['episode'].get('name'), 'description': data['episode'].get('perex'), 'formats': formats From e021db8db6bcc620e017a6c52c8f37b33ce7c266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Tue, 14 Jan 2020 18:38:11 +0100 Subject: [PATCH 06/15] [televizeseznam] handle possible redirects Co-Authored-By: Ales Jirasek <6615474+schunka@users.noreply.github.com> --- youtube_dl/extractor/televizeseznam.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 80a0eece3..8c9ae80b5 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -75,8 +75,13 @@ class TelevizeSeznamIE(InfoExtractor): headers={'Content-Type': 'application/json;charset=UTF-8'} )['data'] - spl_url = data['episode']['spl'] - play_list = self._download_json(spl_url + 'spl2,3', video_id, 'Downloading playlist')['data'] + spl_url = data['episode']['spl'] + 'spl2,3' + metadata = self._download_json(spl_url, video_id, 'Downloading playlist') + if 'Location' in metadata and 'data' not in metadata: + # they sometimes wants to redirect + spl_url = metadata['Location'] + metadata = self._download_json(spl_url, video_id, 'Redirected -> Downloading playlist') + play_list = metadata['data'] subtitles = self.extract_subtitles(spl_url, play_list.get('subtitles')) formats = self.extract_formats(spl_url, play_list['mp4'], subtitles) From e87b23373b1c60fd32cd9bc9769c95298429cfb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Tue, 14 Jan 2020 18:43:35 +0100 Subject: [PATCH 07/15] [televizeseznam] store resoluitons to a format_id Co-Authored-By: Ales Jirasek <6615474+schunka@users.noreply.github.com> --- youtube_dl/extractor/televizeseznam.py | 1 + 1 file changed, 1 insertion(+) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 8c9ae80b5..1853a88b1 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -54,6 +54,7 @@ class TelevizeSeznamIE(InfoExtractor): formats = [] for r, v in play_list.items(): formats.append({ + 'format_id': r, 'url': urljoin(spl_url, v['url']), 'width': v['resolution'][0], 'height': v['resolution'][1], From dd46c55f92e399e2c012fa6533189023c29a3ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Tue, 14 Jan 2020 19:08:07 +0100 Subject: [PATCH 08/15] [televizeseznam] tabs to spaces --- youtube_dl/extractor/televizeseznam.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 1853a88b1..df55aedcd 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -14,13 +14,13 @@ class TelevizeSeznamIE(InfoExtractor): _API_BASE = 'https://www.televizeseznam.cz' _GRAPHQL_URL = '%s/api/graphql' % _API_BASE _GRAPHQL_QUERY = '''query LoadEpisode($urlName : String){ episode(urlName: $urlName){ ...VideoDetailFragmentOnEpisode } } - fragment VideoDetailFragmentOnEpisode on Episode { - id - spl - urlName - name - perex - } + fragment VideoDetailFragmentOnEpisode on Episode { + id + spl + urlName + name + perex + } ''' _TEST = { From 0ace168cea33abd598d24918a80f382f64f0859c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Tue, 14 Jan 2020 19:09:23 +0100 Subject: [PATCH 09/15] [televizeseznam] inline api_url to graphql_url --- youtube_dl/extractor/televizeseznam.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index df55aedcd..dd99f9e5b 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -11,8 +11,7 @@ from ..utils import urljoin class TelevizeSeznamIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/(?:.+\/)(?P.+)-(?P[0-9]+)' - _API_BASE = 'https://www.televizeseznam.cz' - _GRAPHQL_URL = '%s/api/graphql' % _API_BASE + _GRAPHQL_URL = 'https://www.televizeseznam.cz/api/graphql' _GRAPHQL_QUERY = '''query LoadEpisode($urlName : String){ episode(urlName: $urlName){ ...VideoDetailFragmentOnEpisode } } fragment VideoDetailFragmentOnEpisode on Episode { id From 4761dbc20e172101b99fde3cf0061e311e89de5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 15 Jan 2020 10:43:10 +0100 Subject: [PATCH 10/15] [televizeseznam] append width and height if resolution field exists --- youtube_dl/extractor/televizeseznam.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index dd99f9e5b..c911c6fb6 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -52,15 +52,18 @@ class TelevizeSeznamIE(InfoExtractor): def extract_formats(self, spl_url, play_list, subtitles): formats = [] for r, v in play_list.items(): - formats.append({ + format = { 'format_id': r, - 'url': urljoin(spl_url, v['url']), - 'width': v['resolution'][0], - 'height': v['resolution'][1], + 'url': urljoin(spl_url, v.get('url')), 'protocol': 'https', 'ext': 'mp4', 'subtitles': subtitles, - }) + } + if v.get('resolution'): + format.update({ 'width': v['resolution'][0], 'height': v['resolution'][1] }) + + formats.append(format) + return formats def _real_extract(self, url): From 77266983af9b6d3d805eb46567dbd4fb389f85f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 15 Jan 2020 10:46:54 +0100 Subject: [PATCH 11/15] [televizeseznam] remove useless group from VALID_URL pattern --- youtube_dl/extractor/televizeseznam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index c911c6fb6..b018d4f4e 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -9,7 +9,7 @@ from ..utils import urljoin class TelevizeSeznamIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/(?:.+\/)(?P.+)-(?P[0-9]+)' + _VALID_URL = r'https?://(?:www\.)?televizeseznam\.cz/.+/(?P.+)-(?P[0-9]+)' _GRAPHQL_URL = 'https://www.televizeseznam.cz/api/graphql' _GRAPHQL_QUERY = '''query LoadEpisode($urlName : String){ episode(urlName: $urlName){ ...VideoDetailFragmentOnEpisode } } From 792458fa264d0149483c434edaa6fa3f2877d3cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 15 Jan 2020 11:35:59 +0100 Subject: [PATCH 12/15] [televizeseznam] extract subtitles correctly --- youtube_dl/extractor/televizeseznam.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index b018d4f4e..fd5c44e10 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -41,15 +41,15 @@ class TelevizeSeznamIE(InfoExtractor): subtitles = {} for k, v in play_list.items(): - subtitles.update({ - v['language']: { - 'ext': 'srt', - 'url': urljoin(spl_url, v['urls']['srt']) - } - }) + if v.get('language'): + for ext in v.get('urls'): + subtitles.setdefault(v['language'], []).append({ + 'ext': ext, + 'url': urljoin(spl_url, v['urls'].get(ext)) + }) return subtitles - def extract_formats(self, spl_url, play_list, subtitles): + def extract_formats(self, spl_url, play_list): formats = [] for r, v in play_list.items(): format = { @@ -57,7 +57,6 @@ class TelevizeSeznamIE(InfoExtractor): 'url': urljoin(spl_url, v.get('url')), 'protocol': 'https', 'ext': 'mp4', - 'subtitles': subtitles, } if v.get('resolution'): format.update({ 'width': v['resolution'][0], 'height': v['resolution'][1] }) @@ -85,13 +84,13 @@ class TelevizeSeznamIE(InfoExtractor): spl_url = metadata['Location'] metadata = self._download_json(spl_url, video_id, 'Redirected -> Downloading playlist') play_list = metadata['data'] - subtitles = self.extract_subtitles(spl_url, play_list.get('subtitles')) - formats = self.extract_formats(spl_url, play_list['mp4'], subtitles) + formats = self.extract_formats(spl_url, play_list['mp4']) return { 'id': video_id, 'display_id': display_id, 'title': data['episode'].get('name'), 'description': data['episode'].get('perex'), + 'subtitles': self.extract_subtitles(spl_url, play_list.get('subtitles')), 'formats': formats } From 03b8e09319dc88f649eaa359b74b91b99d83b04b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Wed, 15 Jan 2020 16:43:35 +0100 Subject: [PATCH 13/15] [televizeseznam] extract all formats --- youtube_dl/extractor/televizeseznam.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index fd5c44e10..d37790204 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -49,19 +49,29 @@ class TelevizeSeznamIE(InfoExtractor): }) return subtitles - def extract_formats(self, spl_url, play_list): + def _extract(self, ext, spl_url, play_list): formats = [] for r, v in play_list.items(): format = { 'format_id': r, 'url': urljoin(spl_url, v.get('url')), 'protocol': 'https', - 'ext': 'mp4', + 'ext': ext } if v.get('resolution'): format.update({ 'width': v['resolution'][0], 'height': v['resolution'][1] }) formats.append(format) + return formats + + def extract_formats(self, spl_url, play_list): + formats = [] + + if play_list.get('http_stream') and play_list['http_stream'].get('qualities'): + formats.extend(self._extract(None, spl_url, play_list['http_stream']['qualities'])) + + if play_list.get('mp4'): + formats.extend(self._extract('mp4', spl_url, play_list['mp4'])) return formats @@ -84,7 +94,6 @@ class TelevizeSeznamIE(InfoExtractor): spl_url = metadata['Location'] metadata = self._download_json(spl_url, video_id, 'Redirected -> Downloading playlist') play_list = metadata['data'] - formats = self.extract_formats(spl_url, play_list['mp4']) return { 'id': video_id, @@ -92,5 +101,5 @@ class TelevizeSeznamIE(InfoExtractor): 'title': data['episode'].get('name'), 'description': data['episode'].get('perex'), 'subtitles': self.extract_subtitles(spl_url, play_list.get('subtitles')), - 'formats': formats + 'formats': self.extract_formats(spl_url, play_list) } From c18a5dbd3e0e02f2e1ed11113b94746b8b497267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Sat, 18 Jan 2020 22:27:22 +0100 Subject: [PATCH 14/15] [televizeseznam] fix flake8 check Co-Authored-By: Ales Jirasek <6615474+schunka@users.noreply.github.com> --- youtube_dl/extractor/televizeseznam.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index d37790204..72f92f3bb 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -44,8 +44,8 @@ class TelevizeSeznamIE(InfoExtractor): if v.get('language'): for ext in v.get('urls'): subtitles.setdefault(v['language'], []).append({ - 'ext': ext, - 'url': urljoin(spl_url, v['urls'].get(ext)) + 'ext': ext, + 'url': urljoin(spl_url, v['urls'].get(ext)) }) return subtitles @@ -59,7 +59,7 @@ class TelevizeSeznamIE(InfoExtractor): 'ext': ext } if v.get('resolution'): - format.update({ 'width': v['resolution'][0], 'height': v['resolution'][1] }) + format.update({'width': v['resolution'][0], 'height': v['resolution'][1]}) formats.append(format) return formats From c6a91444e16f3989210fc8e6915b0ae1c6576cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Van=C4=9Bk?= Date: Sat, 18 Jan 2020 23:35:50 +0100 Subject: [PATCH 15/15] [televizeseznam] sort formats --- youtube_dl/extractor/televizeseznam.py | 1 + 1 file changed, 1 insertion(+) diff --git a/youtube_dl/extractor/televizeseznam.py b/youtube_dl/extractor/televizeseznam.py index 72f92f3bb..914f4eee9 100644 --- a/youtube_dl/extractor/televizeseznam.py +++ b/youtube_dl/extractor/televizeseznam.py @@ -73,6 +73,7 @@ class TelevizeSeznamIE(InfoExtractor): if play_list.get('mp4'): formats.extend(self._extract('mp4', spl_url, play_list['mp4'])) + self._sort_formats(formats) return formats def _real_extract(self, url):