aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl
diff options
context:
space:
mode:
authorAdrian Kretz <adriankretz@gmail.com>2014-12-06 18:28:21 +0100
committerAdrian Kretz <adriankretz@gmail.com>2014-12-06 19:05:22 +0100
commitc84890f7082237b02a5fc61657b2ea513836a85e (patch)
tree2688bcf9060bf169b21a4a5261cfc6d206b6015a /youtube_dl
parent6d0886204a920e64606688b1217835d10e47d281 (diff)
[prosiebensat1] Add support for playlists (fixes #4357)
Diffstat (limited to 'youtube_dl')
-rw-r--r--youtube_dl/extractor/prosiebensat1.py47
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'