b54243a1ff
The cookie was pinned to .subscribestar.adult only; cookies are domain-scoped, so sources on subscribestar.art (Elasid, event #54116) never sent it and every poll 302d to /age_confirmation_warning. Emit one line per domain (.com/.adult/.art) with a per-domain presence check, and admit .art in the platform url_pattern. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
"""SubscribeStar — three quirks colocated.
|
|
|
|
1. external_post_id: gallery-dl puts the per-attachment id in `id`
|
|
(e.g. 711509) and the actual post id in `post_id` (e.g. 360360).
|
|
The default chain in base.py already prefers `post_id`; this module
|
|
doesn't need to override it but the comment lives here too so a
|
|
future reader knows the chain's order was driven by this platform.
|
|
|
|
2. post_url: gallery-dl's `url` is the file CDN URL
|
|
(`/post_uploads?payload=...`). Synthesize the post permalink from
|
|
`post_id`.
|
|
|
|
3. augment_cookies: the server gates artist pages behind a
|
|
`_personalization_id` age-confirmation cookie that the user can't
|
|
easily refresh — SubscribeStar's frontend JS uses localStorage to
|
|
suppress the age popup once dismissed. gallery-dl's own login flow
|
|
sidesteps this by setting `18_plus_agreement_generic=true`; we mirror
|
|
that for cookies captured via the extension — on EVERY SubscribeStar
|
|
domain, because cookies are domain-scoped and the wall exists on all
|
|
of them: an .adult-only line never rides along to a .art creator page
|
|
(Elasid, event #54116 — every poll 302'd to /age_confirmation_warning).
|
|
"""
|
|
|
|
from .base import GD_DEFAULTS, PlatformInfo, str_id_value
|
|
|
|
|
|
def derive_post_url(data: dict) -> str | None:
|
|
pid = str_id_value(data.get("post_id"))
|
|
if pid:
|
|
return f"https://www.subscribestar.com/posts/{pid}"
|
|
return None
|
|
|
|
|
|
# All domains SubscribeStar serves creators from; the age wall gates each.
|
|
_SS_DOMAINS = (".subscribestar.com", ".subscribestar.adult", ".subscribestar.art")
|
|
|
|
|
|
def augment_cookies(netscape: str) -> str:
|
|
# Far-future expiry — gallery-dl's own login flow sets this with no
|
|
# explicit expiry; the server only checks presence/value.
|
|
expiry = 4102444800 # 2100-01-01 UTC
|
|
body = netscape.rstrip("\n")
|
|
if not body:
|
|
body = "# Netscape HTTP Cookie File"
|
|
lines = netscape.splitlines()
|
|
for domain in _SS_DOMAINS:
|
|
# Per-domain presence check: captured cookies carrying the age
|
|
# cookie for one domain must not suppress injection on the others.
|
|
if any(
|
|
line.startswith(domain + "\t") and "18_plus_agreement_generic" in line
|
|
for line in lines
|
|
):
|
|
continue
|
|
body += "\n" + "\t".join([
|
|
domain, "TRUE", "/", "TRUE",
|
|
str(expiry), "18_plus_agreement_generic", "true",
|
|
])
|
|
return body + "\n"
|
|
|
|
|
|
INFO = PlatformInfo(
|
|
key="subscribestar",
|
|
name="SubscribeStar",
|
|
description="Download posts from SubscribeStar creators",
|
|
auth_type="cookies",
|
|
requires_auth=True,
|
|
url_pattern=r"^https?://(www\.)?subscribestar\.(com|adult|art)/",
|
|
url_examples=[
|
|
"https://subscribestar.adult/example_artist",
|
|
"https://www.subscribestar.com/example_artist",
|
|
"https://subscribestar.art/example_artist",
|
|
],
|
|
default_config={**GD_DEFAULTS, "content_types": ["all"]},
|
|
derive_post_url=derive_post_url,
|
|
augment_cookies=augment_cookies,
|
|
)
|