From 9e2f67ee5fe2bd3d740c64d1e4493a63f5d80911 Mon Sep 17 00:00:00 2001 From: David Hood <30076632+davidphood@users.noreply.github.com> Date: Thu, 28 Feb 2019 23:20:42 +1100 Subject: [PATCH] [abc.net.au:iview:series]: Playlist type changed to 'url'. This fixes issues where the incorrect extractor ID was used in the archive, allowing for two separate downloads (if you used both abc.net.au:iview and abc.net.au:iview:series). [abc.net.au:iview]: Added support for alternate episode url: https://iview.abc.net.au/programs// (as used by the series episode list href). --- youtube_dl/extractor/abc.py | 38 +++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/youtube_dl/extractor/abc.py b/youtube_dl/extractor/abc.py index e48c7dae6..86171acc6 100644 --- a/youtube_dl/extractor/abc.py +++ b/youtube_dl/extractor/abc.py @@ -105,7 +105,7 @@ class ABCIE(InfoExtractor): class ABCIViewIE(InfoExtractor): IE_NAME = 'abc.net.au:iview' - _VALID_URL = r'https?://iview\.abc\.net\.au/(?:[^/]+/)*video/(?P[^/?#]+)' + _VALID_URL = r'https?://iview\.abc\.net\.au/((?:[^/]+/)*video/|programs/(?:[^/]+/))(?P[^/?#]+)' _GEO_COUNTRIES = ['AU'] # ABC iview programs are normally available for 14 days only. @@ -131,11 +131,9 @@ class ABCIViewIE(InfoExtractor): video_id = self._match_id(url) video_params = self._download_json( 'https://iview.abc.net.au/api/programs/' + video_id, video_id) - return self._extract_from_video_params(video_id, video_params) - - def _extract_from_video_params(self, video_id, video_params): title = unescapeHTML(video_params.get('title') or video_params['seriesTitle']) stream = next(s for s in video_params['playlist'] if s.get('type') in ('program', 'livestream')) + house_number = video_params.get('episodeHouseNumber') or video_id path = '/auth/hls/sign?ts={0}&hn={1}&d=android-tablet'.format( int(time.time()), house_number) @@ -161,6 +159,7 @@ class ABCIViewIE(InfoExtractor): if formats: break self._sort_formats(formats) + subtitles = {} src_vtt = stream.get('captions', {}).get('src-vtt') if src_vtt: @@ -168,9 +167,11 @@ class ABCIViewIE(InfoExtractor): 'url': src_vtt, 'ext': 'vtt', }] + is_live = video_params.get('livestream') == '1' if is_live: title = self._live_title(title) + return { 'id': video_id, 'title': title, @@ -193,7 +194,7 @@ class ABCIViewIE(InfoExtractor): class ABCIViewSeriesIE(ABCIViewIE): - IE_NAME = 'abc.net.au:iview:show' + IE_NAME = 'abc.net.au:iview:series' _VALID_URL = r'https?://iview\.abc\.net\.au/show/(?P[^/?#]+)' _TESTS = [{ @@ -290,11 +291,28 @@ class ABCIViewSeriesIE(ABCIViewIE): entries = [] for episode in episodes: - href = episode.get('href') - video_id = episode.get('episodeHouseNumber') - video_params = self._download_json( - 'https://iview.abc.net.au/api/' + href, video_id) - entries.append(self._extract_from_video_params(video_id, video_params)) + video_id = house_number = episode.get('episodeHouseNumber') + title = unescapeHTML(episode.get('title') or episode['seriesTitle']) + entry = { + '_type': 'url', + 'url': 'https://iview.abc.net.au/' + episode.get('href'), + 'ie_key': ABCIViewIE.ie_key(), + 'id': video_id, + 'title': episode.get('title'), + 'description': episode.get('description'), + 'thumbnail': episode.get('thumbnail'), + 'duration': int_or_none(episode.get('duration')), + 'timestamp': parse_iso8601(episode.get('pubDate'), ' '), + 'series': unescapeHTML(episode.get('seriesTitle')), + 'series_id': episode.get('seriesHouseNumber') or video_id[:7], + 'season_number': int_or_none(self._search_regex( + r'\bSeries\s+(\d+)\b', title, 'season number', default=None)), + 'episode_number': int_or_none(self._search_regex( + r'\bEp\s+(\d+)\b', title, 'episode number', default=None)), + 'episode_id': house_number, + 'uploader_id': episode.get('channel'), + } + entries.append(entry) return { '_type': 'playlist',