]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/threeqsdn.py
1 from __future__
import unicode_literals
5 from .common
import InfoExtractor
6 from ..compat
import compat_HTTPError
17 class ThreeQSDNIE(InfoExtractor
):
20 _VALID_URL
= r
'https?://playout\.3qsdn\.com/(?P<id>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})'
22 # https://player.3qsdn.com/demo.html
23 'url': 'https://playout.3qsdn.com/7201c779-6b3c-11e7-a40e-002590c750be',
24 'md5': '64a57396b16fa011b15e0ea60edce918',
26 'id': '7201c779-6b3c-11e7-a40e-002590c750be',
30 'description': 'Video Ads Demo',
31 'timestamp': 1500334803,
32 'upload_date': '20170717',
38 'expected_warnings': ['Unknown MIME type application/mp4 in DASH manifest'],
41 'url': 'https://playout.3qsdn.com/66e68995-11ca-11e8-9273-002590c750be',
43 'id': '66e68995-11ca-11e8-9273-002590c750be',
45 'title': 're:^66e68995-11ca-11e8-9273-002590c750be [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
49 'skip_download': True, # m3u8 downloads
53 'url': 'http://playout.3qsdn.com/9edf36e0-6bf2-11e2-a16a-9acf09e2db48',
54 'only_matching': True,
56 # live audio stream with some 404 URLs
57 'url': 'http://playout.3qsdn.com/ac5c3186-777a-11e2-9c30-9acf09e2db48',
58 'only_matching': True,
60 # geo restricted with 'This content is not available in your country'
61 'url': 'http://playout.3qsdn.com/d63a3ffe-75e8-11e2-9c30-9acf09e2db48',
62 'only_matching': True,
64 # geo restricted with 'playout.3qsdn.com/forbidden'
65 'url': 'http://playout.3qsdn.com/8e330f26-6ae2-11e2-a16a-9acf09e2db48',
66 'only_matching': True,
68 # live video with rtmp link
69 'url': 'https://playout.3qsdn.com/6092bb9e-8f72-11e4-a173-002590c750be',
70 'only_matching': True,
72 # ondemand from http://www.philharmonie.tv/veranstaltung/26/
73 'url': 'http://playout.3qsdn.com/0280d6b9-1215-11e6-b427-0cc47a188158?protocol=http',
74 'only_matching': True,
77 'url': 'https://playout.3qsdn.com/d755d94b-4ab9-11e3-9162-0025907ad44f?js=true',
78 'only_matching': True,
82 def _extract_url(webpage
):
84 r
'<iframe[^>]+\b(?:data-)?src=(["\'])(?P
<url
>%s.*?
)\
1' % ThreeQSDNIE._VALID_URL, webpage)
86 return mobj.group('url
')
88 def _real_extract(self, url):
89 video_id = self._match_id(url)
92 config = self._download_json(
93 url.replace('://playout
.3qsdn
.com
/', '://playout
.3qsdn
.com
/config
/'), video_id)
94 except ExtractorError as e:
95 if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:
96 self.raise_geo_restricted()
99 live = config.get('streamContent
') == 'live
'
100 aspect = float_or_none(config.get('aspect
'))
104 for source_type, source in (config.get('sources
') or {}).items():
107 if source_type == 'dash
':
108 fmts, subs = self._extract_mpd_formats_and_subtitles(
109 source, video_id, mpd_id='mpd
', fatal=False)
111 subtitles = self._merge_subtitles(subtitles, subs)
112 elif source_type == 'hls
':
113 fmts, subs = self._extract_m3u8_formats_and_subtitles(
114 source, video_id, 'mp4
', 'm3u8
' if live else 'm3u8_native
',
115 m3u8_id='hls
', fatal=False)
117 subtitles = self._merge_subtitles(subtitles, subs)
118 elif source_type == 'progressive
':
121 if not (src and self._is_valid_url(src, video_id)):
123 ext = determine_ext(src)
124 height = int_or_none(s.get('height
'))
127 'format_id
': join_nonempty('http
', ext, height and '%dp
' % height),
129 'source_preference
': 0,
131 'vcodec
': 'none
' if height == 0 else None,
132 'width
': int(height * aspect) if height and aspect else None,
134 # It seems like this would be correctly handled by default
135 # However, unless someone can confirm this, the old
136 # behaviour is being kept as-is
137 self._sort_formats(formats, ('res
', 'source_preference
'))
139 for subtitle in (config.get('subtitles
') or []):
140 src = subtitle.get('src
')
143 subtitles.setdefault(subtitle.get('label
') or 'eng
', []).append({
147 title = config.get('title
') or video_id
152 'thumbnail
': config.get('poster
') or None,
153 'description
': config.get('description
') or None,
154 'timestamp
': parse_iso8601(config.get('upload_date
')),
155 'duration
': float_or_none(config.get('vlength
')) or None,
158 'subtitles
': subtitles,