diff --git a/docs/configuration.rst b/docs/configuration.rst index ec1db053..6af6220d 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -1237,16 +1237,20 @@ Description extractor.gfycat.format ----------------------- Type - ``string`` + * ``list`` of ``strings`` + * ``string`` Default - ``"mp4"`` + ``["mp4", "webm", "mobile", "gif"]`` Description - The name of the preferred animation format, which can be one of - ``"mp4"``, ``"webm"``, ``"gif"``, ``"webp"``, or ``"mjpg"``. + List of names of the preferred animation format, which can be + ``"mp4"``, ``"webm"``, ``"mobile"``, ``"gif"``, or ``"webp"``. - If the selected format is not available, ``"mp4"``, ``"webm"`` - and ``"gif"`` (in that order) will be tried instead, until an - available format is found. + If a selected format is not available, the next one in the list will be + tried until an available format is found. + + If the format is given as ``string``, it will be extended with + ``["mp4", "webm", "mobile", "gif"]``. Use a list with one element to + restrict it to only one possible format. extractor.hentaifoundry.include @@ -1864,16 +1868,20 @@ Description extractor.redgifs.format ------------------------ Type - ``string`` + * ``list`` of ``strings`` + * ``string`` Default - ``"mp4"`` + ``["mp4", "webm", "mobile", "gif"]`` Description - The name of the preferred format, which can be one of + List of names of the preferred animation format, which can be ``"mp4"``, ``"webm"``, ``"gif"``, ``"webp"``, ``"mobile"``, or ``"mini"``. - If the selected format is not available, ``"mp4"``, ``"webm"`` - and ``"gif"`` (in that order) will be tried instead, until an - available format is found. + If a selected format is not available, the next one in the list will be + tried until an available format is found. + + If the format is given as ``string``, it will be extended with + ``["mp4", "webm", "mobile", "gif"]``. Use a list with one element to + restrict it to only one possible format. extractor.sankakucomplex.embeds diff --git a/docs/gallery-dl.conf b/docs/gallery-dl.conf index b998597c..ed04caed 100644 --- a/docs/gallery-dl.conf +++ b/docs/gallery-dl.conf @@ -107,7 +107,7 @@ }, "gfycat": { - "format": "mp4" + "format": ["mp4", "webm", "mobile", "gif"] }, "hentaifoundry": { @@ -222,7 +222,7 @@ }, "redgifs": { - "format": "mp4" + "format": ["mp4", "webm", "mobile", "gif"] }, "sankakucomplex": { diff --git a/gallery_dl/extractor/gfycat.py b/gallery_dl/extractor/gfycat.py index 2757852e..9b4d5eea 100644 --- a/gallery_dl/extractor/gfycat.py +++ b/gallery_dl/extractor/gfycat.py @@ -22,7 +22,13 @@ class GfycatExtractor(Extractor): def __init__(self, match): Extractor.__init__(self, match) self.key = match.group(1).lower() - self.formats = (self.config("format", "mp4"), "mp4", "webm", "gif") + + formats = self.config("format") + if formats is None: + formats = ("mp4", "webm", "mobile", "gif") + elif isinstance(formats, str): + formats = (formats, "mp4", "webm", "mobile", "gif") + self.formats = formats def items(self): metadata = self.metadata() @@ -30,23 +36,25 @@ class GfycatExtractor(Extractor): if "gfyName" not in gfycat: self.log.warning("Skipping '%s' (malformed)", gfycat["gfyId"]) continue - url = self._select_format(gfycat) + url = self._process(gfycat) gfycat.update(metadata) - gfycat["date"] = text.parse_timestamp(gfycat.get("createDate")) yield Message.Directory, gfycat yield Message.Url, url, gfycat - def _select_format(self, gfyitem): + def _process(self, gfycat): + gfycat["_fallback"] = formats = self._formats(gfycat) + gfycat["date"] = text.parse_timestamp(gfycat.get("createDate")) + return next(formats, "") + + def _formats(self, gfycat): for fmt in self.formats: key = fmt + "Url" - if key in gfyitem: - url = gfyitem[key] + if key in gfycat: + url = gfycat[key] if url.startswith("http:"): url = "https" + url[4:] - gfyitem["extension"] = url.rpartition(".")[2] - return url - gfyitem["extension"] = "" - return "" + gfycat["extension"] = url.rpartition(".")[2] + yield url def metadata(self): return {} @@ -146,8 +154,7 @@ class GfycatImageExtractor(GfycatExtractor): if "gfyName" not in gfycat: self.log.warning("Skipping '%s' (malformed)", gfycat["gfyId"]) return - url = self._select_format(gfycat) - gfycat["date"] = text.parse_timestamp(gfycat.get("createDate")) + url = self._process(gfycat) yield Message.Directory, gfycat yield Message.Url, url, gfycat