diff options
author | Sergey M․ <dstftw@gmail.com> | 2015-04-18 03:51:38 +0600 |
---|---|---|
committer | Sergey M․ <dstftw@gmail.com> | 2015-04-18 03:51:38 +0600 |
commit | 902be27cf97f0f9ca5da4ef60301fce01f8885bc (patch) | |
tree | f0b4039454c4c748ca11024c78c06a265b1144f0 | |
parent | ecc6bd1341cd03fd335058371c3efa63dfd31152 (diff) | |
parent | bf12cbe07c3a22deb46848df3bd3242da645eab1 (diff) |
Merge branch 'julianrichen-gfycat'
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/__init__.py | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/gfycat.py | 90 |
3 files changed, 92 insertions, 0 deletions
@@ -123,3 +123,4 @@ Will W. Mohammad Teimori Pabandi Roman Le Négrate Matthias Küch +Julian Richen diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 830090346..9e9e20589 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -185,6 +185,7 @@ from .gametrailers import GametrailersIE from .gazeta import GazetaIE from .gdcvault import GDCVaultIE from .generic import GenericIE +from .gfycat import GfycatIE from .giantbomb import GiantBombIE from .giga import GigaIE from .glide import GlideIE diff --git a/youtube_dl/extractor/gfycat.py b/youtube_dl/extractor/gfycat.py new file mode 100644 index 000000000..397f1d42e --- /dev/null +++ b/youtube_dl/extractor/gfycat.py @@ -0,0 +1,90 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor +from ..utils import ( + int_or_none, + float_or_none, + qualities, +) + + +class GfycatIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?gfycat\.com/(?P<id>[^/?#]+)' + _TEST = { + 'url': 'http://gfycat.com/DeadlyDecisiveGermanpinscher', + 'info_dict': { + 'id': 'DeadlyDecisiveGermanpinscher', + 'ext': 'mp4', + 'title': 'Ghost in the Shell', + 'timestamp': 1410656006, + 'upload_date': '20140914', + 'uploader': 'anonymous', + 'duration': 10.4, + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'categories': list, + 'age_limit': 0, + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + gfy = self._download_json( + 'http://gfycat.com/cajax/get/%s' % video_id, + video_id, 'Downloading video info')['gfyItem'] + + title = gfy.get('title') or gfy['gfyName'] + description = gfy.get('description') + timestamp = int_or_none(gfy.get('createDate')) + uploader = gfy.get('userName') + view_count = int_or_none(gfy.get('views')) + like_count = int_or_none(gfy.get('likes')) + dislike_count = int_or_none(gfy.get('dislikes')) + age_limit = 18 if gfy.get('nsfw') == '1' else 0 + + width = int_or_none(gfy.get('width')) + height = int_or_none(gfy.get('height')) + fps = int_or_none(gfy.get('frameRate')) + num_frames = int_or_none(gfy.get('numFrames')) + + duration = float_or_none(num_frames, fps) if num_frames and fps else None + + categories = gfy.get('tags') or gfy.get('extraLemmas') or [] + + FORMATS = ('gif', 'webm', 'mp4') + quality = qualities(FORMATS) + + formats = [] + for format_id in FORMATS: + video_url = gfy.get('%sUrl' % format_id) + if not video_url: + continue + filesize = gfy.get('%sSize' % format_id) + formats.append({ + 'url': video_url, + 'format_id': format_id, + 'width': width, + 'height': height, + 'fps': fps, + 'filesize': filesize, + 'quality': quality(format_id), + }) + self._sort_formats(formats) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'timestamp': timestamp, + 'uploader': uploader, + 'duration': duration, + 'view_count': view_count, + 'like_count': like_count, + 'dislike_count': dislike_count, + 'categories': categories, + 'age_limit': age_limit, + 'formats': formats, + } |