]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/svt.py
2 from __future__
import unicode_literals
6 from .common
import InfoExtractor
15 class SVTBaseIE(InfoExtractor
):
16 _GEO_COUNTRIES
= ['SE']
18 def _extract_video(self
, video_info
, video_id
):
20 for vr
in video_info
['videoReferences']:
21 player_type
= vr
.get('playerType') or vr
.get('format')
23 ext
= determine_ext(vurl
)
25 formats
.extend(self
._extract
_m
3u8_formats
(
27 ext
='mp4', entry_protocol
='m3u8_native',
28 m3u8_id
=player_type
, fatal
=False))
30 formats
.extend(self
._extract
_f
4m
_formats
(
31 vurl
+ '?hdcore=3.3.0', video_id
,
32 f4m_id
=player_type
, fatal
=False))
34 if player_type
== 'dashhbbtv':
35 formats
.extend(self
._extract
_mpd
_formats
(
36 vurl
, video_id
, mpd_id
=player_type
, fatal
=False))
39 'format_id': player_type
,
42 if not formats
and video_info
.get('rights', {}).get('geoBlockedSweden'):
43 self
.raise_geo_restricted(
44 'This video is only available in Sweden',
45 countries
=self
._GEO
_COUNTRIES
)
46 self
._sort
_formats
(formats
)
49 subtitle_references
= dict_get(video_info
, ('subtitles', 'subtitleReferences'))
50 if isinstance(subtitle_references
, list):
51 for sr
in subtitle_references
:
52 subtitle_url
= sr
.get('url')
53 subtitle_lang
= sr
.get('language', 'sv')
55 if determine_ext(subtitle_url
) == 'm3u8':
56 # TODO(yan12125): handle WebVTT in m3u8 manifests
59 subtitles
.setdefault(subtitle_lang
, []).append({'url': subtitle_url
})
61 title
= video_info
.get('title')
63 series
= video_info
.get('programTitle')
64 season_number
= int_or_none(video_info
.get('season'))
65 episode
= video_info
.get('episodeTitle')
66 episode_number
= int_or_none(video_info
.get('episodeNumber'))
68 duration
= int_or_none(dict_get(video_info
, ('materialLength', 'contentDuration')))
71 video_info
, ('inappropriateForChildren', 'blockedForChildren'),
72 skip_false_values
=False)
74 age_limit
= 18 if adult
else 0
80 'subtitles': subtitles
,
82 'age_limit': age_limit
,
84 'season_number': season_number
,
86 'episode_number': episode_number
,
90 class SVTIE(SVTBaseIE
):
91 _VALID_URL
= r
'https?://(?:www\.)?svt\.se/wd\?(?:.*?&)?widgetId=(?P<widget_id>\d+)&.*?\barticleId=(?P<id>\d+)'
93 'url': 'http://www.svt.se/wd?widgetId=23991§ionId=541&articleId=2900353&type=embed&contextSectionId=123&autostart=false',
94 'md5': '33e9a5d8f646523ce0868ecfb0eed77d',
98 'title': 'Stjärnorna skojar till det - under SVT-intervjun',
105 def _extract_url(webpage
):
107 r
'(?:<iframe src|href)="(?P<url>%s[^"]*)"' % SVTIE
._VALID
_URL
, webpage
)
109 return mobj
.group('url')
111 def _real_extract(self
, url
):
112 mobj
= re
.match(self
._VALID
_URL
, url
)
113 widget_id
= mobj
.group('widget_id')
114 article_id
= mobj
.group('id')
116 info
= self
._download
_json
(
117 'http://www.svt.se/wd?widgetId=%s&articleId=%s&format=json&type=embed&output=json' % (widget_id
, article_id
),
120 info_dict
= self
._extract
_video
(info
['video'], article_id
)
121 info_dict
['title'] = info
['context']['title']
125 class SVTPlayIE(SVTBaseIE
):
126 IE_DESC
= 'SVT Play and Öppet arkiv'
127 _VALID_URL
= r
'https?://(?:www\.)?(?:svtplay|oppetarkiv)\.se/(?:video|klipp)/(?P<id>[0-9]+)'
129 'url': 'http://www.svtplay.se/video/5996901/flygplan-till-haile-selassie/flygplan-till-haile-selassie-2',
130 'md5': '2b6704fe4a28801e1a098bbf3c5ac611',
134 'title': 'Flygplan till Haile Selassie',
136 'thumbnail': r
're:^https?://.*[\.-]jpg$',
145 # geo restricted to Sweden
146 'url': 'http://www.oppetarkiv.se/video/5219710/trollflojten',
147 'only_matching': True,
149 'url': 'http://www.svtplay.se/klipp/9023742/stopptid-om-bjorn-borg',
150 'only_matching': True,
153 def _real_extract(self
, url
):
154 video_id
= self
._match
_id
(url
)
156 webpage
= self
._download
_webpage
(url
, video_id
)
158 data
= self
._parse
_json
(
160 r
'root\["__svtplay"\]\s*=\s*([^;]+);',
161 webpage
, 'embedded data', default
='{}'),
162 video_id
, fatal
=False)
164 thumbnail
= self
._og
_search
_thumbnail
(webpage
)
167 video_info
= try_get(
168 data
, lambda x
: x
['context']['dispatcher']['stores']['VideoTitlePageStore']['data']['video'],
171 info_dict
= self
._extract
_video
(video_info
, video_id
)
173 'title': data
['context']['dispatcher']['stores']['MetaStore']['title'],
174 'thumbnail': thumbnail
,
178 video_id
= self
._search
_regex
(
179 r
'<video[^>]+data-video-id=["\']([\da
-zA
-Z
-]+)',
180 webpage, 'video
id', default=None)
183 data = self._download_json(
184 'http
://www
.svt
.se
/videoplayer
-api
/video
/%s' % video_id, video_id)
185 info_dict = self._extract_video(data, video_id)
186 if not info_dict.get('title
'):
187 info_dict['title
'] = re.sub(
189 info_dict.get('episode
') or self._og_search_title(webpage))