]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/rutube.py
fd1df925ba46bcecf87e192d2331da5e77d0b4bc
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
= r
'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
'https?://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
'https?://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
'https?://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'