]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/rutube.py
6b09550b01d19b76484adb3301ec2a56156b5b1f
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/(?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 ,
41 def _real_extract ( self
, url
):
42 video_id
= self
._ match
_ id
( url
)
43 video
= self
._ download
_ json
(
44 'http://rutube.ru/api/video/ %s /?format=json' % video_id
,
45 video_id
, 'Downloading video JSON' )
47 # Some videos don't have the author field
48 author
= video
. get ( 'author' ) or {}
50 options
= self
._ download
_ json
(
51 'http://rutube.ru/api/play/options/ %s /?format=json' % video_id
,
52 video_id
, 'Downloading options JSON' )
55 for format_id
, format_url
in options
[ 'video_balancer' ]. items ():
56 ext
= determine_ext ( format_url
)
58 m3u8_formats
= self
._ extract
_ m
3u8_ formats
(
59 format_url
, video_id
, 'mp4' , m3u8_id
= format_id
, fatal
= False )
61 formats
. extend ( m3u8_formats
)
63 f4m_formats
= self
._ extract
_ f
4 m
_ formats
(
64 format_url
, video_id
, f4m_id
= format_id
, fatal
= False )
66 formats
. extend ( f4m_formats
)
70 'format_id' : format_id
,
72 self
._ sort
_ formats
( formats
)
76 'title' : video
[ 'title' ],
77 'description' : video
[ 'description' ],
78 'duration' : video
[ 'duration' ],
79 'view_count' : video
[ 'hits' ],
81 'thumbnail' : video
[ 'thumbnail_url' ],
82 'uploader' : author
. get ( 'name' ),
83 'uploader_id' : compat_str ( author
[ 'id' ]) if author
else None ,
84 'upload_date' : unified_strdate ( video
[ 'created_ts' ]),
85 'age_limit' : 18 if video
[ 'is_adult' ] else 0 ,
89 class RutubeEmbedIE ( InfoExtractor
):
90 IE_NAME
= 'rutube:embed'
91 IE_DESC
= 'Rutube embedded videos'
92 _VALID_URL
= 'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)'
95 'url' : 'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=' ,
97 'id' : 'a10e53b86e8f349080f718582ce4c661' ,
99 'upload_date' : '20131223' ,
100 'uploader_id' : '297833' ,
101 'description' : 'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix<br/><br/> восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89' ,
102 'uploader' : 'subziro89 ILya' ,
103 'title' : 'Мистический городок Эйри в Индиан 5 серия озвучка subziro89' ,
106 'skip_download' : 'Requires ffmpeg' ,
109 'url' : 'http://rutube.ru/play/embed/8083783' ,
110 'only_matching' : True ,
113 def _real_extract ( self
, url
):
114 embed_id
= self
._ match
_ id
( url
)
115 webpage
= self
._ download
_ webpage
( url
, embed_id
)
117 canonical_url
= self
._ html
_ search
_ regex
(
118 r
'<link\s+rel="canonical"\s+href="([^"]+?)"' , webpage
,
120 return self
. url_result ( canonical_url
, 'Rutube' )
123 class RutubeChannelIE ( InfoExtractor
):
124 IE_NAME
= 'rutube:channel'
125 IE_DESC
= 'Rutube channels'
126 _VALID_URL
= r
'http://rutube\.ru/tags/video/(?P<id>\d+)'
128 'url' : 'http://rutube.ru/tags/video/1800/' ,
132 'playlist_mincount' : 68 ,
135 _PAGE_TEMPLATE
= 'http://rutube.ru/api/tags/video/ %s /?page= %s &format=json'
137 def _extract_videos ( self
, channel_id
, channel_title
= None ):
139 for pagenum
in itertools
. count ( 1 ):
140 page
= self
._ download
_ json
(
141 self
._ PAGE
_ TEMPLATE
% ( channel_id
, pagenum
),
142 channel_id
, 'Downloading page %s ' % pagenum
)
143 results
= page
[ 'results' ]
146 entries
. extend ( self
. url_result ( result
[ 'video_url' ], 'Rutube' ) for result
in results
)
147 if not page
[ 'has_next' ]:
149 return self
. playlist_result ( entries
, channel_id
, channel_title
)
151 def _real_extract ( self
, url
):
152 mobj
= re
. match ( self
._ VALID
_U RL
, url
)
153 channel_id
= mobj
. group ( 'id' )
154 return self
._ extract
_ videos
( channel_id
)
157 class RutubeMovieIE ( RutubeChannelIE
):
158 IE_NAME
= 'rutube:movie'
159 IE_DESC
= 'Rutube movies'
160 _VALID_URL
= r
'http://rutube\.ru/metainfo/tv/(?P<id>\d+)'
163 _MOVIE_TEMPLATE
= 'http://rutube.ru/api/metainfo/tv/ %s /?format=json'
164 _PAGE_TEMPLATE
= 'http://rutube.ru/api/metainfo/tv/ %s /video?page= %s &format=json'
166 def _real_extract ( self
, url
):
167 movie_id
= self
._ match
_ id
( url
)
168 movie
= self
._ download
_ json
(
169 self
._ MOVIE
_ TEMPLATE
% movie_id
, movie_id
,
170 'Downloading movie JSON' )
171 movie_name
= movie
[ 'name' ]
172 return self
._ extract
_ videos
( movie_id
, movie_name
)
175 class RutubePersonIE ( RutubeChannelIE
):
176 IE_NAME
= 'rutube:person'
177 IE_DESC
= 'Rutube person videos'
178 _VALID_URL
= r
'http://rutube\.ru/video/person/(?P<id>\d+)'
180 'url' : 'http://rutube.ru/video/person/313878/' ,
184 'playlist_mincount' : 37 ,
187 _PAGE_TEMPLATE
= 'http://rutube.ru/api/video/person/ %s /?page= %s &format=json'