]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/adultswim.py 
989505c8232abf53f99d0af594c84e45f8778eb0
   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<is_playlist>playlists/)?(?P<show_path>[^/]+)/(?P<episode_path>[^/?#]+)/?'   17          'url' :  'http://adultswim.com/videos/rick-and-morty/pilot' ,   20                  'md5' :  '247572debc75c7652f253c8daa51a14d' ,   22                      'id' :  'rQxZvXQ4ROaSOqq-or2Mow-0' ,   24                      'title' :  'Rick and Morty - Pilot Part 1' ,   25                      'description' :  "Rick moves in with his daughter's family and establishes himself as a bad influence on his grandson, Morty. "   29                  'md5' :  '77b0e037a4b20ec6b98671c4c379f48d' ,   31                      'id' :  'rQxZvXQ4ROaSOqq-or2Mow-3' ,   33                      'title' :  'Rick and Morty - Pilot Part 4' ,   34                      'description' :  "Rick moves in with his daughter's family and establishes himself as a bad influence on his grandson, Morty. "   39              'id' :  'rQxZvXQ4ROaSOqq-or2Mow' ,   40              'title' :  'Rick and Morty - Pilot' ,   41              'description' :  "Rick moves in with his daughter's family and establishes himself as a bad influence on his grandson, Morty. "   43          'skip' :  'This video is only available for registered users' ,   45          'url' :  'http://www.adultswim.com/videos/playlists/american-parenting/putting-francine-out-of-business/' ,   48                  'md5' :  '2eb5c06d0f9a1539da3718d897f13ec5' ,   50                      'id' :  '-t8CamQlQ2aYZ49ItZCFog-0' ,   52                      'title' :  'American Dad - Putting Francine Out of Business' ,   53                      'description' :  'Stan hatches a plan to get Francine out of the real estate business.Watch more American Dad on [adult swim].'   58              'id' :  '-t8CamQlQ2aYZ49ItZCFog' ,   59              'title' :  'American Dad - Putting Francine Out of Business' ,   60              'description' :  'Stan hatches a plan to get Francine out of the real estate business.Watch more American Dad on [adult swim].'   63          'url' :  'http://www.adultswim.com/videos/tim-and-eric-awesome-show-great-job/dr-steve-brule-for-your-wine/' ,   66                  'md5' :  '3e346a2ab0087d687a05e1e7f3b3e529' ,   68                      'id' :  'sY3cMUR_TbuE4YmdjzbIcQ-0' ,   70                      'title' :  'Tim and Eric Awesome Show Great Job! - Dr. Steve Brule, For Your Wine' ,   71                      'description' :  'Dr. Brule reports live from Wine Country with a special report on wines.   \r\n Watch Tim and Eric Awesome Show Great Job! episode #20, "Embarrassed" on Adult Swim. \r\n\r\n ' ,   76              'id' :  'sY3cMUR_TbuE4YmdjzbIcQ' ,   77              'title' :  'Tim and Eric Awesome Show Great Job! - Dr. Steve Brule, For Your Wine' ,   78              'description' :  'Dr. Brule reports live from Wine Country with a special report on wines.   \r\n Watch Tim and Eric Awesome Show Great Job! episode #20, "Embarrassed" on Adult Swim. \r\n\r\n ' ,   82              'skip_download' :  True ,   85          # heroMetadata.trailer   86          'url' :  'http://www.adultswim.com/videos/decker/inside-decker-a-new-hero/' ,   88              'id' :  'I0LQFQkaSUaFp8PnAWHhoQ' ,   90              'title' :  'Decker - Inside Decker: A New Hero' ,   91              'description' :  'md5:c916df071d425d62d70c86d4399d3ee0' ,   96              'skip_download' :  True ,   98          'expected_warnings' : [ 'Unable to download f4m manifest' ],  100          'url' :  'http://www.adultswim.com/videos/toonami/friday-october-14th-2016/' ,  102              'id' :  'eYiLsKVgQ6qTC6agD67Sig' ,  103              'title' :  'Toonami - Friday, October 14th, 2016' ,  104              'description' :  'md5:99892c96ffc85e159a428de85c30acde' ,  109                  'id' :  'eYiLsKVgQ6qTC6agD67Sig' ,  111                  'title' :  'Toonami - Friday, October 14th, 2016' ,  112                  'description' :  'md5:99892c96ffc85e159a428de85c30acde' ,  117              'skip_download' :  True ,  119          'expected_warnings' : [ 'Unable to download f4m manifest' ],  123      def  find_video_info ( collection
,  slug
):  124          for  video 
in  collection
. get ( 'videos' ):  125              if  video
. get ( 'slug' ) ==  slug
:  129      def  find_collection_by_linkURL ( collections
,  linkURL
):  130          for  collection 
in  collections
:  131              if  collection
. get ( 'linkURL' ) ==  linkURL
:  135      def  find_collection_containing_video ( collections
,  slug
):  136          for  collection 
in  collections
:  137              for  video 
in  collection
. get ( 'videos' ):  138                  if  video
. get ( 'slug' ) ==  slug
:  139                      return  collection
,  video
 142      def  _real_extract ( self
,  url
):  143          mobj 
=  re
. match ( self
._ VALID
_U RL
,  url
)  144          show_path 
=  mobj
. group ( 'show_path' )  145          episode_path 
=  mobj
. group ( 'episode_path' )  146          is_playlist 
=  True if  mobj
. group ( 'is_playlist' )  else False  148          webpage 
=  self
._ download
_ webpage
( url
,  episode_path
)  150          # Extract the value of `bootstrappedData` from the Javascript in the page.  151          bootstrapped_data 
=  self
._ parse
_ json
( self
._ search
_ regex
(  152              r
'var bootstrappedData = ({.*});' ,  webpage
,  'bootstraped data' ),  episode_path
)  154          # Downloading videos from a /videos/playlist/ URL needs to be handled differently.  155          # NOTE: We are only downloading one video (the current one) not the playlist  157              collections 
=  bootstrapped_data
[ 'playlists' ][ 'collections' ]  158              collection 
=  self
. find_collection_by_linkURL ( collections
,  show_path
)  159              video_info 
=  self
. find_video_info ( collection
,  episode_path
)  161              show_title 
=  video_info
[ 'showTitle' ]  162              segment_ids 
= [ video_info
[ 'videoPlaybackID' ]]  164              collections 
=  bootstrapped_data
[ 'show' ][ 'collections' ]  165              collection
,  video_info 
=  self
. find_collection_containing_video ( collections
,  episode_path
)  166              # Video wasn't found in the collections, let's try `slugged_video`.  167              if  video_info 
is None :  168                  if  bootstrapped_data
. get ( 'slugged_video' , {}). get ( 'slug' ) ==  episode_path
:  169                      video_info 
=  bootstrapped_data
[ 'slugged_video' ]  171                  video_info 
=  bootstrapped_data
. get (  172                      'heroMetadata' , {}). get ( 'trailer' , {}). get ( 'video' )  174                  video_info 
=  bootstrapped_data
. get ( 'onlineOriginals' , [ None ])[ 0 ]  176                  raise  ExtractorError ( 'Unable to find video info' )  178              show 
=  bootstrapped_data
[ 'show' ]  179              show_title 
=  show
[ 'title' ]  180              stream 
=  video_info
. get ( 'stream' )  181              if  stream 
and  stream
. get ( 'videoPlaybackID' ):  182                  segment_ids 
= [ stream
[ 'videoPlaybackID' ]]  183              elif  video_info
. get ( 'clips' ):  184                  segment_ids 
= [ clip
[ 'videoPlaybackID' ]  for  clip 
in  video_info
[ 'clips' ]]  185              elif  video_info
. get ( 'videoPlaybackID' ):  186                  segment_ids 
= [ video_info
[ 'videoPlaybackID' ]]  187              elif  video_info
. get ( 'id' ):  188                  segment_ids 
= [ video_info
[ 'id' ]]  190                  if  video_info
. get ( 'auth' )  is True :  191                      raise  ExtractorError (  192                          'This video is only available via cable service provider subscription that'  193                          ' is not currently supported. You may want to use --cookies.' ,  expected
= True )  195                      raise  ExtractorError ( 'Unable to find stream or clips' )  197          episode_id 
=  video_info
[ 'id' ]  198          episode_title 
=  video_info
[ 'title' ]  199          episode_description 
=  video_info
. get ( 'description' )  200          episode_duration 
=  int_or_none ( video_info
. get ( 'duration' ))  201          view_count 
=  int_or_none ( video_info
. get ( 'views' ))  204          for  part_num
,  segment_id 
in  enumerate ( segment_ids
):  205              segement_info 
=  self
._ extract
_ cvp
_ info
(  206                  'http://www.adultswim.com/videos/api/v0/assets?id= %s &platform=desktop'  %  segment_id
,  209                          'media_src' :  'http://androidhls-secure.cdn.turner.com/adultswim/big' ,  210                          'tokenizer_src' :  'http://www.adultswim.com/astv/mvpd/processors/services/token_ipadAdobe.do' ,  213              segment_title 
=  ' %s  -  %s '  % ( show_title
,  episode_title
)  214              if  len ( segment_ids
) >  1 :  215                  segment_title 
+=  ' Part  %d '  % ( part_num 
+  1 )  216              segement_info
. update ({  218                  'title' :  segment_title
,  219                  'description' :  episode_description
,  221              entries
. append ( segement_info
)  226              'display_id' :  episode_path
,  228              'title' :  ' %s  -  %s '  % ( show_title
,  episode_title
),  229              'description' :  episode_description
,  230              'duration' :  episode_duration
,  231              'view_count' :  view_count
,