From aaf539009b63ab34599cf88d42c92e7a54e88395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 19 Oct 2023 22:32:51 +0200 Subject: [PATCH] [kemonoparty] initial support for post revisions (#4498, #4597) - single revision https://kemono.party/SERVICE/user/12345/post/12345/revision/12345 - all revisions https://kemono.party/SERVICE/user/12345/post/12345/revisions --- gallery_dl/extractor/kemonoparty.py | 22 +++++++++++++++++--- test/results/kemonoparty.py | 32 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/gallery_dl/extractor/kemonoparty.py b/gallery_dl/extractor/kemonoparty.py index be51b36a..9b9e0821 100644 --- a/gallery_dl/extractor/kemonoparty.py +++ b/gallery_dl/extractor/kemonoparty.py @@ -211,6 +211,10 @@ class KemonopartyExtractor(Extractor): self.root, server) return self.request(url).json() + @memcache(keyarg=1) + def _post_revisions(self, url): + return self.request(url + "/revisions").json() + def _validate(response): return (response.headers["content-length"] != "9" or @@ -248,11 +252,12 @@ class KemonopartyUserExtractor(KemonopartyExtractor): class KemonopartyPostExtractor(KemonopartyExtractor): """Extractor for a single kemono.party post""" subcategory = "post" - pattern = USER_PATTERN + r"/post/([^/?#]+)" + pattern = USER_PATTERN + r"/post/([^/?#]+)(/revisions?(?:/(\d*))?)?" example = "https://kemono.party/SERVICE/user/12345/post/12345" def __init__(self, match): - _, _, service, user_id, post_id = match.groups() + _, _, service, user_id, post_id, self.revision, self.revision_id = \ + match.groups() self.subcategory = service KemonopartyExtractor.__init__(self, match) self.api_url = "{}/api/v1/{}/user/{}/post/{}".format( @@ -260,7 +265,18 @@ class KemonopartyPostExtractor(KemonopartyExtractor): self.user_url = "{}/{}/user/{}".format(self.root, service, user_id) def posts(self): - return (self.request(self.api_url).json(),) + if not self.revision: + return (self.request(self.api_url).json(),) + + revs = self._post_revisions(self.api_url) + if not self.revision_id: + return revs + + for rev in revs: + if str(rev["revision_id"]) == self.revision_id: + return (rev,) + + raise exception.NotFoundError("revision") class KemonopartyDiscordExtractor(KemonopartyExtractor): diff --git a/test/results/kemonoparty.py b/test/results/kemonoparty.py index 61a3fc89..b0f272f3 100644 --- a/test/results/kemonoparty.py +++ b/test/results/kemonoparty.py @@ -5,6 +5,7 @@ # published by the Free Software Foundation. from gallery_dl.extractor import kemonoparty +from gallery_dl import exception __tests__ = ( @@ -154,6 +155,37 @@ __tests__ = ( "#class" : kemonoparty.KemonopartyPostExtractor, }, +{ + "#url" : "https://kemono.party/patreon/user/3161935/post/68231671/revision/134996", + "#comment" : "revisions (#4498)", + "#category": ("", "kemonoparty", "patreon"), + "#class" : kemonoparty.KemonopartyPostExtractor, + "#urls" : "https://kemono.party/data/88/52/88521f71822dfa2f42df3beba319ea4fceda2a2d6dc59da0276a75238f743f86.jpg", + + "revision_id": 134996, +}, + +{ + "#url" : "https://kemono.party/patreon/user/3161935/post/68231671/revisions", + "#comment" : "revisions (#4498)", + "#category": ("", "kemonoparty", "patreon"), + "#class" : kemonoparty.KemonopartyPostExtractor, + "#pattern" : r"https://kemono\.party/data/88/52/88521f71822dfa2f42df3beba319ea4fceda2a2d6dc59da0276a75238f743f86\.jpg", + "#count" : 9, + "#archive" : False, + + "revision_id": range(134996, 3052965), +}, + + +{ + "#url" : "https://kemono.party/patreon/user/3161935/post/68231671/revision/12345", + "#comment" : "revisions (#4498)", + "#category": ("", "kemonoparty", "patreon"), + "#class" : kemonoparty.KemonopartyPostExtractor, + "#exception": exception.NotFoundError, +}, + { "#url" : "https://kemono.party/discord/server/488668827274444803#608504710906904576", "#category": ("", "kemonoparty", "discord"),