diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 947442f9..eed7aa10 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -631,6 +631,12 @@ Consider all sites to be NSFW unless otherwise known.
\n", "\n
\n").strip()), + "files" : self._find_files(page), + } + + +class SeisopartyUserExtractor(SeisopartyExtractor): + """Extractor for all posts from a seiso.party user listing""" + subcategory = "user" + pattern = r"(?:https?://)?seiso\.party/artists/([^/?#]+)/([^/?#]+)" + test = ( + ("https://seiso.party/artists/fanbox/21", { + "pattern": r"https://cdn\.seiso\.party/files/fanbox/\d+/", + "count": ">=15", + "keyword": { + "content": str, + "date": "type:datetime", + "id": r"re:\d+", + "num": int, + "service": "fanbox", + "title": str, + "user": "21", + "username": "雨", + }, + }), + ) + + def __init__(self, match): + SeisopartyExtractor.__init__(self, match) + self.service, self.user_id = match.groups() + + def posts(self): + url = "{}/artists/{}/{}".format(self.root, self.service, self.user_id) + page = self.request(url).text + self.user_name, pos = text.extract(page, '', '<') + + url = self.root + text.extract( + page, 'href="', '"', page.index('id="content"', pos))[0] + response = self.request(url) + headers = {"Referer": url} + + while True: + yield self._parse_post(response.text, url.rpartition("/")[2]) + response = self.request(url + "/next", headers=headers) + if url == response.url: + return + url = headers["Referer"] = response.url + + +class SeisopartyPostExtractor(SeisopartyExtractor): + """Extractor for a single seiso.party post""" + subcategory = "post" + pattern = r"(?:https?://)?seiso\.party/post/([^/?#]+)/([^/?#]+)/([^/?#]+)" + test = ( + ("https://seiso.party/post/fanbox/21/371", { + "url": "75f13b92de0ce399b6163c3de18f1f36011c2366", + "count": 2, + "keyword": { + "content": "この前描いためぐるちゃんのPSDファイルです。\n" + "どうぞよろしくお願いします。", + "date": "dt:2021-05-06 12:38:31", + "extension": "re:psd|jpg", + "filename": "re:backcourt|ffb2ccb7a3586d05f9a4620329dd131e", + "id": "371", + "num": int, + "service": "fanbox", + "title": "MEGURU.PSD", + "user": "21", + "username": "雨", + }, + }), + ) + + def __init__(self, match): + SeisopartyExtractor.__init__(self, match) + self.service, self.user_id, self.post_id = match.groups() + + def posts(self): + url = "{}/artists/{}/{}".format(self.root, self.service, self.user_id) + page = self.request(url).text + self.user_name, pos = text.extract(page, '', '<') + + url = "{}/post/{}/{}/{}".format( + self.root, self.service, self.user_id, self.post_id) + return (self._parse_post(self.request(url).text, self.post_id),) diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index 0e81f2dd..1bb5d654 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -90,6 +90,7 @@ CATEGORY_MAP = { "sankakucomplex" : "Sankaku Complex", "seaotterscans" : "Sea Otter Scans", "seiga" : "Niconico Seiga", + "seisoparty" : "Seiso", "senmanga" : "Sen Manga", "sensescans" : "Sense-Scans", "sexcom" : "Sex.com", diff --git a/test/test_results.py b/test/test_results.py index 9c6845d2..43b2f739 100644 --- a/test/test_results.py +++ b/test/test_results.py @@ -317,6 +317,8 @@ def setup_test_config(): config.set(("extractor", "kemonoparty"), "cookies", { "__ddg1": "0gBDGpJ3KZQmA4B9QH25", "__ddg2": "lmj5s1jnJOvhPXCX"}) + config.set(("extractor", "seisoparty"), "cookies", { + "__ddg1": "Y8rBxSDHO5UCEtQvzyI9", "__ddg2": "lmj5s1jnJOvhPXCX"}) config.set(("extractor", "mastodon.social"), "access-token", "Blf9gVqG7GytDTfVMiyYQjwVMQaNACgf3Ds3IxxVDUQ")