diff options
Diffstat (limited to 'youtube_dl/extractor/rutube.py')
| -rw-r--r-- | youtube_dl/extractor/rutube.py | 63 | 
1 files changed, 54 insertions, 9 deletions
diff --git a/youtube_dl/extractor/rutube.py b/youtube_dl/extractor/rutube.py index 357edbbda..5b1c3577a 100644 --- a/youtube_dl/extractor/rutube.py +++ b/youtube_dl/extractor/rutube.py @@ -5,10 +5,12 @@ import re  import itertools  from .common import InfoExtractor -from ..utils import ( +from ..compat import (      compat_str, -    unified_strdate, +) +from ..utils import (      ExtractorError, +    unified_strdate,  ) @@ -36,9 +38,7 @@ class RutubeIE(InfoExtractor):      }      def _real_extract(self, url): -        mobj = re.match(self._VALID_URL, url) -        video_id = mobj.group('id') - +        video_id = self._match_id(url)          video = self._download_json(              'http://rutube.ru/api/video/%s/?format=json' % video_id,              video_id, 'Downloading video JSON') @@ -53,6 +53,7 @@ class RutubeIE(InfoExtractor):          m3u8_url = options['video_balancer'].get('m3u8')          if m3u8_url is None:              raise ExtractorError('Couldn\'t find m3u8 manifest url') +        formats = self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4')          return {              'id': video['id'], @@ -60,8 +61,7 @@ class RutubeIE(InfoExtractor):              'description': video['description'],              'duration': video['duration'],              'view_count': video['hits'], -            'url': m3u8_url, -            'ext': 'mp4', +            'formats': formats,              'thumbnail': video['thumbnail_url'],              'uploader': author.get('name'),              'uploader_id': compat_str(author['id']) if author else None, @@ -70,10 +70,48 @@ class RutubeIE(InfoExtractor):          } +class RutubeEmbedIE(InfoExtractor): +    IE_NAME = 'rutube:embed' +    IE_DESC = 'Rutube embedded videos' +    _VALID_URL = 'https?://rutube\.ru/video/embed/(?P<id>[0-9]+)' + +    _TEST = { +        'url': 'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=', +        'info_dict': { +            'id': 'a10e53b86e8f349080f718582ce4c661', +            'ext': 'mp4', +            'upload_date': '20131223', +            'uploader_id': '297833', +            'description': 'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix<br/><br/> восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89', +            'uploader': 'subziro89 ILya', +            'title': 'Мистический городок Эйри в Индиан 5 серия озвучка subziro89', +        }, +        'params': { +            'skip_download': 'Requires ffmpeg', +        }, +    } + +    def _real_extract(self, url): +        embed_id = self._match_id(url) +        webpage = self._download_webpage(url, embed_id) + +        canonical_url = self._html_search_regex( +            r'<link\s+rel="canonical"\s+href="([^"]+?)"', webpage, +            'Canonical URL') +        return self.url_result(canonical_url, 'Rutube') + +  class RutubeChannelIE(InfoExtractor):      IE_NAME = 'rutube:channel'      IE_DESC = 'Rutube channels'      _VALID_URL = r'http://rutube\.ru/tags/video/(?P<id>\d+)' +    _TESTS = [{ +        'url': 'http://rutube.ru/tags/video/1800/', +        'info_dict': { +            'id': '1800', +        }, +        'playlist_mincount': 68, +    }]      _PAGE_TEMPLATE = 'http://rutube.ru/api/tags/video/%s/?page=%s&format=json' @@ -101,13 +139,13 @@ class RutubeMovieIE(RutubeChannelIE):      IE_NAME = 'rutube:movie'      IE_DESC = 'Rutube movies'      _VALID_URL = r'http://rutube\.ru/metainfo/tv/(?P<id>\d+)' +    _TESTS = []      _MOVIE_TEMPLATE = 'http://rutube.ru/api/metainfo/tv/%s/?format=json'      _PAGE_TEMPLATE = 'http://rutube.ru/api/metainfo/tv/%s/video?page=%s&format=json'      def _real_extract(self, url): -        mobj = re.match(self._VALID_URL, url) -        movie_id = mobj.group('id') +        movie_id = self._match_id(url)          movie = self._download_json(              self._MOVIE_TEMPLATE % movie_id, movie_id,              'Downloading movie JSON') @@ -119,5 +157,12 @@ class RutubePersonIE(RutubeChannelIE):      IE_NAME = 'rutube:person'      IE_DESC = 'Rutube person videos'      _VALID_URL = r'http://rutube\.ru/video/person/(?P<id>\d+)' +    _TESTS = [{ +        'url': 'http://rutube.ru/video/person/313878/', +        'info_dict': { +            'id': '313878', +        }, +        'playlist_mincount': 37, +    }]      _PAGE_TEMPLATE = 'http://rutube.ru/api/video/person/%s/?page=%s&format=json'  | 
