diff options
| -rw-r--r-- | youtube_dl/extractor/__init__.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/gfycat.py | 115 | 
2 files changed, 116 insertions, 0 deletions
| 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..5e70ed3f6 --- /dev/null +++ b/youtube_dl/extractor/gfycat.py @@ -0,0 +1,115 @@ +# coding: utf-8 + +from __future__ import unicode_literals + +import datetime + +from .common import InfoExtractor + +class GfycatIE(InfoExtractor): +    _VALID_URL = r'https?://(?:www\.)?gfycat\.com/(?P<id>[^/?#]+)' +    _TESTS = [ +        { +            'url': 'http://gfycat.com/DeadlyDecisiveGermanpinscher', +            'info_dict': { +                'id':          'DeadlyDecisiveGermanpinscher', +                'title':       'Ghost in the Shell', +                'ext':         'mp4', +                'upload_date': '20140913' +            } +        },{ +            'url': 'http://gfycat.com/pleasinghilariouskusimanse', +            'info_dict': { +                'id':          'pleasinghilariouskusimanse', +                'title':       'PleasingHilariousKusimanse', +                'ext':         'webm', +                'upload_date': '20150412' +            }, +            'params': { +                'format': 'webm', +            }, +        },{ +            'url': 'http://gfycat.com/requiredunkemptbuzzard', +            'info_dict': { +                'id':          'requiredunkemptbuzzard', +                'title':       'Headshot!', +                'ext':         'gif', +                'upload_date': '20150129' +            }, +            'params': { +                'format': 'gif', +            }, +        }, +    ] + +    def _real_extract(self, url): +        video_id = self._match_id(url) +        json     = self._download_json("http://gfycat.com/cajax/get/" + video_id, video_id, 'Downloading video info')['gfyItem'] +         +        # Title +        # Use user title first, else fallback to url formated name +        if json['title']: +            video_title = json['title'] +        else: +            video_title = json['gfyName'] +         +        # Formats +        # Pref: mp4, webm, gif +        formats = [{ +            'format_id':  'mp4', +            'ext':        'mp4', +            'url':        json['mp4Url'], +            'width':      json['width'], +            'height':     json['height'], +            'fps':        json['frameRate'], +            'filesize':   json['mp4Size'], +            'preference': 2 +        }, { +            'format_id': 'webm', +            'ext':       'webm', +            'url':        json['webmUrl'], +            'width':      json['width'], +            'height':     json['height'], +            'fps':        json['frameRate'], +            'filesize':   json['webmSize'], +            'preference': 1 +        }, { +            'format_id':  'gif', +            'ext':        'gif', +            'url':        json['gifUrl'], +            'width':      json['width'], +            'height':     json['height'], +            'fps':        json['frameRate'], +            'filesize':   json['gifSize'], +            'preference': 0 +        }] +         +        self._sort_formats(formats) +         +        # Date +        date = datetime.datetime.fromtimestamp( +            int(json['createDate']) +        ).strftime('%Y%m%d') +         +        # Length +        duration = json['numFrames'] / json['frameRate'] +         +        # Age limit +        # 1 = nsfw / 0 = sfw +        if json['nsfw'] == 1: +            age_limit = 18 +        else: +            age_limit = 0 +         +        return { +            'id':          video_id, +            'title':       video_title, +            'formats':     formats, +            'creator':     json['userName'], +            'description': json['description'], +            'upload_date': date, +            'categories':  json['tags'], +            'age_limit':   age_limit, +            'duration':    duration, +            'view_count':  json['views'] +        } | 
