From b4a9bf701a77fda45f5a93b0f9538a9f6b883df3 Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Sun, 5 Jan 2014 02:47:54 +0100 Subject: [PATCH] [collegehumor] Support multiple formats (Fixes #2092) Unfortunately, we lose a part of the description in the new JSON format, but that's still better than a non-functioning URL. --- youtube_dl/extractor/collegehumor.py | 79 ++++++++++------------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/youtube_dl/extractor/collegehumor.py b/youtube_dl/extractor/collegehumor.py index b27c1dfc5..a963f6f79 100644 --- a/youtube_dl/extractor/collegehumor.py +++ b/youtube_dl/extractor/collegehumor.py @@ -1,12 +1,7 @@ +import json import re from .common import InfoExtractor -from ..utils import ( - compat_urllib_parse_urlparse, - determine_ext, - - ExtractorError, -) class CollegeHumorIE(InfoExtractor): @@ -15,16 +10,16 @@ class CollegeHumorIE(InfoExtractor): _TESTS = [{ u'url': u'http://www.collegehumor.com/video/6902724/comic-con-cosplay-catastrophe', u'file': u'6902724.mp4', - u'md5': u'1264c12ad95dca142a9f0bf7968105a0', + u'md5': u'dcc0f5c1c8be98dc33889a191f4c26bd', u'info_dict': { u'title': u'Comic-Con Cosplay Catastrophe', - u'description': u'Fans get creative this year at San Diego. Too creative. And yes, that\'s really Joss Whedon.', + u'description': u'Fans get creative this year at San Diego. Too', }, }, { u'url': u'http://www.collegehumor.com/video/3505939/font-conference', u'file': u'3505939.mp4', - u'md5': u'c51ca16b82bb456a4397987791a835f5', + u'md5': u'72fa701d8ef38664a4dbb9e2ab721816', u'info_dict': { u'title': u'Font Conference', u'description': u'This video wasn\'t long enough, so we made it double-spaced.', @@ -33,50 +28,30 @@ class CollegeHumorIE(InfoExtractor): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - if mobj is None: - raise ExtractorError(u'Invalid URL: %s' % url) video_id = mobj.group('videoid') - info = { + jsonUrl = 'http://www.collegehumor.com/moogaloop/video/' + video_id + '.json' + data = json.loads(self._download_webpage( + jsonUrl, video_id, u'Downloading info JSON')) + vdata = data['video'] + + PREFS = {'high_quality': 2, 'low_quality': 0} + formats = [] + for format_key in ('mp4', 'webm'): + for qname, qurl in vdata[format_key].items(): + formats.append({ + 'format_id': format_key + '_' + qname, + 'url': qurl, + 'format': format_key, + 'preference': PREFS.get(qname), + }) + + self._sort_formats(formats) + + return { 'id': video_id, - 'uploader': None, - 'upload_date': None, + 'title': vdata['title'], + 'description': vdata.get('description'), + 'thumbnail': vdata.get('thumbnail'), + 'formats': formats, } - - self.report_extraction(video_id) - xmlUrl = 'http://www.collegehumor.com/moogaloop/video/' + video_id - mdoc = self._download_xml(xmlUrl, video_id, - u'Downloading info XML', - u'Unable to download video info XML') - - try: - videoNode = mdoc.findall('./video')[0] - youtubeIdNode = videoNode.find('./youtubeID') - if youtubeIdNode is not None: - return self.url_result(youtubeIdNode.text, 'Youtube') - info['description'] = videoNode.findall('./description')[0].text - info['title'] = videoNode.findall('./caption')[0].text - info['thumbnail'] = videoNode.findall('./thumbnail')[0].text - next_url = videoNode.findall('./file')[0].text - except IndexError: - raise ExtractorError(u'Invalid metadata XML file') - - if next_url.endswith(u'manifest.f4m'): - manifest_url = next_url + '?hdcore=2.10.3' - adoc = self._download_xml(manifest_url, video_id, - u'Downloading XML manifest', - u'Unable to download video info XML') - - try: - video_id = adoc.findall('./{http://ns.adobe.com/f4m/1.0}id')[0].text - except IndexError: - raise ExtractorError(u'Invalid manifest file') - url_pr = compat_urllib_parse_urlparse(info['thumbnail']) - info['url'] = url_pr.scheme + '://' + url_pr.netloc + video_id[:-2].replace('.csmil','').replace(',','') - info['ext'] = 'mp4' - else: - # Old-style direct links - info['url'] = next_url - info['ext'] = determine_ext(info['url']) - - return info -- 2.22.2