]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/tv4.py
2 from __future__
import unicode_literals
6 from . common
import InfoExtractor
13 class TV4IE ( InfoExtractor
):
14 IE_DESC
= 'tv4.se and tv4play.se'
15 _VALID_URL
= r
'''(?x)https?://(?:www\.)?
17 tv4\.se/(?:[^/]+)/klipp/(?:.*)-|
20 (?:program|barn)/(?:(?:[^/]+/) {1,2} |(?:[^\?]+)\?video_id=)|
26 _GEO_COUNTRIES
= [ 'SE' ]
29 'url' : 'http://www.tv4.se/kalla-fakta/klipp/kalla-fakta-5-english-subtitles-2491650' ,
30 'md5' : 'cb837212f342d77cec06e6dad190e96d' ,
34 'title' : 'Kalla Fakta 5 (english subtitles)' ,
35 'thumbnail' : r
're:^https?://.*\.jpg$' ,
37 'upload_date' : '20131125' ,
41 'url' : 'http://www.tv4play.se/iframe/video/3054113' ,
42 'md5' : 'cb837212f342d77cec06e6dad190e96d' ,
46 'title' : 'Så här jobbar ficktjuvarna - se avslöjande bilder' ,
47 'thumbnail' : r
're:^https?://.*\.jpg$' ,
48 'description' : 'Unika bilder avslöjar hur turisternas fickor vittjas mitt på Stockholms central. Två experter på ficktjuvarna avslöjar knepen du ska se upp för.' ,
50 'upload_date' : '20150130' ,
54 'url' : 'http://www.tv4play.se/sport/3060959' ,
55 'only_matching' : True ,
58 'url' : 'http://www.tv4play.se/film/2378136' ,
59 'only_matching' : True ,
62 'url' : 'http://www.tv4play.se/barn/looney-tunes?video_id=3062412' ,
63 'only_matching' : True ,
66 'url' : 'http://www.tv4play.se/program/farang/3922081' ,
67 'only_matching' : True ,
70 'url' : 'https://www.tv4play.se/program/nyheterna/avsnitt/13315940' ,
71 'only_matching' : True ,
75 def _real_extract ( self
, url
):
76 video_id
= self
._ match
_ id
( url
)
78 info
= self
._ download
_ json
(
79 'https://playback-api.b17g.net/asset/ %s ' % video_id
,
80 video_id
, 'Downloading video info JSON' , query
={
83 'protocol' : 'hls,dash' ,
89 manifest_url
= self
._ download
_ json
(
90 'https://playback-api.b17g.net/media/' + video_id
,
95 })[ 'playbackItem' ][ 'manifestUrl' ]
99 fmts
, subs
= self
._ extract
_ m
3u8_ formats
_ and
_ subtitles
(
100 manifest_url
, video_id
, 'mp4' ,
101 'm3u8_native' , m3u8_id
= 'hls' , fatal
= False )
103 subtitles
= self
._ merge
_ subtitles
( subtitles
, subs
)
105 fmts
, subs
= self
._ extract
_ mpd
_ formats
_ and
_ subtitles
(
106 manifest_url
. replace ( '.m3u8' , '.mpd' ),
107 video_id
, mpd_id
= 'dash' , fatal
= False )
109 subtitles
= self
._ merge
_ subtitles
( subtitles
, subs
)
111 fmts
= self
._ extract
_ f
4 m
_ formats
(
112 manifest_url
. replace ( '.m3u8' , '.f4m' ),
113 video_id
, f4m_id
= 'hds' , fatal
= False )
116 fmts
, subs
= self
._ extract
_ ism
_ formats
_ and
_ subtitles
(
117 re
. sub ( r
'\.ism/.*?\.m3u8' , r
'.ism/Manifest' , manifest_url
),
118 video_id
, ism_id
= 'mss' , fatal
= False )
120 subtitles
= self
._ merge
_ subtitles
( subtitles
, subs
)
122 if not formats
and info
. get ( 'is_geo_restricted' ):
123 self
. raise_geo_restricted ( countries
= self
._ GEO
_ COUNTRIES
, metadata_available
= True )
125 self
._ sort
_ formats
( formats
)
131 'subtitles' : subtitles
,
132 'description' : info
. get ( 'description' ),
133 'timestamp' : parse_iso8601 ( info
. get ( 'broadcast_date_time' )),
134 'duration' : int_or_none ( info
. get ( 'duration' )),
135 'thumbnail' : info
. get ( 'image' ),
136 'is_live' : info
. get ( 'isLive' ) is True ,
137 'series' : info
. get ( 'seriesTitle' ),
138 'season_number' : int_or_none ( info
. get ( 'seasonNumber' )),
139 'episode' : info
. get ( 'episodeTitle' ),
140 'episode_number' : int_or_none ( info
. get ( 'episodeNumber' )),