diff options
Diffstat (limited to 'gallery_dl/extractor/seisoparty.py')
| -rw-r--r-- | gallery_dl/extractor/seisoparty.py | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/gallery_dl/extractor/seisoparty.py b/gallery_dl/extractor/seisoparty.py index 28e049b..a2a24e0 100644 --- a/gallery_dl/extractor/seisoparty.py +++ b/gallery_dl/extractor/seisoparty.py @@ -9,7 +9,8 @@ """Extractors for https://seiso.party/""" from .common import Extractor, Message -from .. import text +from .. import text, exception +from ..cache import cache import re @@ -52,6 +53,25 @@ class SeisopartyExtractor(Extractor): "files" : self._find_files(page), } + def login(self): + username, password = self._get_auth_info() + if username: + self._update_cookies(self._login_impl(username, password)) + + @cache(maxage=28*24*3600, keyarg=1) + def _login_impl(self, username, password): + self.log.info("Logging in as %s", username) + + url = self.root + "/account/login" + data = {"username": username, "password": password} + + response = self.request(url, method="POST", data=data) + if response.url.endswith("/account/login") and \ + "Username or password is incorrect" in response.text: + raise exception.AuthenticationError() + + return {c.name: c.value for c in response.history[0].cookies} + class SeisopartyUserExtractor(SeisopartyExtractor): """Extractor for all posts from a seiso.party user listing""" @@ -136,3 +156,46 @@ class SeisopartyPostExtractor(SeisopartyExtractor): url = "{}/post/{}/{}/{}".format( self.root, self.service, self.user_id, self.post_id) return (self._parse_post(self.request(url).text, self.post_id),) + + +class SeisopartyFavoriteExtractor(SeisopartyExtractor): + """Extractor for seiso.party favorites""" + subcategory = "favorite" + pattern = r"(?:https?://)?seiso\.party/favorites/artists/?(?:\?([^#]+))?" + test = ( + ("https://seiso.party/favorites/artists", { + "pattern": SeisopartyUserExtractor.pattern, + "url": "0c862434bc3bbbe84cbf41c3a6152473a8cde683", + "count": 3, + }), + ("https://seiso.party/favorites/artists?sort=id&sort_direction=asc", { + "url": "629a8b9c6d3a8a64f521908bdb3d7426ac03f8d3", + }), + ) + + def __init__(self, match): + SeisopartyExtractor.__init__(self, match) + self.query = match.group(1) + + def items(self): + self._prepare_ddosguard_cookies() + self.login() + + url = self.root + "/favorites/artists" + data = {"_extractor": SeisopartyUserExtractor} + params = text.parse_query(self.query) + params["page"] = text.parse_int(params.get("page"), 1) + + while True: + page = self.request(url, params=params).text + + cnt = 0 + for card in text.extract_iter( + page, '<div class="artist-card', '</a>'): + path = text.extract(card, '<a href="', '"')[0] + yield Message.Queue, self.root + path, data + cnt += 1 + + if cnt < 25: + return + params["page"] += 1 |
