X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=youtube_dl%2Fextractor%2Fviki.py;h=4d185c0e6177801152fcc413f4eab7828cb0bb65;hb=0d7f03642976e7859e290b06db41d20a4bfd3a38;hp=957e3c01ea548609f05c274eb9552b9491e68e10;hpb=8e3df9dfeef8503e9a8c01fcf42008d376d8d64d;p=youtube-dl.git diff --git a/youtube_dl/extractor/viki.py b/youtube_dl/extractor/viki.py index 957e3c01e..4d185c0e6 100644 --- a/youtube_dl/extractor/viki.py +++ b/youtube_dl/extractor/viki.py @@ -11,6 +11,8 @@ from ..utils import ( unescapeHTML, unified_strdate, US_RATINGS, + determine_ext, + mimetype2ext, ) from .common import InfoExtractor @@ -44,6 +46,19 @@ class VikiIE(InfoExtractor): 'upload_date': '20150430', 'title': '\'The Avengers: Age of Ultron\' Press Conference', } + }, { + 'url': 'http://www.viki.com/videos/1048879v-ankhon-dekhi', + 'info_dict': { + 'id': '1048879v', + 'ext': 'mp4', + 'upload_date': '20140820', + 'description': 'md5:54ff56d51bdfc7a30441ec967394e91c', + 'title': 'Ankhon Dekhi', + }, + 'params': { + # requires ffmpeg + 'skip_download': True, + } }] def _real_extract(self, url): @@ -71,12 +86,29 @@ class VikiIE(InfoExtractor): req.add_header('User-Agent', self._USER_AGENT) info_webpage = self._download_webpage( req, video_id, note='Downloading info page') - if re.match(r'\s*]+src="([^"]+)"', info_webpage, 'video URL') + err_msg = self._html_search_regex(r']+class="video-error[^>]+>(.+)', info_webpage, 'error message', default=None) + if err_msg: + if 'not available in your region' in err_msg: + raise ExtractorError( + 'Video %s is blocked from your location.' % video_id, + expected=True) + else: + raise ExtractorError('Viki said: ' + err_msg) + mobj = re.search( + r']+type="(?P[^"]+)"[^>]+src="(?P[^"]+)"', info_webpage) + if not mobj: + raise ExtractorError('Unable to find video URL') + video_url = unescapeHTML(mobj.group('url')) + video_ext = mimetype2ext(mobj.group('mime_type')) + + if determine_ext(video_url) == 'm3u8': + formats = self._extract_m3u8_formats( + video_url, video_id, ext=video_ext) + else: + formats = [{ + 'url': video_url, + 'ext': video_ext, + }] upload_date_str = self._html_search_regex( r'"created_at":"([^"]+)"', info_webpage, 'upload date') @@ -92,7 +124,7 @@ class VikiIE(InfoExtractor): return { 'id': video_id, 'title': title, - 'url': video_url, + 'formats': formats, 'description': description, 'thumbnail': thumbnail, 'age_limit': age_limit, @@ -113,3 +145,36 @@ class VikiIE(InfoExtractor): 'ext': 'vtt', }] return res + + +class VikiShowIE(InfoExtractor): + IE_NAME = 'viki:show' + _VALID_URL = r'^https?://(?:www\.)?viki\.com/tv/(?P[0-9]+c)' + _TESTS = [{ + 'url': 'http://www.viki.com/tv/50c-boys-over-flowers', + 'info_dict': { + 'id': '50c', + 'title': 'Boys Over Flowers', + 'description': 'md5:ecd3cff47967fe193cff37c0bec52790', + }, + 'playlist_count': 25, + }] + + def _real_extract(self, url): + show_id = self._match_id(url) + show_page = self._download_webpage(url, show_id, 'Download show page') + + title = self._og_search_title(show_page) + description = self._og_search_description(show_page) + + show_json = self._download_json( + 'http://api.viki.io/v4/containers/%s/episodes.json?app=100000a&per_page=999&sort=number&direction=asc' % show_id, + show_id, note='Retrieve show json', errnote='Unable to get show json' + ) + entries = [] + for video in show_json['response']: + video_id = video['id'] + entries.append(self.url_result( + 'http://www.viki.com/videos/%s' % video_id, 'Viki', video_id)) + + return self.playlist_result(entries, show_id, title, description)