Files
gallery-dl/gallery_dl/extractor/gfycat.py
Mike Fährmann 5f45ce2930 [gfycat] add "format" config key to select a video format
Possible values:
    - one of "mp4" (default), "webm", "gif", "webp", "mjpg"

If the selected format is not available, "mp4", "webm" and "gif"
(in that order) will be tried instead, until an available format
is found.
2017-05-29 12:16:37 +02:00

73 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2017 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
"""Extract images from https://gfycat.com/"""
from .common import Extractor, Message
from .. import exception
class GfycatExtractor(Extractor):
"""Base class for gfycat extractors"""
category = "gfycat"
def __init__(self, match):
Extractor.__init__(self)
self.item_id = match.group(1)
self.formats = (self.config("format", "mp4"), "mp4", "webm", "gif")
def _select_format(self, gfycat):
for fmt in self.formats:
key = fmt + "Url"
if key in gfycat:
url = gfycat[key]
gfycat["extension"] = url[url.rfind(".")+1:]
return url
@staticmethod
def _clean(image):
for key in ("dislikes", "likes", "views", "viewsNewEpoch"):
del image[key]
return image
class GfycatImageExtractor(GfycatExtractor):
"""Extractor for individual images from gfycat.com"""
subcategory = "image"
directory_fmt = ["{category}"]
filename_fmt = "{category}_{gfyName}.{extension}"
pattern = [r"(?:https?://)?(?:[a-z]+\.)?gfycat\.com/"
r"(?:(?:gifs/)?detail/|ifr/)?([A-Za-z]+)"]
test = [
("https://gfycat.com/GrayGenerousCowrie", {
"url": "e0b5e1d7223108249b15c3c7898dd358dbfae045",
"keyword": "77a65049939823071b532cbdb7dec77582c6ee5b",
"content": "3157cd8b3799205c5a0df98a7ee31aa85bf6491e",
}),
(("https://thumbs.gfycat.com/SillyLameIsabellinewheatear"
"-size_restricted.gif"), {
"url": "13b32e6cc169d086577d7dd3fd36ee6cdbc02726",
}),
("https://gfycat.com/detail/UnequaledHastyAnkole?tagname=aww", {
"url": "e24c9f69897fd223343782425a429c5cab6a768e",
}),
]
def items(self):
gfycat = self._clean(self._get_info(self.item_id))
yield Message.Version, 1
yield Message.Directory, gfycat
yield Message.Url, self._select_format(gfycat), gfycat
def _get_info(self, gfycat_id):
url = "https://gfycat.com/cajax/get/" + gfycat_id
data = self.session.get(url).json()
if "error" in data:
raise exception.NotFoundError()
return data["gfyItem"]