diff options
author | Adrian Kretz <[email protected]> | 2014-12-06 18:28:21 +0100 |
---|---|---|
committer | Adrian Kretz <[email protected]> | 2014-12-06 19:05:22 +0100 |
commit | c84890f7082237b02a5fc61657b2ea513836a85e (patch) | |
tree | 2688bcf9060bf169b21a4a5261cfc6d206b6015a | |
parent | 6d0886204a920e64606688b1217835d10e47d281 (diff) | |
download | youtube-dl-c84890f7082237b02a5fc61657b2ea513836a85e.tar.gz youtube-dl-c84890f7082237b02a5fc61657b2ea513836a85e.zip |
[prosiebensat1] Add support for playlists (fixes #4357)
-rw-r--r-- | youtube_dl/extractor/prosiebensat1.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/youtube_dl/extractor/prosiebensat1.py b/youtube_dl/extractor/prosiebensat1.py index 32d747ede..c6e539e5a 100644 --- a/youtube_dl/extractor/prosiebensat1.py +++ b/youtube_dl/extractor/prosiebensat1.py @@ -8,6 +8,7 @@ from .common import InfoExtractor from ..utils import ( compat_urllib_parse, unified_strdate, + ExtractorError, ) @@ -152,6 +153,15 @@ class ProSiebenSat1IE(InfoExtractor): 'skip_download': True, }, }, + { + 'url': 'http://www.prosieben.de/tv/joko-gegen-klaas/videos/playlists/episode-8-ganze-folge-playlist', + 'info_dict': { + 'id': '439664', + 'title': 'Episode 8 - Ganze Folge - Playlist', + 'description': 'Das finale und härteste Duell aller Zeiten ist vorbei! Der Weltmeister für dieses Jahr steht! Alle packenden Duelle der achten Episode von "Joko gegen Klaas - das Duell um die Welt" seht ihr hier noch einmal in voller Länge!', + }, + 'playlist_count': 2, + }, ] _CLIPID_REGEXES = [ @@ -178,11 +188,48 @@ class ProSiebenSat1IE(InfoExtractor): r'<span style="padding-left: 4px;line-height:20px; color:#404040">(\d{2}\.\d{2}\.\d{4})</span>', r'(\d{2}\.\d{2}\.\d{4}) \| \d{2}:\d{2} Min<br/>', ] + _ITEM_TYPE_REGEXES = [ + r"'itemType'\s*:\s*'([^']*)'", + ] + _ITEM_ID_REGEXES = [ + r"'itemId'\s*:\s*'([^']*)'", + ] + _PLAYLIST_CLIPS_REGEXES = [ + r'data-qvt=.+?<a href="([^"]+)"', + ] def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) + item_type = self._html_search_regex(self._ITEM_TYPE_REGEXES, webpage, 'item type', default='CLIP') + if item_type == 'CLIP': + return self._clip_extract(url, webpage) + elif item_type == 'PLAYLIST': + playlist_id = self._html_search_regex(self._ITEM_ID_REGEXES, webpage, 'playlist id') + + for regex in self._PLAYLIST_CLIPS_REGEXES: + playlist_clips = re.findall(regex, webpage, re.DOTALL) + if playlist_clips: + title = self._html_search_regex(self._TITLE_REGEXES, webpage, 'title') + description = self._html_search_regex(self._DESCRIPTION_REGEXES, webpage, 'description', fatal=False) + root_url = re.match('(.+?//.+?)/', url).group(1) + + return { + '_type': 'playlist', + 'id': playlist_id, + 'title': title, + 'description': description, + 'entries': [self._clip_extract(root_url + clip_path) for clip_path in playlist_clips] + } + else: + raise ExtractorError('Unknown item type "%s"' % item_type) + + def _clip_extract(self, url, webpage=None): + if webpage is None: + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + clip_id = self._html_search_regex(self._CLIPID_REGEXES, webpage, 'clip id') access_token = 'testclient' |