summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/patreon.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/patreon.py')
-rw-r--r--gallery_dl/extractor/patreon.py69
1 files changed, 51 insertions, 18 deletions
diff --git a/gallery_dl/extractor/patreon.py b/gallery_dl/extractor/patreon.py
index 6ac9a83..6aef9cb 100644
--- a/gallery_dl/extractor/patreon.py
+++ b/gallery_dl/extractor/patreon.py
@@ -249,8 +249,23 @@ class PatreonExtractor(Extractor):
return [genmap[ft] for ft in filetypes]
def _extract_bootstrap(self, page):
- return util.json_loads(text.extr(
- page, "window.patreon.bootstrap,", "});") + "}")
+ bootstrap = text.extr(
+ page, 'window.patreon = {"bootstrap":', '},"apiServer"')
+ if bootstrap:
+ return util.json_loads(bootstrap + "}")
+
+ bootstrap = text.extr(page, "window.patreon.bootstrap,", "});")
+ if bootstrap:
+ return util.json_loads(bootstrap + "}")
+
+ data = text.extr(page, "window.patreon = {", "};\n")
+ if data:
+ try:
+ return util.json_loads("{" + data + "}")["bootstrap"]
+ except Exception:
+ pass
+
+ raise exception.StopExtraction("Unable to extract bootstrap data")
class PatreonCreatorExtractor(PatreonExtractor):
@@ -267,34 +282,52 @@ class PatreonCreatorExtractor(PatreonExtractor):
def posts(self):
query = text.parse_query(self.query)
+ campaign_id = self._get_campaign_id(query)
+ filters = self._get_filters(query)
+
+ self.log.debug("campaign_id: %s", campaign_id)
+
+ url = self._build_url("posts", (
+ "&filter[campaign_id]=" + campaign_id +
+ "&filter[contains_exclusive_posts]=true"
+ "&filter[is_draft]=false" + filters +
+ "&sort=" + query.get("sort", "-published_at")
+ ))
+ return self._pagination(url)
- creator_id = query.get("u")
- if creator_id:
- url = "{}/user/posts?u={}".format(self.root, creator_id)
+ def _get_campaign_id(self, query):
+ if self.creator.startswith("id:"):
+ return self.creator[3:]
+
+ campaign_id = query.get("c") or query.get("campaign_id")
+ if campaign_id:
+ return campaign_id
+
+ user_id = query.get("u")
+ if user_id:
+ url = "{}/user/posts?u={}".format(self.root, user_id)
else:
url = "{}/{}/posts".format(self.root, self.creator)
page = self.request(url, notfound="creator").text
try:
+ data = None
data = self._extract_bootstrap(page)
- campaign_id = data["campaign"]["data"]["id"]
- except (KeyError, ValueError):
- raise exception.NotFoundError("creator")
-
- filters = "".join(
+ return data["campaign"]["data"]["id"]
+ except (KeyError, ValueError) as exc:
+ if data:
+ self.log.debug(data)
+ raise exception.StopExtraction(
+ "Unable to extract campaign ID (%s: %s)",
+ exc.__class__.__name__, exc)
+
+ def _get_filters(self, query):
+ return "".join(
"&filter[{}={}".format(key[8:], text.escape(value))
for key, value in query.items()
if key.startswith("filters[")
)
- url = self._build_url("posts", (
- "&filter[campaign_id]=" + campaign_id +
- "&filter[contains_exclusive_posts]=true"
- "&filter[is_draft]=false" + filters +
- "&sort=" + query.get("sort", "-published_at")
- ))
- return self._pagination(url)
-
class PatreonUserExtractor(PatreonExtractor):
"""Extractor for media from creators supported by you"""