aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/patreon.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-10-07 02:11:45 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2025-10-07 02:11:45 -0400
commitbbe7fac03d881662a458e7fbf870c9d71f5257f4 (patch)
treeb90b8974242d7fcb381e43c69c215c97c2e99197 /gallery_dl/extractor/patreon.py
parent42b62671fabfdcf983a9575221420d85f7fbcac1 (diff)
New upstream version 1.30.9.upstream/1.30.9
Diffstat (limited to 'gallery_dl/extractor/patreon.py')
-rw-r--r--gallery_dl/extractor/patreon.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/gallery_dl/extractor/patreon.py b/gallery_dl/extractor/patreon.py
index fb2f32c..cf1a6d6 100644
--- a/gallery_dl/extractor/patreon.py
+++ b/gallery_dl/extractor/patreon.py
@@ -230,6 +230,16 @@ class PatreonExtractor(Extractor):
attr["created"], "%Y-%m-%dT%H:%M:%S.%f%z")
return attr
+ def _collection(self, collection_id):
+ url = f"{self.root}/api/collection/{collection_id}"
+ data = self.request_json(url)
+ coll = data["data"]
+ attr = coll["attributes"]
+ attr["id"] = coll["id"]
+ attr["date"] = text.parse_datetime(
+ attr["created_at"], "%Y-%m-%dT%H:%M:%S.%f%z")
+ return attr
+
def _filename(self, url):
"""Fetch filename from an URL's Content-Disposition header"""
response = self.request(url, method="HEAD", fatal=False)
@@ -333,6 +343,33 @@ class PatreonExtractor(Extractor):
raise exception.AbortExtraction("Unable to extract bootstrap data")
+class PatreonCollectionExtractor(PatreonExtractor):
+ """Extractor for a patreon collection"""
+ subcategory = "collection"
+ directory_fmt = ("{category}", "{creator[full_name]}",
+ "Collections", "{collection[title]} ({collection[id]})")
+ pattern = r"(?:https?://)?(?:www\.)?patreon\.com/collection/(\d+)"
+ example = "https://www.patreon.com/collection/12345"
+
+ def posts(self):
+ collection_id = self.groups[0]
+ self.kwdict["collection"] = collection = \
+ self._collection(collection_id)
+ campaign_id = text.extr(
+ collection["thumbnail"]["url"], "/campaign/", "/")
+
+ url = self._build_url("posts", (
+ # patreon returns '400 Bad Request' without campaign_id filter
+ f"&filter[campaign_id]={campaign_id}"
+ "&filter[contains_exclusive_posts]=true"
+ "&filter[is_draft]=false"
+ f"&filter[collection_id]={collection_id}"
+ "&filter[include_drops]=true"
+ "&sort=collection_order"
+ ))
+ return self._pagination(url)
+
+
class PatreonCreatorExtractor(PatreonExtractor):
"""Extractor for a creator's works"""
subcategory = "creator"