From c85e4cf7b42f2867ac5f73890d61bba09392641e Mon Sep 17 00:00:00 2001 From: dst Date: Sun, 2 Feb 2014 08:33:24 +0700 Subject: [PATCH] [vube] Add support for vube.com (Closes #2285) --- youtube_dl/extractor/__init__.py | 1 + youtube_dl/extractor/vube.py | 80 ++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 youtube_dl/extractor/vube.py diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 7b71b9c701..83defea7fb 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -229,6 +229,7 @@ from .vine import VineIE from .viki import VikiIE from .vk import VKIE +from .vube import VubeIE from .wat import WatIE from .weibo import WeiboIE from .wimp import WimpIE diff --git a/youtube_dl/extractor/vube.py b/youtube_dl/extractor/vube.py new file mode 100644 index 0000000000..799f9186cf --- /dev/null +++ b/youtube_dl/extractor/vube.py @@ -0,0 +1,80 @@ +# encoding: utf-8 +from __future__ import unicode_literals + +import re +import datetime + +from .common import InfoExtractor + + +class VubeIE(InfoExtractor): + IE_NAME = 'vube' + IE_DESC = 'Vube.com' + _VALID_URL = r'http://vube\.com/[^/]+/(?P[\da-zA-Z]{10})' + + _TEST = { + 'url': 'http://vube.com/Chiara+Grispo+Video+Channel/YL2qNPkqon', + 'file': 'YL2qNPkqon.mp4', + 'md5': 'f81dcf6d0448e3291f54380181695821', + 'info_dict': { + 'title': 'Chiara Grispo - Price Tag by Jessie J', + 'description': 'md5:8ea652a1f36818352428cb5134933313', + 'thumbnail': 'http://frame.thestaticvube.com/snap/228x128/102e7e63057-5ebc-4f5c-4065-6ce4ebde131f.jpg', + 'uploader': 'Chiara.Grispo', + 'uploader_id': '1u3hX0znhP', + 'upload_date': '20140103', + 'duration': 170.56 + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + video = self._download_json('http://vube.com/api/v2/video/%s' % video_id, + video_id, 'Downloading video JSON') + + public_id = video['public_id'] + + formats = [{'url': 'http://video.thestaticvube.com/video/%s/%s.mp4' % (fmt['media_resolution_id'], public_id), + 'height': int(fmt['height']), + 'abr': int(fmt['audio_bitrate']), + 'vbr': int(fmt['video_bitrate']), + 'format_id': fmt['media_resolution_id'] + } for fmt in video['mtm'] if fmt['transcoding_status'] == 'processed'] + + self._sort_formats(formats) + + title = video['title'] + description = video['description'] + thumbnail = video['thumbnail_src'] + if thumbnail.startswith('//'): + thumbnail = 'http:' + thumbnail + uploader = video['user_alias'] + uploader_id = video['user_url_id'] + upload_date = datetime.datetime.fromtimestamp(int(video['upload_time'])).strftime('%Y%m%d') + duration = video['duration'] + view_count = video['raw_view_count'] + like_count = video['total_likes'] + dislike_count= video['total_hates'] + + comment = self._download_json('http://vube.com/api/video/%s/comment' % video_id, + video_id, 'Downloading video comment JSON') + + comment_count = comment['total'] + + return { + 'id': video_id, + 'formats': formats, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'uploader': uploader, + 'uploader_id': uploader_id, + 'upload_date': upload_date, + 'duration': duration, + 'view_count': view_count, + 'like_count': like_count, + 'dislike_count': dislike_count, + 'comment_count': comment_count, + } \ No newline at end of file