]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/tbs.py
eab22c38f187c50334cb43f48535e8982ad847a3
2 from __future__
import unicode_literals
6 from . turner
import TurnerBaseIE
14 class TBSIE ( TurnerBaseIE
):
15 _VALID_URL
= r
'https?://(?:www\.)?(?P<site>tbs|tntdrama)\.com/(?:movies|shows/[^/]+/(?:clips|season-\d+/episode-\d+))/(?P<id>[^/?#]+)'
17 'url' : 'http://www.tntdrama.com/shows/the-alienist/clips/monster' ,
19 'id' : '8d384cde33b89f3a43ce5329de42903ed5099887' ,
22 'description' : 'Get a first look at the theatrical trailer for TNT’s highly anticipated new psychological thriller The Alienist, which premieres January 22 on TNT.' ,
23 'timestamp' : 1508175329 ,
24 'upload_date' : '20171016' ,
28 'skip_download' : True ,
31 'url' : 'http://www.tbs.com/shows/search-party/season-1/episode-1/explicit-the-mysterious-disappearance-of-the-girl-no-one-knew' ,
32 'only_matching' : True ,
34 'url' : 'http://www.tntdrama.com/movies/star-wars-a-new-hope' ,
35 'only_matching' : True ,
38 def _real_extract ( self
, url
):
39 site
, display_id
= re
. match ( self
._ VALID
_U RL
, url
). groups ()
40 webpage
= self
._ download
_ webpage
( url
, display_id
)
41 video_data
= self
._ parse
_ json
( self
._ search
_ regex
(
42 r
'<script[^>]+?data-drupal-selector="drupal-settings-json"[^>]*?>({.+?})</script>' ,
43 webpage
, 'drupal setting' ), display_id
)[ 'turner_playlist' ][ 0 ]
45 media_id
= video_data
[ 'mediaID' ]
46 title
= video_data
[ 'title' ]
48 streams_data
= self
._ download
_ json
(
49 'http://medium.ngtv.io/media/ %s /tv' % media_id
,
50 media_id
)[ 'media' ][ 'tv' ]
54 for supported_type
in ( 'unprotected' , 'bulkaes' ):
55 stream_data
= streams_data
. get ( supported_type
, {})
56 m3u8_url
= stream_data
. get ( 'secureUrl' ) or stream_data
. get ( 'url' )
59 if stream_data
. get ( 'playlistProtection' ) == 'spe' :
60 m3u8_url
= self
._ add
_ akamai
_ spe
_ token
(
61 'http://www. %s .com/service/token_spe' % site
,
64 'site_name' : site
[: 3 ]. upper (),
65 'auth_required' : video_data
. get ( 'authRequired' ) == '1' ,
67 formats
. extend ( self
._ extract
_ m
3u8_ formats
(
68 m3u8_url
, media_id
, 'mp4' , m3u8_id
= 'hls' , fatal
= False ))
70 duration
= float_or_none ( stream_data
. get ( 'totalRuntime' ) or video_data
. get ( 'duration' ))
73 for chapter
in stream_data
. get ( 'contentSegments' , []):
74 start_time
= float_or_none ( chapter
. get ( 'start' ))
75 duration
= float_or_none ( chapter
. get ( 'duration' ))
76 if start_time
is None or duration
is None :
79 'start_time' : start_time
,
80 'end_time' : start_time
+ duration
,
82 self
._ sort
_ formats
( formats
)
85 for image_id
, image
in video_data
. get ( 'images' , {}). items ():
86 image_url
= image
. get ( 'url' )
87 if not image_url
or image
. get ( 'type' ) != 'video' :
93 mobj
= re
. search ( r
'(\d+)x(\d+)' , image_url
)
96 'width' : int ( mobj
. group ( 1 )),
97 'height' : int ( mobj
. group ( 2 )),
104 'description' : strip_or_none ( video_data
. get ( 'descriptionNoTags' ) or video_data
. get ( 'shortDescriptionNoTags' )),
105 'duration' : duration
,
106 'timestamp' : int_or_none ( video_data
. get ( 'created' )),
107 'season_number' : int_or_none ( video_data
. get ( 'season' )),
108 'episode_number' : int_or_none ( video_data
. get ( 'episode' )),
109 'cahpters' : chapters
,
110 'thumbnails' : thumbnails
,