1 # -*- coding: utf-8 -*-
2 from __future__ import unicode_literals
6 from .common import InfoExtractor
17 class WDRIE(InfoExtractor):
18 _PAGE_REGEX = r'/mediathek/(?P<media_type>[^/]+)/(?P<type>[^/]+)/(?P<display_id>.+)\.html'
19 _VALID_URL = r'(?P<page_url>https?://(?:www\d\.)?wdr\d?\.de)' + _PAGE_REGEX
21 _JS_URL_REGEX = r'(https?://deviceids-medp.wdr.de/ondemand/\d+/\d+\.js)'
25 'url': 'http://www1.wdr.de/mediathek/video/sendungen/doku-am-freitag/video-geheimnis-aachener-dom-100.html',
26 'md5': 'e58c39c3e30077141d258bf588700a7b',
30 'display_id': 'doku-am-freitag/video-geheimnis-aachener-dom-100',
31 'title': 'Geheimnis Aachener Dom',
32 'alt_title': 'Doku am Freitag',
33 'upload_date': '20160304',
34 'description': 'md5:87be8ff14d8dfd7a7ee46f0299b52318',
36 'subtitles': {'de': [{
37 'url': 'http://ondemand-ww.wdr.de/medp/fsk0/105/1058683/1058683_12220974.xml'
40 'skip': 'Page Not Found',
43 'url': 'http://www1.wdr.de/mediathek/audio/wdr3/wdr3-gespraech-am-samstag/audio-schriftstellerin-juli-zeh-100.html',
44 'md5': 'f4c1f96d01cf285240f53ea4309663d8',
48 'display_id': 'wdr3-gespraech-am-samstag/audio-schriftstellerin-juli-zeh-100',
49 'title': 'Schriftstellerin Juli Zeh',
50 'alt_title': 'WDR 3 Gespräch am Samstag',
51 'upload_date': '20160312',
52 'description': 'md5:e127d320bc2b1f149be697ce044a3dd7',
56 'skip': 'Page Not Found',
59 'url': 'http://www1.wdr.de/mediathek/video/live/index.html',
63 'display_id': 'index',
64 'title': r're:^WDR Fernsehen im Livestream [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
65 'alt_title': 'WDR Fernsehen Live',
67 'description': 'md5:ae2ff888510623bf8d4b115f95a9b7c9',
73 'url': 'http://www1.wdr.de/mediathek/video/sendungen/aktuelle-stunde/aktuelle-stunde-120.html',
74 'playlist_mincount': 10,
76 'id': 'aktuelle-stunde/aktuelle-stunde-120',
81 def _real_extract(self, url):
82 mobj = re.match(self._VALID_URL, url)
83 url_type = mobj.group('type')
84 page_url = mobj.group('page_url')
85 display_id = mobj.group('display_id')
86 webpage = self._download_webpage(url, display_id)
88 js_url = self._search_regex(self._JS_URL_REGEX, webpage, 'js_url', default=None)
92 self.url_result(page_url + href[0], 'WDR')
93 for href in re.findall(
94 r'<a href="(%s)"' % self._PAGE_REGEX,
98 if entries: # Playlist page
99 return self.playlist_result(entries, playlist_id=display_id)
101 raise ExtractorError('No downloadable streams found', expected=True)
103 js_data = self._download_webpage(js_url, 'metadata')
104 json_data = self._search_regex(r'\(({.*})\)', js_data, 'json')
105 metadata = self._parse_json(json_data, display_id)
107 metadata_tracker_data = metadata["trackerData"]
108 metadata_media_resource = metadata["mediaResource"]
112 # check if the metadata contains a direct URL to a file
113 metadata_media_alt = metadata_media_resource.get("alt")
114 if metadata_media_alt:
115 for tag_name in ["videoURL", 'audioURL']:
116 if tag_name in metadata_media_alt:
118 'url': metadata_media_alt[tag_name]
121 # check if there are flash-streams for this video
122 if "dflt" in metadata_media_resource and "videoURL" in metadata_media_resource["dflt"]:
123 video_url = metadata_media_resource["dflt"]["videoURL"]
124 if video_url.endswith('.f4m'):
125 full_video_url = video_url + '?hdcore=3.2.0&plugin=aasp-3.2.0.77.18'
126 formats.extend(self._extract_f4m_formats(full_video_url, display_id, f4m_id='hds', fatal=False))
127 elif video_url.endswith('.smil'):
128 formats.extend(self._extract_smil_formats(video_url, 'stream', fatal=False))
131 caption_url = metadata_media_resource.get("captionURL")
137 title = metadata_tracker_data.get("trackerClipTitle")
138 is_live = url_type == 'live'
141 title = self._live_title(title)
143 elif 'trackerClipAirTime' in metadata_tracker_data:
144 upload_date = metadata_tracker_data['trackerClipAirTime']
146 upload_date = self._html_search_meta('DC.Date', webpage, 'upload date')
149 upload_date = unified_strdate(upload_date)
151 self._sort_formats(formats)
154 'id': metadata_tracker_data.get("trackerClipId", display_id),
155 'display_id': display_id,
157 'alt_title': metadata_tracker_data.get("trackerClipSubcategory"),
159 'upload_date': upload_date,
160 'description': self._html_search_meta("Description", webpage),
162 'subtitles': subtitles,
166 class WDRMobileIE(InfoExtractor):
167 _VALID_URL = r'''(?x)
168 https?://mobile-ondemand\.wdr\.de/
169 .*?/fsk(?P<age_limit>[0-9]+)
171 (?P<id>[0-9]+)_(?P<title>[0-9]+)'''
172 IE_NAME = 'wdr:mobile'
174 'url': 'http://mobile-ondemand.wdr.de/CMS2010/mdb/ondemand/weltweit/fsk0/42/421735/421735_4283021.mp4',
181 'skip': 'Problems with loading data.'
184 def _real_extract(self, url):
185 mobj = re.match(self._VALID_URL, url)
187 'id': mobj.group('id'),
188 'title': mobj.group('title'),
189 'age_limit': int(mobj.group('age_limit')),
192 'User-Agent': 'mobile',
197 class WDRMausIE(InfoExtractor):
198 _VALID_URL = r'https?://(?:www\.)?wdrmaus\.de/(?:[^/]+/){,2}(?P<id>[^/?#]+)(?:/index\.php5|(?<!index)\.php5|/(?:$|[?#]))'
199 IE_DESC = 'Sendung mit der Maus'
201 'url': 'http://www.wdrmaus.de/aktuelle-sendung/index.php5',
203 'id': 'aktuelle-sendung',
205 'thumbnail': 're:^http://.+\.jpg',
206 'upload_date': 're:^[0-9]{8}$',
207 'title': 're:^[0-9.]{10} - Aktuelle Sendung$',
210 'url': 'http://www.wdrmaus.de/sachgeschichten/sachgeschichten/40_jahre_maus.php5',
211 'md5': '3b1227ca3ed28d73ec5737c65743b2a3',
213 'id': '40_jahre_maus',
215 'thumbnail': 're:^http://.+\.jpg',
216 'upload_date': '20131007',
217 'title': '12.03.2011 - 40 Jahre Maus',
221 def _real_extract(self, url):
222 video_id = self._match_id(url)
224 webpage = self._download_webpage(url, video_id)
225 param_code = self._html_search_regex(
226 r'<a href="\?startVideo=1&([^"]+)"', webpage, 'parameters')
228 title_date = self._search_regex(
229 r'<div class="sendedatum"><p>Sendedatum:\s*([0-9\.]+)</p>',
231 title_str = self._html_search_regex(
232 r'<h1>(.*?)</h1>', webpage, 'title')
233 title = '%s - %s' % (title_date, title_str)
234 upload_date = unified_strdate(
235 self._html_search_meta('dc.date', webpage))
237 fields = compat_parse_qs(param_code)
238 video_url = fields['firstVideo'][0]
239 thumbnail = compat_urlparse.urljoin(url, fields['startPicture'][0])
246 jscode = self._download_webpage(
247 'http://www.wdrmaus.de/codebase/js/extended-medien.min.js',
248 video_id, fatal=False,
249 note='Downloading URL translation table',
250 errnote='Could not download URL translation table')
252 for m in re.finditer(
253 r"stream:\s*'dslSrc=(?P<stream>[^']+)',\s*download:\s*'(?P<dl>[^']+)'\s*\}",
255 if video_url.startswith(m.group('stream')):
256 http_url = video_url.replace(
257 m.group('stream'), m.group('dl'))
264 self._sort_formats(formats)
270 'thumbnail': thumbnail,
271 'upload_date': upload_date,