]>
jfr.im git - yt-dlp.git/blob - youtube_dl/extractor/adultswim.py
2 from __future__
import unicode_literals
6 from . turner
import TurnerBaseIE
14 class AdultSwimIE ( TurnerBaseIE
):
15 _VALID_URL
= r
'https?://(?:www\.)?adultswim\.com/videos/(?P<show_path>[^/?#]+)(?:/(?P<episode_path>[^/?#]+))?'
18 'url' : 'http://adultswim.com/videos/rick-and-morty/pilot' ,
20 'id' : 'rQxZvXQ4ROaSOqq-or2Mow' ,
22 'title' : 'Rick and Morty - Pilot' ,
23 'description' : 'Rick moves in with his daughter \' s family and establishes himself as a bad influence on his grandson, Morty.' ,
24 'timestamp' : 1493267400 ,
25 'upload_date' : '20170427' ,
29 'skip_download' : True ,
31 'expected_warnings' : [ 'Unable to download f4m manifest' ],
33 'url' : 'http://www.adultswim.com/videos/tim-and-eric-awesome-show-great-job/dr-steve-brule-for-your-wine/' ,
35 'id' : 'sY3cMUR_TbuE4YmdjzbIcQ' ,
37 'title' : 'Tim and Eric Awesome Show Great Job! - Dr. Steve Brule, For Your Wine' ,
38 '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.' ,
39 'upload_date' : '20080124' ,
40 'timestamp' : 1201150800 ,
44 'skip_download' : True ,
47 'url' : 'http://www.adultswim.com/videos/decker/inside-decker-a-new-hero/' ,
49 'id' : 'I0LQFQkaSUaFp8PnAWHhoQ' ,
51 'title' : 'Decker - Inside Decker: A New Hero' ,
52 '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.' ,
53 'timestamp' : 1469480460 ,
54 'upload_date' : '20160725' ,
58 'skip_download' : True ,
60 'expected_warnings' : [ 'Unable to download f4m manifest' ],
62 'url' : 'http://www.adultswim.com/videos/attack-on-titan' ,
64 'id' : 'b7A69dzfRzuaXIECdxW8XQ' ,
65 'title' : 'Attack on Titan' ,
66 'description' : 'md5:6c8e003ea0777b47013e894767f5e114' ,
68 'playlist_mincount' : 12 ,
70 'url' : 'http://www.adultswim.com/videos/streams/williams-stream' ,
72 'id' : 'd8DEBj7QRfetLsRgFnGEyg' ,
74 'title' : r
're:^Williams Stream \d {4} -\d {2} -\d {2} \d {2} :\d {2} $' ,
75 'description' : 'original programming' ,
79 'skip_download' : True ,
83 def _real_extract ( self
, url
):
84 show_path
, episode_path
= re
. match ( self
._ VALID
_U RL
, url
). groups ()
85 display_id
= episode_path
or show_path
86 webpage
= self
._ download
_ webpage
( url
, display_id
)
87 initial_data
= self
._ parse
_ json
( self
._ search
_ regex
(
88 r
'AS_INITIAL_DATA(?:__)?\s*=\s*( {.+?} );' ,
89 webpage
, 'initial data' ), display_id
)
91 is_stream
= show_path
== 'streams'
94 episode_path
= 'live-stream'
96 video_data
= next ( stream
for stream_path
, stream
in initial_data
[ 'streams' ]. items () if stream_path
== episode_path
)
97 video_id
= video_data
. get ( 'stream' )
101 for episode
in video_data
. get ( 'archiveEpisodes' , []):
102 episode_url
= url_or_none ( episode
. get ( 'url' ))
105 entries
. append ( self
. url_result (
106 episode_url
, 'AdultSwim' , episode
. get ( 'id' )))
107 return self
. playlist_result (
108 entries
, video_data
. get ( 'id' ), video_data
. get ( 'title' ),
109 strip_or_none ( video_data
. get ( 'description' )))
111 show_data
= initial_data
[ 'show' ]
115 for video
in show_data
. get ( 'videos' , []):
116 slug
= video
. get ( 'slug' )
119 entries
. append ( self
. url_result (
120 'http://adultswim.com/videos/ %s / %s ' % ( show_path
, slug
),
121 'AdultSwim' , video
. get ( 'id' )))
122 return self
. playlist_result (
123 entries
, show_data
. get ( 'id' ), show_data
. get ( 'title' ),
124 strip_or_none ( show_data
. get ( 'metadata' , {}). get ( 'description' )))
126 video_data
= show_data
[ 'sluggedVideo' ]
127 video_id
= video_data
[ 'id' ]
129 info
= self
._ extract
_ cvp
_ info
(
130 'http://www.adultswim.com/videos/api/v0/assets?platform=desktop&id=' + video_id
,
133 'media_src' : 'http://androidhls-secure.cdn.turner.com/adultswim/big' ,
134 'tokenizer_src' : 'http://www.adultswim.com/astv/mvpd/processors/services/token_ipadAdobe.do' ,
138 'site_name' : 'AdultSwim' ,
139 'auth_required' : video_data
. get ( 'auth' ),
144 'display_id' : display_id
,
145 'description' : info
. get ( 'description' ) or strip_or_none ( video_data
. get ( 'description' )),
149 'duration' : info
. get ( 'duration' ) or int_or_none ( video_data
. get ( 'duration' )),
150 'timestamp' : info
. get ( 'timestamp' ) or int_or_none ( video_data
. get ( 'launch_date' )),
151 'season_number' : info
. get ( 'season_number' ) or int_or_none ( video_data
. get ( 'season_number' )),
152 'episode' : info
[ 'title' ],
153 'episode_number' : info
. get ( 'episode_number' ) or int_or_none ( video_data
. get ( 'episode_number' )),
156 info
[ 'series' ] = video_data
. get ( 'collection_title' ) or info
. get ( 'series' )
157 if info
[ 'series' ] and info
[ 'series' ] != info
[ 'title' ]:
158 info
[ 'title' ] = ' %s - %s ' % ( info
[ 'series' ], info
[ 'title' ])