]>
 
 
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' ])