[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
This commit is contained in:
Mike Fährmann
2023-10-19 22:32:51 +02:00
parent 174191cb79
commit aaf539009b
2 changed files with 51 additions and 3 deletions

View File

@@ -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):

View File

@@ -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"),