]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/threeqsdn.py
1 from __future__
import unicode_literals
5 from .common
import InfoExtractor
13 class ThreeQSDNIE(InfoExtractor
):
16 _VALID_URL
= r
'https?://playout\.3qsdn\.com/(?P<id>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})'
18 # ondemand from http://www.philharmonie.tv/veranstaltung/26/
19 'url': 'http://playout.3qsdn.com/0280d6b9-1215-11e6-b427-0cc47a188158?protocol=http',
20 'md5': 'ab040e37bcfa2e0c079f92cb1dd7f6cd',
22 'id': '0280d6b9-1215-11e6-b427-0cc47a188158',
24 'title': '0280d6b9-1215-11e6-b427-0cc47a188158',
27 'expected_warnings': ['Failed to download MPD manifest', 'Failed to parse JSON'],
30 'url': 'https://playout.3qsdn.com/d755d94b-4ab9-11e3-9162-0025907ad44f?js=true',
32 'id': 'd755d94b-4ab9-11e3-9162-0025907ad44f',
34 'title': 're:^d755d94b-4ab9-11e3-9162-0025907ad44f [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
38 'skip_download': True, # m3u8 downloads
40 'expected_warnings': ['Failed to download MPD manifest'],
43 'url': 'http://playout.3qsdn.com/9edf36e0-6bf2-11e2-a16a-9acf09e2db48',
44 'only_matching': True,
46 # live audio stream with some 404 URLs
47 'url': 'http://playout.3qsdn.com/ac5c3186-777a-11e2-9c30-9acf09e2db48',
48 'only_matching': True,
50 # geo restricted with 'This content is not available in your country'
51 'url': 'http://playout.3qsdn.com/d63a3ffe-75e8-11e2-9c30-9acf09e2db48',
52 'only_matching': True,
54 # geo restricted with 'playout.3qsdn.com/forbidden'
55 'url': 'http://playout.3qsdn.com/8e330f26-6ae2-11e2-a16a-9acf09e2db48',
56 'only_matching': True,
58 # live video with rtmp link
59 'url': 'https://playout.3qsdn.com/6092bb9e-8f72-11e4-a173-002590c750be',
60 'only_matching': True,
64 def _extract_url(webpage
):
66 r
'<iframe[^>]+\b(?:data-)?src=(["\'])(?P
<url
>%s.*?
)\
1' % ThreeQSDNIE._VALID_URL, webpage)
68 return mobj.group('url
')
70 def _real_extract(self, url):
71 video_id = self._match_id(url)
73 js = self._download_webpage(
74 'http
://playout
.3qsdn
.com
/%s' % video_id, video_id,
77 if any(p in js for p in (
78 '>This content
is not available
in your country
',
79 'playout
.3qsdn
.com
/forbidden
')):
80 self.raise_geo_restricted()
82 stream_content = self._search_regex(
83 r'streamContent\s
*:\s
*(["\'])(?P<content>.+?)\1', js,
84 'stream content', default='demand', group='content')
86 live = stream_content == 'live'
88 stream_type = self._search_regex(
89 r'streamType\s*:\s*(["\'])(?P
<type>audio|video
)\
1', js,
90 'stream
type', default='video
', group='type')
95 def extract_formats(item_url, item={}):
96 if not item_url or item_url in urls:
99 ext = mimetype2ext(item.get('type')) or determine_ext(item_url, default_ext=None)
101 formats.extend(self._extract_mpd_formats(
102 item_url, video_id, mpd_id='mpd
', fatal=False))
104 formats.extend(self._extract_m3u8_formats(
105 item_url, video_id, 'mp4
',
106 entry_protocol='m3u8
' if live else 'm3u8_native
',
107 m3u8_id='hls
', fatal=False))
109 formats.extend(self._extract_f4m_formats(
110 item_url, video_id, f4m_id='hds
', fatal=False))
112 if not self._is_valid_url(item_url, video_id):
116 'format_id
': item.get('quality
'),
117 'ext
': 'mp4
' if item_url.startswith('rtsp
') else ext,
118 'vcodec
': 'none
' if stream_type == 'audio
' else None,
121 for item_js in re.findall(r'({[^
{]*?
\b(?
:src|source
)\s
*:\s
*["\'].+?})', js):
122 f = self._parse_json(
123 item_js, video_id, transform_source=js_to_json, fatal=False)
126 extract_formats(f.get('src'), f)
128 # More relaxed version to collect additional URLs and acting
129 # as a future-proof fallback
130 for _, src in re.findall(r'\b(?:src|source)\s*:\s*(["\'])((?
:https?|rtsp
)://.+?
)\
1', js):
133 self._sort_formats(formats)
135 title = self._live_title(video_id) if live else video_id