]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/adultswim.py
2 from __future__
import unicode_literals
6 from . turner
import TurnerBaseIE
13 class AdultSwimIE ( TurnerBaseIE
):
14 _VALID_URL
= r
'https?://(?:www\.)?adultswim\.com/videos/(?P<show_path>[^/?#]+)(?:/(?P<episode_path>[^/?#]+))?'
17 'url' : 'http://adultswim.com/videos/rick-and-morty/pilot' ,
19 'id' : 'rQxZvXQ4ROaSOqq-or2Mow' ,
21 'title' : 'Rick and Morty - Pilot' ,
22 'description' : 'Rick moves in with his daughter \' s family and establishes himself as a bad influence on his grandson, Morty.' ,
23 'timestamp' : 1493267400 ,
24 'upload_date' : '20170427' ,
28 'skip_download' : True ,
30 'expected_warnings' : [ 'Unable to download f4m manifest' ],
32 'url' : 'http://www.adultswim.com/videos/tim-and-eric-awesome-show-great-job/dr-steve-brule-for-your-wine/' ,
34 'id' : 'sY3cMUR_TbuE4YmdjzbIcQ' ,
36 'title' : 'Tim and Eric Awesome Show Great Job! - Dr. Steve Brule, For Your Wine' ,
37 'description' : 'Dr. Brule reports live from Wine Country with a special report on wines. \n Watch Tim and Eric Awesome Show Great Job! episode #20, "Embarrassed" on Adult Swim.' ,
38 'upload_date' : '20080124' ,
39 'timestamp' : 1201150800 ,
43 'skip_download' : True ,
46 'url' : 'http://www.adultswim.com/videos/decker/inside-decker-a-new-hero/' ,
48 'id' : 'I0LQFQkaSUaFp8PnAWHhoQ' ,
50 'title' : 'Decker - Inside Decker: A New Hero' ,
51 'description' : 'The guys recap the conclusion of the season. They announce a new hero, take a peek into the Victorville Film Archive and welcome back the talented James Dean.' ,
52 'timestamp' : 1469480460 ,
53 'upload_date' : '20160725' ,
57 'skip_download' : True ,
59 'expected_warnings' : [ 'Unable to download f4m manifest' ],
61 'url' : 'http://www.adultswim.com/videos/attack-on-titan' ,
63 'id' : 'b7A69dzfRzuaXIECdxW8XQ' ,
64 'title' : 'Attack on Titan' ,
65 'description' : 'md5:6c8e003ea0777b47013e894767f5e114' ,
67 'playlist_mincount' : 12 ,
69 'url' : 'http://www.adultswim.com/videos/streams/williams-stream' ,
71 'id' : 'd8DEBj7QRfetLsRgFnGEyg' ,
73 'title' : r
're:^Williams Stream \d {4} -\d {2} -\d {2} \d {2} :\d {2} $' ,
74 'description' : 'original programming' ,
78 'skip_download' : True ,
82 def _real_extract ( self
, url
):
83 show_path
, episode_path
= re
. match ( self
._ VALID
_U RL
, url
). groups ()
84 display_id
= episode_path
or show_path
85 webpage
= self
._ download
_ webpage
( url
, display_id
)
86 initial_data
= self
._ parse
_ json
( self
._ search
_ regex
(
87 r
'AS_INITIAL_DATA(?:__)?\s*=\s*({.+?});' ,
88 webpage
, 'initial data' ), display_id
)
90 is_stream
= show_path
== 'streams'
93 episode_path
= 'live-stream'
95 video_data
= next ( stream
for stream_path
, stream
in initial_data
[ 'streams' ]. items () if stream_path
== episode_path
)
96 video_id
= video_data
. get ( 'stream' )
100 for episode
in video_data
. get ( 'archiveEpisodes' , []):
101 episode_url
= episode
. get ( 'url' )
104 entries
. append ( self
. url_result (
105 episode_url
, 'AdultSwim' , episode
. get ( 'id' )))
106 return self
. playlist_result (
107 entries
, video_data
. get ( 'id' ), video_data
. get ( 'title' ),
108 strip_or_none ( video_data
. get ( 'description' )))
110 show_data
= initial_data
[ 'show' ]
114 for video
in show_data
. get ( 'videos' , []):
115 slug
= video
. get ( 'slug' )
118 entries
. append ( self
. url_result (
119 'http://adultswim.com/videos/ %s / %s ' % ( show_path
, slug
),
120 'AdultSwim' , video
. get ( 'id' )))
121 return self
. playlist_result (
122 entries
, show_data
. get ( 'id' ), show_data
. get ( 'title' ),
123 strip_or_none ( show_data
. get ( 'metadata' , {}). get ( 'description' )))
125 video_data
= show_data
[ 'sluggedVideo' ]
126 video_id
= video_data
[ 'id' ]
128 info
= self
._ extract
_ cvp
_ info
(
129 'http://www.adultswim.com/videos/api/v0/assets?platform=desktop&id=' + video_id
,
132 'media_src' : 'http://androidhls-secure.cdn.turner.com/adultswim/big' ,
133 'tokenizer_src' : 'http://www.adultswim.com/astv/mvpd/processors/services/token_ipadAdobe.do' ,
137 'site_name' : 'AdultSwim' ,
138 'auth_required' : video_data
. get ( 'auth' ),
143 'display_id' : display_id
,
144 'description' : info
. get ( 'description' ) or strip_or_none ( video_data
. get ( 'description' )),
148 'duration' : info
. get ( 'duration' ) or int_or_none ( video_data
. get ( 'duration' )),
149 'timestamp' : info
. get ( 'timestamp' ) or int_or_none ( video_data
. get ( 'launch_date' )),
150 'season_number' : info
. get ( 'season_number' ) or int_or_none ( video_data
. get ( 'season_number' )),
151 'episode' : info
[ 'title' ],
152 'episode_number' : info
. get ( 'episode_number' ) or int_or_none ( video_data
. get ( 'episode_number' )),
155 info
[ 'series' ] = video_data
. get ( 'collection_title' ) or info
. get ( 'series' )
156 if info
[ 'series' ] and info
[ 'series' ] != info
[ 'title' ]:
157 info
[ 'title' ] = ' %s - %s ' % ( info
[ 'series' ], info
[ 'title' ])