From fc3e54275b7e7285aa0505bf5a0cd88db77a191c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Tue, 28 Apr 2020 23:56:48 +0200 Subject: [PATCH] [patreon] respect filters and sort order in query params (#711) --- gallery_dl/extractor/patreon.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/gallery_dl/extractor/patreon.py b/gallery_dl/extractor/patreon.py index f34115ec..570bd72c 100644 --- a/gallery_dl/extractor/patreon.py +++ b/gallery_dl/extractor/patreon.py @@ -205,7 +205,7 @@ class PatreonCreatorExtractor(PatreonExtractor): subcategory = "creator" pattern = (r"(?:https?://)?(?:www\.)?patreon\.com" r"/(?!(?:home|join|posts|login|signup)(?:$|[/?&#]))" - r"(?:user(?:/posts)?/?\?([^#]+)|([^/?&#]+)/?)") + r"([^/?&#]+)(?:/posts)?/?(?:\?([^#]+))?") test = ( ("https://www.patreon.com/koveliana", { "range": "1-25", @@ -224,6 +224,10 @@ class PatreonCreatorExtractor(PatreonExtractor): "title" : str, }, }), + ("https://www.patreon.com/koveliana/posts?filters[month]=2020-3", { + "count": 1, + "keyword": {"date": "dt:2020-03-30 21:21:44"}, + }), ("https://www.patreon.com/kovelianot", { "exception": exception.NotFoundError, }), @@ -233,26 +237,33 @@ class PatreonCreatorExtractor(PatreonExtractor): def __init__(self, match): PatreonExtractor.__init__(self, match) - self.query, self.creator = match.groups() + self.creator, self.query = match.groups() def posts(self): - if self.creator: - url = "{}/{}".format(self.root, self.creator.lower()) + query = text.parse_query(self.query) + + creator_id = query.get("u") + if creator_id: + url = "{}/user?u={}".format(self.root, creator_id) else: - query = text.parse_query(self.query) - url = "{}/user?u={}".format(self.root, query.get("u")) + url = "{}/{}".format(self.root, self.creator.lower()) page = self.request(url, notfound="creator").text campaign_id = text.extract(page, "/campaign/", "/")[0] - if not campaign_id: raise exception.NotFoundError("creator") + filters = "".join( + "&filter[{}={}".format(key[8:], text.escape(value)) + for key, value in query.items() + if key.startswith("filters[") + ) + url = self._build_url("posts", ( - "&sort=-published_at" + "&sort=" + query.get("sort", "-published_at") + "&filter[is_draft]=false" "&filter[contains_exclusive_posts]=true" - "&filter[campaign_id]=" + campaign_id + "&filter[campaign_id]=" + campaign_id + filters )) return self._pagination(url)