summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/imgur.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/imgur.py')
-rw-r--r--gallery_dl/extractor/imgur.py77
1 files changed, 71 insertions, 6 deletions
diff --git a/gallery_dl/extractor/imgur.py b/gallery_dl/extractor/imgur.py
index 8523523..cb36c30 100644
--- a/gallery_dl/extractor/imgur.py
+++ b/gallery_dl/extractor/imgur.py
@@ -10,13 +10,18 @@
from .common import Extractor, Message
from .. import text, exception
+import itertools
import json
+BASE_PATTERN = r"(?:https?://)?(?:www\.|[im]\.)?imgur\.com"
+
+
class ImgurExtractor(Extractor):
"""Base class for imgur extractors"""
category = "imgur"
root = "https://imgur.com"
+ api_root = "https://api.imgur.com"
def __init__(self, match):
Extractor.__init__(self, match)
@@ -43,14 +48,40 @@ class ImgurExtractor(Extractor):
image["extension"] = image["ext"][1:]
return url
+ def _items_apiv3(self, urlfmt):
+ album_ex = ImgurAlbumExtractor
+ image_ex = ImgurImageExtractor
+
+ params = {
+ "IMGURPLATFORM" : "web",
+ "album_previews": "0",
+ "client_id" : "546c25a59c58ad7",
+ }
+ headers = {
+ "Origin" : self.root,
+ "Referer": self.root + "/",
+ }
+
+ yield Message.Version, 1
+
+ for num in itertools.count(0):
+ url = urlfmt.format(num)
+ data = self.request(url, params=params, headers=headers).json()
+
+ for item in data["data"]:
+ item["_extractor"] = album_ex if item["is_album"] else image_ex
+ yield Message.Queue, item["link"], item
+
+ if len(data["data"]) < 60:
+ return
+
class ImgurImageExtractor(ImgurExtractor):
"""Extractor for individual images on imgur.com"""
subcategory = "image"
filename_fmt = "{category}_{hash}{title:?_//}.{extension}"
archive_fmt = "{hash}"
- pattern = (r"(?:https?://)?(?:www\.|[im]\.|)?imgur\.com"
- r"/(?!gallery)(\w{7}|\w{5})[sbtmlh]?\.?")
+ pattern = BASE_PATTERN + r"/(?!gallery)(\w{7}|\w{5})[sbtmlh]?\.?"
test = (
("https://imgur.com/21yMxCS", {
"url": "6f2dcfb86815bdd72808c313e5f715610bc7b9b2",
@@ -111,8 +142,7 @@ class ImgurAlbumExtractor(ImgurExtractor):
directory_fmt = ("{category}", "{album[hash]}{album[title]:? - //}")
filename_fmt = "{category}_{album[hash]}_{num:>03}_{hash}.{extension}"
archive_fmt = "{album[hash]}_{hash}"
- pattern = (r"(?:https?://)?(?:www\.|m\.)?imgur\.com"
- r"/(?:a|t/unmuted)/(\w{7}|\w{5})")
+ pattern = BASE_PATTERN + r"/(?:a|t/unmuted)/(\w{7}|\w{5})"
test = (
("https://imgur.com/a/TcBmP", {
"url": "ce3552f550a5b5316bd9c7ae02e21e39f30c0563",
@@ -181,8 +211,7 @@ class ImgurAlbumExtractor(ImgurExtractor):
class ImgurGalleryExtractor(ImgurExtractor):
"""Extractor for imgur galleries"""
subcategory = "gallery"
- pattern = (r"(?:https?://)?(?:www\.|m\.)?imgur\.com"
- r"/gallery/(\w{7}|\w{5})")
+ pattern = BASE_PATTERN + r"/gallery/(\w{7}|\w{5})"
test = (
("https://imgur.com/gallery/zf2fIms", { # non-album gallery (#380)
"pattern": "https://imgur.com/zf2fIms",
@@ -205,3 +234,39 @@ class ImgurGalleryExtractor(ImgurExtractor):
yield Message.Version, 1
yield Message.Queue, url, {"_extractor": extr}
+
+
+class ImgurUserExtractor(ImgurExtractor):
+ """Extractor for all images posted by a user"""
+ subcategory = "user"
+ pattern = BASE_PATTERN + r"/user/([^/?&#]+)(?:/posts|/submitted)?/?$"
+ test = (
+ ("https://imgur.com/user/Miguenzo", {
+ "range": "1-100",
+ "count": 100,
+ "pattern": r"https?://(i.imgur.com|imgur.com/a)/[\w.]+",
+ }),
+ ("https://imgur.com/user/Miguenzo/posts"),
+ ("https://imgur.com/user/Miguenzo/submitted"),
+ )
+
+ def items(self):
+ urlfmt = "{}/3/account/{}/submissions/{{}}/newest".format(
+ self.api_root, self.key)
+ return self._items_apiv3(urlfmt)
+
+
+class ImgurFavoriteExtractor(ImgurExtractor):
+ """Extractor for a user's favorites"""
+ subcategory = "favorite"
+ pattern = BASE_PATTERN + r"/user/([^/?&#]+)/favorites"
+ test = ("https://imgur.com/user/Miguenzo/favorites", {
+ "range": "1-100",
+ "count": 100,
+ "pattern": r"https?://(i.imgur.com|imgur.com/a)/[\w.]+",
+ })
+
+ def items(self):
+ urlfmt = "{}/3/account/{}/gallery_favorites/{{}}/newest".format(
+ self.api_root, self.key)
+ return self._items_apiv3(urlfmt)