From: Philipp Hagemeister Date: Mon, 3 Feb 2014 04:19:28 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/master' X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=8e93b9b9aae0e31f053eaa8c5cbfebfbab2dfbab;p=youtube-dl Merge remote-tracking branch 'origin/master' Conflicts: youtube_dl/extractor/bliptv.py --- 8e93b9b9aae0e31f053eaa8c5cbfebfbab2dfbab diff --cc youtube_dl/extractor/bliptv.py index c8234ac31,9ca9f6525..9c120051c --- a/youtube_dl/extractor/bliptv.py +++ b/youtube_dl/extractor/bliptv.py @@@ -66,67 -71,56 +66,68 @@@ class BlipTVIE(SubtitlesInfoExtractor) json_url = url + cchar + 'skin=json&version=2&no_wrap=1' request = compat_urllib_request.Request(json_url) request.add_header('User-Agent', 'iTunes/10.6.1') - self.report_extraction(mobj.group(1)) - urlh = self._request_webpage(request, None, False, - 'unable to download video info webpage') - - try: - json_code_bytes = urlh.read() - json_code = json_code_bytes.decode('utf-8') - except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: - raise ExtractorError('Unable to read video info webpage: %s' % compat_str(err)) - - try: - json_data = json.loads(json_code) - if 'Post' in json_data: - data = json_data['Post'] - else: - data = json_data - - upload_date = datetime.datetime.strptime(data['datestamp'], '%m-%d-%y %H:%M%p').strftime('%Y%m%d') - formats = [] - if 'additionalMedia' in data: - for f in sorted(data['additionalMedia'], key=lambda f: int(0 if f['media_height'] is None else f['media_height'])): - if not int(0 if f['media_height'] is None else f['media_height']): # filter out m3u8 and srt files - continue - formats.append({ - 'url': f['url'], - 'format_id': f['role'], - 'width': int(f['media_width']), - 'height': int(f['media_height']), - }) - else: ++ + json_data = self._download_json(request, video_id=presumptive_id) + + if 'Post' in json_data: + data = json_data['Post'] + else: + data = json_data + + video_id = compat_str(data['item_id']) + upload_date = datetime.datetime.strptime(data['datestamp'], '%m-%d-%y %H:%M%p').strftime('%Y%m%d') + subtitles = {} + formats = [] + if 'additionalMedia' in data: + for f in data['additionalMedia']: + if f.get('file_type_srt') == 1: + LANGS = { + 'english': 'en', + } + lang = f['role'].rpartition('-')[-1].strip().lower() + langcode = LANGS.get(lang, lang) + subtitles[langcode] = f['url'] + continue + if not int(f['media_width']): # filter m3u8 + continue formats.append({ - 'url': data['media']['url'], - 'width': int(data['media']['width']), - 'height': int(data['media']['height']), + 'url': f['url'], + 'format_id': f['role'], + 'width': int(f['media_width']), + 'height': int(f['media_height']), }) + else: + formats.append({ + 'url': data['media']['url'], + 'width': int(data['media']['width']), + 'height': int(data['media']['height']), + }) + self._sort_formats(formats) + + # subtitles + video_subtitles = self.extract_subtitles(video_id, subtitles) + if self._downloader.params.get('listsubtitles', False): + self._list_available_subtitles(video_id, subtitles) + return + + return { + 'id': video_id, + 'uploader': data['display_name'], + 'upload_date': upload_date, + 'title': data['title'], + 'thumbnail': data['thumbnailUrl'], + 'description': data['description'], + 'user_agent': 'iTunes/10.6.1', + 'formats': formats, + 'subtitles': video_subtitles, + } - self._sort_formats(formats) - - return { - 'id': compat_str(data['item_id']), - 'uploader': data['display_name'], - 'upload_date': upload_date, - 'title': data['title'], - 'thumbnail': data['thumbnailUrl'], - 'description': data['description'], - 'user_agent': 'iTunes/10.6.1', - 'formats': formats, - } - except (ValueError, KeyError) as err: - raise ExtractorError('Unable to parse video information: %s' % repr(err)) + def _download_subtitle_url(self, sub_lang, url): + # For some weird reason, blip.tv serves a video instead of subtitles + # when we request with a common UA + req = compat_urllib_request.Request(url) + req.add_header('Youtubedl-user-agent', 'youtube-dl') + return self._download_webpage(req, None, note=False) class BlipTVUserIE(InfoExtractor):