]>
 
 
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/rutube.py 
 
 
 
 
 
 
 
 
   2  from  __future__ 
import  unicode_literals
 
   7  from  . common 
import  InfoExtractor
 
  17  class  RutubeIE ( InfoExtractor
):  
  19      IE_DESC 
=  'Rutube videos'  
  20      _VALID_URL 
=  r
'https?://rutube\.ru/(?:video|play/embed)/(?P<id>[\da-z] {32} )'  
  23          'url' :  'http://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/' ,  
  25              'id' :  '3eac3b4561676c17df9132a9a1e62e3e' ,  
  27              'title' :  'Раненный кенгуру забежал в аптеку' ,  
  28              'description' :  'http://www.ntdtv.ru ' ,  
  30              'uploader' :  'NTDRussian' ,  
  31              'uploader_id' :  '29790' ,  
  32              'upload_date' :  '20131016' ,  
  36              # It requires ffmpeg (m3u8 download)  
  37              'skip_download' :  True ,  
  40          'url' :  'http://rutube.ru/play/embed/a10e53b86e8f349080f718582ce4c661' ,  
  41          'only_matching' :  True ,  
  44      def  _real_extract ( self
,  url
):  
  45          video_id 
=  self
._ match
_ id
( url
)  
  46          video 
=  self
._ download
_ json
(  
  47              'http://rutube.ru/api/video/ %s /?format=json'  %  video_id
,  
  48              video_id
,  'Downloading video JSON' )  
  50          # Some videos don't have the author field  
  51          author 
=  video
. get ( 'author' )  or  {}  
  53          options 
=  self
._ download
_ json
(  
  54              'http://rutube.ru/api/play/options/ %s /?format=json'  %  video_id
,  
  55              video_id
,  'Downloading options JSON' )  
  58          for  format_id
,  format_url 
in  options
[ 'video_balancer' ]. items ():  
  59              ext 
=  determine_ext ( format_url
)  
  61                  formats
. extend ( self
._ extract
_ m
3u8_ formats
(  
  62                      format_url
,  video_id
,  'mp4' ,  m3u8_id
= format_id
,  fatal
= False ))  
  64                  formats
. extend ( self
._ extract
_ f
4 m
_ formats
(  
  65                      format_url
,  video_id
,  f4m_id
= format_id
,  fatal
= False ))  
  69                      'format_id' :  format_id
,  
  71          self
._ sort
_ formats
( formats
)  
  75              'title' :  video
[ 'title' ],  
  76              'description' :  video
[ 'description' ],  
  77              'duration' :  video
[ 'duration' ],  
  78              'view_count' :  video
[ 'hits' ],  
  80              'thumbnail' :  video
[ 'thumbnail_url' ],  
  81              'uploader' :  author
. get ( 'name' ),  
  82              'uploader_id' :  compat_str ( author
[ 'id' ])  if  author 
else None ,  
  83              'upload_date' :  unified_strdate ( video
[ 'created_ts' ]),  
  84              'age_limit' :  18  if  video
[ 'is_adult' ]  else  0 ,  
  88  class  RutubeEmbedIE ( InfoExtractor
):  
  89      IE_NAME 
=  'rutube:embed'  
  90      IE_DESC 
=  'Rutube embedded videos'  
  91      _VALID_URL 
=  'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)'  
  94          'url' :  'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=' ,  
  96              'id' :  'a10e53b86e8f349080f718582ce4c661' ,  
  98              'upload_date' :  '20131223' ,  
  99              'uploader_id' :  '297833' ,  
 100              'description' :  'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix<br/><br/> восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89' ,  
 101              'uploader' :  'subziro89 ILya' ,  
 102              'title' :  'Мистический городок Эйри в Индиан 5 серия озвучка subziro89' ,  
 105              'skip_download' :  'Requires ffmpeg' ,  
 108          'url' :  'http://rutube.ru/play/embed/8083783' ,  
 109          'only_matching' :  True ,  
 112      def  _real_extract ( self
,  url
):  
 113          embed_id 
=  self
._ match
_ id
( url
)  
 114          webpage 
=  self
._ download
_ webpage
( url
,  embed_id
)  
 116          canonical_url 
=  self
._ html
_ search
_ regex
(  
 117              r
'<link\s+rel="canonical"\s+href="([^"]+?)"' ,  webpage
,  
 119          return  self
. url_result ( canonical_url
,  'Rutube' )  
 122  class  RutubeChannelIE ( InfoExtractor
):  
 123      IE_NAME 
=  'rutube:channel'  
 124      IE_DESC 
=  'Rutube channels'  
 125      _VALID_URL 
=  r
'http://rutube\.ru/tags/video/(?P<id>\d+)'  
 127          'url' :  'http://rutube.ru/tags/video/1800/' ,  
 131          'playlist_mincount' :  68 ,  
 134      _PAGE_TEMPLATE 
=  'http://rutube.ru/api/tags/video/ %s /?page= %s &format=json'  
 136      def  _extract_videos ( self
,  channel_id
,  channel_title
= None ):  
 138          for  pagenum 
in  itertools
. count ( 1 ):  
 139              page 
=  self
._ download
_ json
(  
 140                  self
._ PAGE
_ TEMPLATE 
% ( channel_id
,  pagenum
),  
 141                  channel_id
,  'Downloading page  %s '  %  pagenum
)  
 142              results 
=  page
[ 'results' ]  
 145              entries
. extend ( self
. url_result ( result
[ 'video_url' ],  'Rutube' )  for  result 
in  results
)  
 146              if not  page
[ 'has_next' ]:  
 148          return  self
. playlist_result ( entries
,  channel_id
,  channel_title
)  
 150      def  _real_extract ( self
,  url
):  
 151          mobj 
=  re
. match ( self
._ VALID
_U RL
,  url
)  
 152          channel_id 
=  mobj
. group ( 'id' )  
 153          return  self
._ extract
_ videos
( channel_id
)  
 156  class  RutubeMovieIE ( RutubeChannelIE
):  
 157      IE_NAME 
=  'rutube:movie'  
 158      IE_DESC 
=  'Rutube movies'  
 159      _VALID_URL 
=  r
'http://rutube\.ru/metainfo/tv/(?P<id>\d+)'  
 162      _MOVIE_TEMPLATE 
=  'http://rutube.ru/api/metainfo/tv/ %s /?format=json'  
 163      _PAGE_TEMPLATE 
=  'http://rutube.ru/api/metainfo/tv/ %s /video?page= %s &format=json'  
 165      def  _real_extract ( self
,  url
):  
 166          movie_id 
=  self
._ match
_ id
( url
)  
 167          movie 
=  self
._ download
_ json
(  
 168              self
._ MOVIE
_ TEMPLATE 
%  movie_id
,  movie_id
,  
 169              'Downloading movie JSON' )  
 170          movie_name 
=  movie
[ 'name' ]  
 171          return  self
._ extract
_ videos
( movie_id
,  movie_name
)  
 174  class  RutubePersonIE ( RutubeChannelIE
):  
 175      IE_NAME 
=  'rutube:person'  
 176      IE_DESC 
=  'Rutube person videos'  
 177      _VALID_URL 
=  r
'http://rutube\.ru/video/person/(?P<id>\d+)'  
 179          'url' :  'http://rutube.ru/video/person/313878/' ,  
 183          'playlist_mincount' :  37 ,  
 186      _PAGE_TEMPLATE 
=  'http://rutube.ru/api/video/person/ %s /?page= %s &format=json'