summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/redgifs.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/redgifs.py')
-rw-r--r--gallery_dl/extractor/redgifs.py76
1 files changed, 16 insertions, 60 deletions
diff --git a/gallery_dl/extractor/redgifs.py b/gallery_dl/extractor/redgifs.py
index dcbbc0d..4477825 100644
--- a/gallery_dl/extractor/redgifs.py
+++ b/gallery_dl/extractor/redgifs.py
@@ -8,8 +8,8 @@
"""Extractors for https://redgifs.com/"""
-from .gfycat import GfycatExtractor
-from ..cache import cache
+from .gfycat import GfycatExtractor, GfycatAPI
+from .. import text
class RedgifsExtractor(GfycatExtractor):
@@ -44,7 +44,7 @@ class RedgifsSearchExtractor(RedgifsExtractor):
})
def metadata(self):
- self.key = self.key.replace("-", " ")
+ self.key = text.unquote(self.key).replace("-", " ")
return {"search": self.key}
def gfycats(self):
@@ -54,65 +54,21 @@ class RedgifsSearchExtractor(RedgifsExtractor):
class RedgifsImageExtractor(RedgifsExtractor):
"""Extractor for individual gifs from redgifs.com"""
subcategory = "image"
- pattern = r"(?:https?://)?(?:www\.)?redgifs\.com/watch/([A-Za-z]+)"
- test = ("https://redgifs.com/watch/foolishforkedabyssiniancat", {
- "pattern": r"https://\w+.redgifs.com/FoolishForkedAbyssiniancat.mp4",
- "content": "f6e03f1df9a2ff2a74092f53ee7580d2fb943533",
- })
+ pattern = (r"(?:https?://)?(?:www\.)?(?:redgifs\.com/watch"
+ r"|gifdeliverynetwork.com)/([A-Za-z]+)")
+ test = (
+ ("https://redgifs.com/watch/foolishforkedabyssiniancat", {
+ "pattern": r"https://\w+.redgifs.com/FoolishForkedAbyss.+.mp4",
+ "content": "f6e03f1df9a2ff2a74092f53ee7580d2fb943533",
+ }),
+ ("https://www.gifdeliverynetwork.com/foolishforkedabyssiniancat"),
+ )
def gfycats(self):
return (RedgifsAPI(self).gfycat(self.key),)
-class RedgifsAPI():
-
- def __init__(self, extractor):
- self.extractor = extractor
- self.headers = {}
-
- def gfycat(self, gfycat_id):
- endpoint = "v1/gfycats/" + gfycat_id
- return self._call(endpoint)["gfyItem"]
-
- def user(self, user):
- endpoint = "v1/users/{}/gfycats".format(user.lower())
- params = {"count": 100}
- return self._pagination(endpoint, params)
-
- def search(self, query):
- endpoint = "v1/gfycats/search"
- params = {"search_text": query, "count": 150}
- return self._pagination(endpoint, params)
-
- @cache(maxage=3600)
- def _authenticate_impl(self):
- url = "https://weblogin.redgifs.com/oauth/webtoken"
- headers = {
- "Referer": "https://www.redgifs.com/",
- "Origin" : "https://www.redgifs.com",
- }
- data = {
- "access_key": "dBLwVuGn9eq4dtXLs8WSfpjcYFY7bPQe"
- "AqGPSFgqeW5B9uzj2cMVhF63pTFF4Rg9",
- }
-
- response = self.extractor.request(
- url, method="POST", headers=headers, json=data)
- return "Bearer " + response.json()["access_token"]
-
- def _call(self, endpoint, params=None):
- self.headers["Authorization"] = self._authenticate_impl()
- url = "https://napi.redgifs.com/" + endpoint
- return self.extractor.request(
- url, params=params, headers=self.headers).json()
-
- def _pagination(self, endpoint, params):
- while True:
- data = self._call(endpoint, params)
- gfycats = data["gfycats"]
- yield from gfycats
-
- if "found" not in data and len(gfycats) < params["count"] or \
- not data["gfycats"]:
- return
- params["cursor"] = data["cursor"]
+class RedgifsAPI(GfycatAPI):
+ API_ROOT = "https://napi.redgifs.com/"
+ ACCESS_KEY = ("dBLwVuGn9eq4dtXLs8WSfpjcYFY7bPQe"
+ "AqGPSFgqeW5B9uzj2cMVhF63pTFF4Rg9")