From e34e398a9cc96da692e3b40df83e0854fb8d27c3 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Mon, 12 Mar 2018 08:57:41 +0100 Subject: [PATCH 01/11] [tvnow] fix download-archive id should be string --- youtube_dl/extractor/tvnow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 1bf472444..b54823d31 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -178,7 +178,7 @@ class TVNowListIE(TVNowBaseIE): if not seo_url: continue entries.append(self.url_result( - base_url + seo_url + '/player', 'TVNow', info.get('id'))) + base_url + seo_url + '/player', 'TVNow', compat_str(info.get('id')))) return self.playlist_result( entries, compat_str(season.get('id') or season_id), title) From 944ccd828baa7f1c1f3fcb344b1b1847cfb35bf9 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Mon, 12 Mar 2018 11:26:31 +0100 Subject: [PATCH 02/11] [tvnow] added tvnow-channel --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/tvnow.py | 40 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 6d6ae89f8..0a1a7b44c 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1134,6 +1134,7 @@ from .tvnoe import TVNoeIE from .tvnow import ( TVNowIE, TVNowListIE, + TVNowListChannelIE, ) from .tvp import ( TVPEmbedIE, diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index b54823d31..6ba7cac24 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -182,3 +182,43 @@ class TVNowListIE(TVNowBaseIE): return self.playlist_result( entries, compat_str(season.get('id') or season_id), title) + + +class TVNowListChannelIE(TVNowBaseIE): + _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+))$' + + _SHOW_FIELDS = ('id', 'title', ) + _SEASON_FIELDS = ('id', 'headline', 'seoheadline', ) + + _TESTS = [{ + 'url': 'https://www.tvnow.at/vox/ab-ins-beet', + 'info_dict': { + 'id': '172', + 'title': 'Ab ins Beet!', + }, + 'playlist_mincount': 1, + }] + + def _real_extract(self, url): + base_url, show_id = re.match(self._VALID_URL, url).groups() + + fields = [] + fields.extend(self._SHOW_FIELDS) + fields.extend('formatTabs.%s' % field for field in self._SEASON_FIELDS) + + list_info = self._call_api( + 'formats/seo', show_id, query={ + 'fields': ','.join(fields), + 'name': show_id + '.php' + }) + + entries = [] + for season_info in list_info['formatTabs']['items']: + season_url = season_info.get('seoheadline') + if not season_url: + continue + entries.append(self.url_result( + base_url + "/list/" + season_url, 'TVNowList', compat_str(season_info.get('id')), season_info.get('headline'))) + + return self.playlist_result( + entries, compat_str(list_info['id']), compat_str(list_info['title'] or show_id)) From 1790c32d6f981b5fa08ae4ab22cee89bbd66a969 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 13 Mar 2018 10:06:00 +0100 Subject: [PATCH 03/11] changed compat_str to str --- youtube_dl/extractor/tvnow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 6ba7cac24..5b469a990 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -178,7 +178,7 @@ class TVNowListIE(TVNowBaseIE): if not seo_url: continue entries.append(self.url_result( - base_url + seo_url + '/player', 'TVNow', compat_str(info.get('id')))) + base_url + seo_url + '/player', 'TVNow', str(info.get('id')))) return self.playlist_result( entries, compat_str(season.get('id') or season_id), title) From c8ab16c9aae06d130cb35cd488bc57197a21f1c8 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 13 Mar 2018 11:22:18 +0100 Subject: [PATCH 04/11] changes for pull request --- youtube_dl/extractor/tvnow.py | 49 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 5b469a990..a9924c25a 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -26,6 +26,24 @@ class TVNowBaseIE(InfoExtractor): 'https://api.tvnow.de/v3/' + path, video_id, query=query) + def _extend_query(self, show, season, video=None): + fields = [] + fields.extend(show) + fields.extend('formatTabs.%s' % field for field in season) + if video: + fields.extend( + 'formatTabs.formatTabPages.container.movies.%s' % field + for field in video) + + return fields + + def _tvnow_list_info(self, list_id, show_id, fields): + return self._call_api( + 'formats/seo', list_id, query={ + 'fields': ','.join(fields), + 'name': show_id + '.php' + }) + def _extract_video(self, info, display_id): video_id = compat_str(info['id']) title = info['title'] @@ -152,18 +170,8 @@ class TVNowListIE(TVNowBaseIE): def _real_extract(self, url): base_url, show_id, season_id = re.match(self._VALID_URL, url).groups() - fields = [] - fields.extend(self._SHOW_FIELDS) - fields.extend('formatTabs.%s' % field for field in self._SEASON_FIELDS) - fields.extend( - 'formatTabs.formatTabPages.container.movies.%s' % field - for field in self._VIDEO_FIELDS) - - list_info = self._call_api( - 'formats/seo', season_id, query={ - 'fields': ','.join(fields), - 'name': show_id + '.php' - }) + fields = self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS, self._VIDEO_FIELDS) + list_info = self._tvnow_list_info(season_id, show_id, fields) season = next( season for season in list_info['formatTabs']['items'] @@ -185,7 +193,7 @@ class TVNowListIE(TVNowBaseIE): class TVNowListChannelIE(TVNowBaseIE): - _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+))$' + _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+))' _SHOW_FIELDS = ('id', 'title', ) _SEASON_FIELDS = ('id', 'headline', 'seoheadline', ) @@ -193,7 +201,7 @@ class TVNowListChannelIE(TVNowBaseIE): _TESTS = [{ 'url': 'https://www.tvnow.at/vox/ab-ins-beet', 'info_dict': { - 'id': '172', + 'id': 172, 'title': 'Ab ins Beet!', }, 'playlist_mincount': 1, @@ -202,15 +210,8 @@ class TVNowListChannelIE(TVNowBaseIE): def _real_extract(self, url): base_url, show_id = re.match(self._VALID_URL, url).groups() - fields = [] - fields.extend(self._SHOW_FIELDS) - fields.extend('formatTabs.%s' % field for field in self._SEASON_FIELDS) - - list_info = self._call_api( - 'formats/seo', show_id, query={ - 'fields': ','.join(fields), - 'name': show_id + '.php' - }) + fields = self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS, self._VIDEO_FIELDS) + list_info = self._tvnow_list_info(show_id, show_id, fields) entries = [] for season_info in list_info['formatTabs']['items']: @@ -221,4 +222,4 @@ class TVNowListChannelIE(TVNowBaseIE): base_url + "/list/" + season_url, 'TVNowList', compat_str(season_info.get('id')), season_info.get('headline'))) return self.playlist_result( - entries, compat_str(list_info['id']), compat_str(list_info['title'] or show_id)) + entries, list_info['id'], list_info['title']) From e02ed3728c9f0aaf96a2988d6f5e14c6a07f324c Mon Sep 17 00:00:00 2001 From: AndroKev Date: Wed, 14 Mar 2018 11:28:57 +0100 Subject: [PATCH 05/11] regex fix --- youtube_dl/extractor/tvnow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index a9924c25a..247bd0659 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -193,7 +193,7 @@ class TVNowListIE(TVNowBaseIE): class TVNowListChannelIE(TVNowBaseIE): - _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+))' + _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+)$)' _SHOW_FIELDS = ('id', 'title', ) _SEASON_FIELDS = ('id', 'headline', 'seoheadline', ) From c796466c0503f1d74dd7f0a777c9ac9599fc0fc0 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 20 Mar 2018 18:03:59 +0100 Subject: [PATCH 06/11] archive id bugfix --- youtube_dl/extractor/tvnow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 247bd0659..a1501b709 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -185,8 +185,9 @@ class TVNowListIE(TVNowBaseIE): seo_url = info.get('seoUrl') if not seo_url: continue + entries.append(self.url_result( - base_url + seo_url + '/player', 'TVNow', str(info.get('id')))) + base_url + seo_url + '/player', 'TVNow', str(info.get('id', seo_url)))) return self.playlist_result( entries, compat_str(season.get('id') or season_id), title) From 1eb2642c1b68610beb015d026bfd9dcadb5106d4 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 20 Mar 2018 18:05:54 +0100 Subject: [PATCH 07/11] removed fatal playlist-id/title --- youtube_dl/extractor/tvnow.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index a1501b709..4354a35aa 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -222,5 +222,4 @@ class TVNowListChannelIE(TVNowBaseIE): entries.append(self.url_result( base_url + "/list/" + season_url, 'TVNowList', compat_str(season_info.get('id')), season_info.get('headline'))) - return self.playlist_result( - entries, list_info['id'], list_info['title']) + return self.playlist_result(entries) From 826b775919cd329c2429d31956041073dfff8b7f Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 20 Mar 2018 18:12:09 +0100 Subject: [PATCH 08/11] removed unneeded code --- youtube_dl/extractor/tvnow.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 4354a35aa..45a9e5ab3 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -170,8 +170,7 @@ class TVNowListIE(TVNowBaseIE): def _real_extract(self, url): base_url, show_id, season_id = re.match(self._VALID_URL, url).groups() - fields = self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS, self._VIDEO_FIELDS) - list_info = self._tvnow_list_info(season_id, show_id, fields) + list_info = self._tvnow_list_info(season_id, show_id, self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS, self._VIDEO_FIELDS)) season = next( season for season in list_info['formatTabs']['items'] @@ -185,7 +184,7 @@ class TVNowListIE(TVNowBaseIE): seo_url = info.get('seoUrl') if not seo_url: continue - + entries.append(self.url_result( base_url + seo_url + '/player', 'TVNow', str(info.get('id', seo_url)))) @@ -211,8 +210,7 @@ class TVNowListChannelIE(TVNowBaseIE): def _real_extract(self, url): base_url, show_id = re.match(self._VALID_URL, url).groups() - fields = self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS, self._VIDEO_FIELDS) - list_info = self._tvnow_list_info(show_id, show_id, fields) + list_info = self._tvnow_list_info(show_id, show_id, self._extend_query(self._SHOW_FIELDS, self._SEASON_FIELDS)) entries = [] for season_info in list_info['formatTabs']['items']: From 47dc6df583b59986408e8945ad7f30335df1943b Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 20 Mar 2018 20:36:17 +0100 Subject: [PATCH 09/11] moved list-function into seperate class --- youtube_dl/extractor/tvnow.py | 42 ++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 45a9e5ab3..f8dc28f35 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -26,24 +26,6 @@ class TVNowBaseIE(InfoExtractor): 'https://api.tvnow.de/v3/' + path, video_id, query=query) - def _extend_query(self, show, season, video=None): - fields = [] - fields.extend(show) - fields.extend('formatTabs.%s' % field for field in season) - if video: - fields.extend( - 'formatTabs.formatTabPages.container.movies.%s' % field - for field in video) - - return fields - - def _tvnow_list_info(self, list_id, show_id, fields): - return self._call_api( - 'formats/seo', list_id, query={ - 'fields': ','.join(fields), - 'name': show_id + '.php' - }) - def _extract_video(self, info, display_id): video_id = compat_str(info['id']) title = info['title'] @@ -151,7 +133,27 @@ class TVNowIE(TVNowBaseIE): return self._extract_video(info, display_id) -class TVNowListIE(TVNowBaseIE): +class TVNowListBaseIE(TVNowBaseIE): + def _extend_query(self, show, season, video=None): + fields = [] + fields.extend(show) + fields.extend('formatTabs.%s' % field for field in season) + if video: + fields.extend( + 'formatTabs.formatTabPages.container.movies.%s' % field + for field in video) + + return fields + + def _tvnow_list_info(self, list_id, show_id, fields): + return self._call_api( + 'formats/seo', list_id, query={ + 'fields': ','.join(fields), + 'name': show_id + '.php' + }) + + +class TVNowListIE(TVNowListBaseIE): _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+)/)list/(?P[^?/#&]+)$' _SHOW_FIELDS = ('title', ) @@ -192,7 +194,7 @@ class TVNowListIE(TVNowBaseIE): entries, compat_str(season.get('id') or season_id), title) -class TVNowListChannelIE(TVNowBaseIE): +class TVNowListChannelIE(TVNowListBaseIE): _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+)$)' _SHOW_FIELDS = ('id', 'title', ) From 07fc0104f72cfcf42b53475b561b00948fd604c8 Mon Sep 17 00:00:00 2001 From: AndroKev Date: Tue, 20 Mar 2018 21:22:49 +0100 Subject: [PATCH 10/11] regex change and use of suitable --- youtube_dl/extractor/tvnow.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index f8dc28f35..99277fdb9 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -195,20 +195,20 @@ class TVNowListIE(TVNowListBaseIE): class TVNowListChannelIE(TVNowListBaseIE): - _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+)$)' + _VALID_URL = r'(?Phttps?://(?:www\.)?tvnow\.(?:de|at|ch)/(?:rtl(?:2|plus)?|nitro|superrtl|ntv|vox)/(?P[^/]+))' _SHOW_FIELDS = ('id', 'title', ) _SEASON_FIELDS = ('id', 'headline', 'seoheadline', ) _TESTS = [{ 'url': 'https://www.tvnow.at/vox/ab-ins-beet', - 'info_dict': { - 'id': 172, - 'title': 'Ab ins Beet!', - }, - 'playlist_mincount': 1, + 'only_matching': 'True', }] + @classmethod + def suitable(cls, url): + return False if TVNowIE.suitable(url) or TVNowListIE.suitable(url) else super(TVNowListChannelIE, cls).suitable(url) + def _real_extract(self, url): base_url, show_id = re.match(self._VALID_URL, url).groups() From 1b203ca5d875945a423453c2e7e33c675648ec1b Mon Sep 17 00:00:00 2001 From: AndroKev Date: Mon, 26 Mar 2018 21:09:45 +0200 Subject: [PATCH 11/11] get correct episodenthumbnail --- youtube_dl/extractor/tvnow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube_dl/extractor/tvnow.py b/youtube_dl/extractor/tvnow.py index 99277fdb9..8e0ac6be5 100644 --- a/youtube_dl/extractor/tvnow.py +++ b/youtube_dl/extractor/tvnow.py @@ -19,7 +19,7 @@ class TVNowBaseIE(InfoExtractor): 'id', 'title', 'free', 'geoblocked', 'articleLong', 'articleShort', 'broadcastStartDate', 'isDrm', 'duration', 'season', 'episode', 'manifest.dashclear', 'format.title', 'format.defaultImage169Format', - 'format.defaultImage169Logo') + 'format.defaultImage169Logo', 'replaceMovieInformation') def _call_api(self, path, video_id, query): return self._download_json( @@ -58,7 +58,7 @@ class TVNowBaseIE(InfoExtractor): duration = parse_duration(info.get('duration')) f = info.get('format', {}) - thumbnail = f.get('defaultImage169Format') or f.get('defaultImage169Logo') + thumbnail = ('https://aistvnow-a.akamaihd.net/tvnow/movie/%s' % info.get('replaceMovieInformation')) or f.get('defaultImage169Format') or f.get('defaultImage169Logo') return { 'id': video_id,