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.py109
1 files changed, 37 insertions, 72 deletions
diff --git a/gallery_dl/extractor/redgifs.py b/gallery_dl/extractor/redgifs.py
index bfd18b5..e246405 100644
--- a/gallery_dl/extractor/redgifs.py
+++ b/gallery_dl/extractor/redgifs.py
@@ -24,6 +24,8 @@ class RedgifsExtractor(Extractor):
def __init__(self, match):
Extractor.__init__(self, match)
self.key = match.group(1)
+
+ def _init(self):
self.api = RedgifsAPI(self)
formats = self.config("format")
@@ -87,53 +89,40 @@ class RedgifsUserExtractor(RedgifsExtractor):
"""Extractor for redgifs user profiles"""
subcategory = "user"
directory_fmt = ("{category}", "{userName}")
- pattern = r"(?:https?://)?(?:\w+\.)?redgifs\.com/users/([^/?#]+)/?$"
- test = (
- ("https://www.redgifs.com/users/Natalifiction", {
- "pattern": r"https://\w+\.redgifs\.com/[\w-]+\.mp4",
- "count": ">= 100",
- }),
- ("https://v3.redgifs.com/users/lamsinka89", {
- "pattern": r"https://\w+\.redgifs\.com/[\w-]+\.(mp4|jpg)",
- "count": ">= 100",
- }),
- )
+ pattern = (r"(?:https?://)?(?:\w+\.)?redgifs\.com/users/([^/?#]+)/?"
+ r"(?:\?([^#]+))?$")
+ example = "https://www.redgifs.com/users/USER"
+
+ def __init__(self, match):
+ RedgifsExtractor.__init__(self, match)
+ self.query = match.group(2)
def metadata(self):
return {"userName": self.key}
def gifs(self):
- return self.api.user(self.key)
+ order = text.parse_query(self.query).get("order")
+ return self.api.user(self.key, order or "new")
class RedgifsCollectionExtractor(RedgifsExtractor):
"""Extractor for an individual user collection"""
subcategory = "collection"
- directory_fmt = ("{category}", "{userName}", "{folderName}")
- archive_fmt = "{folderId}_{id}"
+ directory_fmt = (
+ "{category}", "{collection[userName]}", "{collection[folderName]}")
+ archive_fmt = "{collection[folderId]}_{id}"
pattern = (r"(?:https?://)?(?:www\.)?redgifs\.com/users"
r"/([^/?#]+)/collections/([^/?#]+)")
- test = (
- ("https://www.redgifs.com/users/boombah123/collections/2631326bbd", {
- "pattern": r"https://\w+\.redgifs\.com/[\w-]+\.mp4",
- "range": "1-20",
- "count": 20,
- }),
- ("https://www.redgifs.com/users/boombah123/collections/9e6f7dd41f", {
- "pattern": r"https://\w+\.redgifs\.com/[\w-]+\.mp4",
- "range": "1-20",
- "count": 20,
- }),
- )
+ example = "https://www.redgifs.com/users/USER/collections/ID"
def __init__(self, match):
RedgifsExtractor.__init__(self, match)
self.collection_id = match.group(2)
def metadata(self):
- data = {"userName": self.key}
- data.update(self.api.collection_info(self.key, self.collection_id))
- return data
+ collection = self.api.collection_info(self.key, self.collection_id)
+ collection["userName"] = self.key
+ return {"collection": collection}
def gifs(self):
return self.api.collection(self.key, self.collection_id)
@@ -144,11 +133,7 @@ class RedgifsCollectionsExtractor(RedgifsExtractor):
subcategory = "collections"
pattern = (r"(?:https?://)?(?:www\.)?redgifs\.com/users"
r"/([^/?#]+)/collections/?$")
- test = ("https://www.redgifs.com/users/boombah123/collections", {
- "pattern": (r"https://www\.redgifs\.com/users"
- r"/boombah123/collections/\w+"),
- "count": ">= 3",
- })
+ example = "https://www.redgifs.com/users/USER/collections"
def items(self):
for collection in self.api.collections(self.key):
@@ -158,27 +143,23 @@ class RedgifsCollectionsExtractor(RedgifsExtractor):
yield Message.Queue, url, collection
+class RedgifsNichesExtractor(RedgifsExtractor):
+ """Extractor for redgifs niches"""
+ subcategory = "niches"
+ pattern = r"(?:https?://)?(?:www\.)?redgifs\.com/niches/([^/?#]+)"
+ example = "https://www.redgifs.com/niches/NAME"
+
+ def gifs(self):
+ return self.api.niches(self.key)
+
+
class RedgifsSearchExtractor(RedgifsExtractor):
"""Extractor for redgifs search results"""
subcategory = "search"
directory_fmt = ("{category}", "Search", "{search}")
pattern = (r"(?:https?://)?(?:\w+\.)?redgifs\.com"
r"/(?:gifs/([^/?#]+)|browse)(?:/?\?([^#]+))?")
- test = (
- ("https://www.redgifs.com/gifs/jav", {
- "pattern": r"https://\w+\.redgifs\.com/[A-Za-z-]+\.(mp4|jpg)",
- "range": "1-10",
- "count": 10,
- }),
- ("https://www.redgifs.com/browse?tags=JAV", {
- "pattern": r"https://\w+\.redgifs\.com/[A-Za-z-]+\.(mp4|jpg)",
- "range": "1-10",
- "count": 10,
- }),
- ("https://www.redgifs.com/gifs/jav?order=best&verified=1"),
- ("https://www.redgifs.com/browse?type=i&verified=y&order=top7"),
- ("https://v3.redgifs.com/browse?tags=JAV"),
- )
+ example = "https://www.redgifs.com/gifs/TAG"
def __init__(self, match):
RedgifsExtractor.__init__(self, match)
@@ -202,29 +183,10 @@ class RedgifsImageExtractor(RedgifsExtractor):
subcategory = "image"
pattern = (r"(?:https?://)?(?:"
r"(?:\w+\.)?redgifs\.com/(?:watch|ifr)|"
+ r"(?:\w+\.)?gfycat\.com(?:/gifs/detail|/\w+)?|"
r"(?:www\.)?gifdeliverynetwork\.com|"
r"i\.redgifs\.com/i)/([A-Za-z]+)")
- test = (
- ("https://redgifs.com/watch/foolishforkedabyssiniancat", {
- "pattern": r"https://\w+\.redgifs\.com"
- r"/FoolishForkedAbyssiniancat\.mp4",
- "content": "f6e03f1df9a2ff2a74092f53ee7580d2fb943533",
- }),
- # gallery (#4021)
- ("https://www.redgifs.com/watch/desertedbaregraywolf", {
- "pattern": r"https://\w+\.redgifs\.com/[A-Za-z-]+\.jpg",
- "count": 4,
- "keyword": {
- "num": int,
- "count": 4,
- "gallery": "187ad979693-1922-fc66-0000-a96fb07b8a5d",
- },
- }),
- ("https://redgifs.com/ifr/FoolishForkedAbyssiniancat"),
- ("https://i.redgifs.com/i/FoolishForkedAbyssiniancat"),
- ("https://www.gifdeliverynetwork.com/foolishforkedabyssiniancat"),
- ("https://v3.redgifs.com/watch/FoolishForkedAbyssiniancat"),
- )
+ example = "https://redgifs.com/watch/ID"
def gifs(self):
return (self.api.gif(self.key),)
@@ -238,7 +200,6 @@ class RedgifsAPI():
def __init__(self, extractor):
self.extractor = extractor
self.headers = {
- "Referer" : extractor.root + "/",
"authorization" : None,
"content-type" : "application/json",
"x-customheader": extractor.root + "/",
@@ -253,7 +214,7 @@ class RedgifsAPI():
endpoint = "/v2/gallery/" + gallery_id
return self._call(endpoint)
- def user(self, user, order="best"):
+ def user(self, user, order="new"):
endpoint = "/v2/users/{}/search".format(user.lower())
params = {"order": order}
return self._pagination(endpoint, params)
@@ -271,6 +232,10 @@ class RedgifsAPI():
endpoint = "/v2/users/{}/collections".format(user)
return self._pagination(endpoint, key="collections")
+ def niches(self, niche):
+ endpoint = "/v2/niches/{}/gifs".format(niche)
+ return self._pagination(endpoint)
+
def search(self, params):
endpoint = "/v2/gifs/search"
params["search_text"] = params.pop("tags", None)