diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 2b98722f..43600609 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -436,7 +436,7 @@ Consider all listed sites to potentially be NSFW. imgur https://imgur.com/ - Albums, Favorites, Favorites Folders, Galleries, individual Images, Search Results, Subreddits, Tag Searches, User Profiles + Albums, Favorites, Favorites Folders, Galleries, individual Images, Personal Posts, Search Results, Subreddits, Tag Searches, User Profiles diff --git a/gallery_dl/extractor/imgur.py b/gallery_dl/extractor/imgur.py index 481fb1e3..ca8426b0 100644 --- a/gallery_dl/extractor/imgur.py +++ b/gallery_dl/extractor/imgur.py @@ -142,7 +142,8 @@ class ImgurGalleryExtractor(ImgurExtractor): class ImgurUserExtractor(ImgurExtractor): """Extractor for all images posted by a user""" subcategory = "user" - pattern = BASE_PATTERN + r"/user/([^/?#]+)(?:/posts|/submitted)?/?$" + pattern = (BASE_PATTERN + r"/user/(?!me(?:/|$|\?|#))" + r"([^/?#]+)(?:/posts|/submitted)?/?$") example = "https://imgur.com/user/USER" def items(self): @@ -174,6 +175,23 @@ class ImgurFavoriteFolderExtractor(ImgurExtractor): self.key, self.folder_id)) +class ImgurMeExtractor(ImgurExtractor): + """Extractor for your personal uploads""" + subcategory = "me" + pattern = BASE_PATTERN + r"/user/me(?:/posts)?(/hidden)?" + example = "https://imgur.com/user/me" + + def items(self): + if not self.cookies_check(("accesstoken",)): + raise exception.AuthorizationError("'accesstoken' cookie required") + + if self.groups[0]: + posts = self.api.accounts_me_hiddenalbums() + else: + posts = self.api.accounts_me_allposts() + return self._items_queue(posts) + + class ImgurSubredditExtractor(ImgurExtractor): """Extractor for a subreddits's imgur links""" subcategory = "subreddit" @@ -215,6 +233,10 @@ class ImgurAPI(): self.client_id = extractor.config("client-id") or "546c25a59c58ad7" self.headers = {"Authorization": "Client-ID " + self.client_id} + def account_submissions(self, account): + endpoint = "/3/account/{}/submissions".format(account) + return self._pagination(endpoint) + def account_favorites(self, account): endpoint = "/3/account/{}/gallery_favorites".format(account) return self._pagination(endpoint) @@ -224,15 +246,29 @@ class ImgurAPI(): account, folder_id) return self._pagination_v2(endpoint) + def accounts_me_allposts(self): + endpoint = "/post/v1/accounts/me/all_posts" + params = { + "include": "media,tags,account", + "page" : 1, + "sort" : "-created_at", + } + return self._pagination_v2(endpoint, params) + + def accounts_me_hiddenalbums(self): + endpoint = "/post/v1/accounts/me/hidden_albums" + params = { + "include": "media,tags,account", + "page" : 1, + "sort" : "-created_at", + } + return self._pagination_v2(endpoint, params) + def gallery_search(self, query): endpoint = "/3/gallery/search" params = {"q": query} return self._pagination(endpoint, params) - def account_submissions(self, account): - endpoint = "/3/account/{}/submissions".format(account) - return self._pagination(endpoint) - def gallery_subreddit(self, subreddit): endpoint = "/3/gallery/r/{}".format(subreddit) return self._pagination(endpoint) @@ -284,12 +320,16 @@ class ImgurAPI(): if params is None: params = {} params["client_id"] = self.client_id - params["page"] = 0 - params["sort"] = "newest" + if "page" not in params: + params["page"] = 0 + if "sort" not in params: + params["sort"] = "newest" headers = {"Origin": "https://imgur.com"} while True: - data = self._call(endpoint, params, headers)["data"] + data = self._call(endpoint, params, headers) + if "data" in data: + data = data["data"] if not data: return yield from data diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index fdc84a43..4df4b4ce 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -254,6 +254,7 @@ SUBCATEGORY_MAP = { }, "imgur": { "favorite-folder": "Favorites Folders", + "me": "Personal Posts", }, "inkbunny": { "unread": "Unread Submissions", diff --git a/test/results/imgur.py b/test/results/imgur.py index 991cf546..7c41da3f 100644 --- a/test/results/imgur.py +++ b/test/results/imgur.py @@ -380,6 +380,32 @@ __tests__ = ( "#count" : 5, }, +{ + "#url" : "https://imgur.com/user/me", + "#class" : imgur.ImgurMeExtractor, + "#auth" : True, + "#pattern" : r"https://imgur\.com(/a)?/\w+$", + "#count" : 3, +}, + +{ + "#url" : "https://imgur.com/user/me/hidden", + "#class" : imgur.ImgurMeExtractor, + "#auth" : True, + "#pattern" : r"https://imgur\.com(/a)?/\w+$", + "#count" : 2, +}, + +{ + "#url" : "https://imgur.com/user/me/posts", + "#class" : imgur.ImgurMeExtractor, +}, + +{ + "#url" : "https://imgur.com/user/me/posts/hidden", + "#class" : imgur.ImgurMeExtractor, +}, + { "#url" : "https://imgur.com/r/pics", "#category": ("", "imgur", "subreddit"),