# Descarga pack Purah (WaifuInvoker) desde Pawchive y genera hoja de contacto.
# Las URLs t1.pawchive.pw son temporales firmadas (e=...); se descargan con
# Referer de la página del post o devuelven 403.

import json
import pathlib
import re
import urllib.request
from PIL import Image, ImageDraw, ImageFont

BASE = pathlib.Path(r"C:\Users\Usuario\Downloads\SD")
OUTDIR = BASE / "Output" / "pawchive_refs" / "WaifuInvoker_Purah_Zelda"
OUTDIR.mkdir(parents=True, exist_ok=True)
PAGE = "https://pawchive.pw/patreon/user/94454331/post/174460865"

# URLs extraídas vía Browser MCP `eval` (figure a t1.pawchive) — se guardan en
# el JSON pegado abajo para no depender de la sesión del navegador.
# (Fuente: snapshot 09-11-2026, post 174460865, 102 attachments)
URLS = """https://t1.pawchive.pw/f/8da67546ef794517/0.png?e=1794241354&s=8ab9339ec8dd993e881f2a1969c3a539 https://t1.pawchive.pw/f/4a3f3839ecaa666e/2.png?e=1794241354&s=22c22aa0f91a8a0d4bbd04770da1d016 https://t1.pawchive.pw/f/75f561f7b087d5c8/1.png?e=1794241354&s=f0e588371ab00062fd4ad098f72db27e https://t1.pawchive.pw/f/d62918afa8dfd297/3.png?e=1794241354&s=caaf8162cf63562cb47cc571ffd7f5c7 https://t1.pawchive.pw/f/9d83863c321d5fd0/4.png?e=1794241354&s=35e55f254aec63e5d4c370c1c15357eb https://t1.pawchive.pw/f/46dc306e63f083cb/5.png?e=1794241354&s=83b322d2db25f690eb5adaaa41725f1b https://t1.pawchive.pw/f/1b62561e614492a0/6.png?e=1794241354&s=86e575d4694745010438850a0f54a383 https://t1.pawchive.pw/f/0877706d72120f17/7.png?e=1794241354&s=5fa20171f1b4236183c81871671f7c94 https://t1.pawchive.pw/f/f449216a2cdb9218/8.png?e=1794241354&s=ba9b5599c3a399d98b3165f9a030fece https://t1.pawchive.pw/f/97e9704005096f4c/9.png?e=1794241354&s=b774004901db860fb417afc3f753507c https://t1.pawchive.pw/f/ed830b43fd63c77b/10.png?e=1794241354&s=1240cd6c285f6f4c511745807f633ddb https://t1.pawchive.pw/f/80037173efa8f79c/11.png?e=1794241354&s=60749b0ff28e91ee881c17ed5e94aceb https://t1.pawchive.pw/f/afd3a433fd33022b/12.png?e=1794241354&s=0fab03139e9b389d79d56620df117bca https://t1.pawchive.pw/f/deafb1063780f61c/13.png?e=1794241354&s=b5729622d58dd057b980d3f7f4307bb1 https://t1.pawchive.pw/f/57b49f1f617e572f/14.png?e=1794241354&s=3bf61299fb1a131ef195c099d95166a3 https://t1.pawchive.pw/f/7d41df9d1e338f29/15.png?e=1794241354&s=b34f0059022ea350ac1edec9bf4869fa https://t1.pawchive.pw/f/3f9fa7ee71e67bf3/16.png?e=1794241354&s=e353c6f78e0915a24e009887dda0c132 https://t1.pawchive.pw/f/3e9517f7477fec7a/17.png?e=1794241354&s=28d65ae63a2a6d6d7d97563629f7ea86 https://t1.pawchive.pw/f/17c15bd20d31023b/18.png?e=1794241354&s=2b0b32897fcfe2655aa655be0b7e449f https://t1.pawchive.pw/f/36ee392b476aa693/19.png?e=1794241354&s=0a2033ab69910388518d3fee84816a8b https://t1.pawchive.pw/f/6568a0b92acb48c2/20.png?e=1794241354&s=fa779b018674ef0dbdef71a864d8c7d5 https://t1.pawchive.pw/f/df80bba323f264aa/21.png?e=1794241354&s=ba04e67e96eb616a1063bd386c5265c9 https://t1.pawchive.pw/f/6520e32ad2ca8ee0/22.png?e=1794241354&s=db7545d77271d30a3c6d94ed0236552d https://t1.pawchive.pw/f/5b0f10c60f834513/23.png?e=1794241354&s=f56893f1e32abbb7df0f775e7abd6cd0 https://t1.pawchive.pw/f/faefe6d3a854a98e/24.png?e=1794241354&s=41a105c995c7c2148170707da60bd593 https://t1.pawchive.pw/f/f82ea57075ed90d1/25.png?e=1794241354&s=7bd0145b1c1bf618589a9e3a1e600b12 https://t1.pawchive.pw/f/2505ee1af5b801dc/26.png?e=1794241354&s=9c81a33cf93e686571ecd9cd70063ee2 https://t1.pawchive.pw/f/f0731ad517814e00/27.png?e=1794241354&s=0af4ef87a77c7aece22a49dcf5ab692a https://t1.pawchive.pw/f/50ef2066f29231d8/28.png?e=1794241354&s=7d95ed1b57144b899e48958311895800 https://t1.pawchive.pw/f/e1ca9b986189bd37/29.png?e=1794241354&s=52affc21386bb96935a7d7842915ba9a https://t1.pawchive.pw/f/94978857844e403a/30.png?e=1794241354&s=5a23d18c4fa7e1907c557b48f30e5a05 https://t1.pawchive.pw/f/68724057f61ff290/31.png?e=1794241354&s=c847dfd333e2a5ad325ae90525db59cb https://t1.pawchive.pw/f/de91ffc8d6ca31af/32.png?e=1794241354&s=5da77efd756a16873966e90d39cc13f0 https://t1.pawchive.pw/f/d19505869570699b/33.png?e=1794241354&s=21bb04660eda04316e7b6f96afcc2cd5 https://t1.pawchive.pw/f/42455fd36c85bde3/34.png?e=1794241354&s=e8e7e30147ae92fe1ceb8fae6b8fd055 https://t1.pawchive.pw/f/a7710215c88f7ed6/35.png?e=1794241354&s=162f6bc06a478d5d9eb2056ef6bcba52 https://t1.pawchive.pw/f/fb1c17d941817d88/36.png?e=1794241354&s=c6be9fd87725971be91900fd28032fac https://t1.pawchive.pw/f/0e4c0a819fd67b5c/37.png?e=1794241354&s=020e4a52363d3cbaa1103a53e75c5e15 https://t1.pawchive.pw/f/22d43b4d16867526/38.png?e=1794241354&s=0e92b30ecbdf2167d5408149a545fff4 https://t1.pawchive.pw/f/05c496adebfb3608/39.png?e=1794241354&s=7ba13cd388091761841718de0dc026dc https://t1.pawchive.pw/f/e9507c7d90d3d3b0/40.png?e=1794241354&s=3a6d0e0085f3ca5f9e8028438b03b8a0 https://t1.pawchive.pw/f/bcc26740cf5fd116/41.png?e=1794241354&s=879f30083a017138c0696f024e270f01 https://t1.pawchive.pw/f/3a9ed44c9763c4ff/42.png?e=1794241354&s=a79f2c0e1fb9d33ad206c86ad5f61dff https://t1.pawchive.pw/f/6b9a0943014b950d/43.png?e=1794241354&s=135aa2194d2f318e4e93a194dc7a3696 https://t1.pawchive.pw/f/2287fc1ed2b899aa/44.png?e=1794241354&s=0dcdddd77ca3dd08b53273decb5de09b https://t1.pawchive.pw/f/7d4965fc60329442/45.png?e=1794241354&s=dd363095ea60a5eda105e9cabc8cd432 https://t1.pawchive.pw/f/cad961bc6be3f9d2/46.png?e=1794241354&s=d0d352f23a36cc2d83231b1569968d1e https://t1.pawchive.pw/f/756804795450f001/47.png?e=1794241354&s=3d9c98afb826f7c3a01e4e5bc7c49151 https://t1.pawchive.pw/f/b66dd7de36dd60a4/48.png?e=1794241354&s=68eaec61701df47874dc9dd433b229a5 https://t1.pawchive.pw/f/e2fa01f9ae2e1e98/49.png?e=1794241354&s=b6466dfdd73d7d593d506e24900d30ac https://t1.pawchive.pw/f/323085b8cfe63db3/50.png?e=1794241354&s=fccf37d20ccad0ea1b7b696d2b035f75 https://t1.pawchive.pw/f/558ae79b735e8280/51.png?e=1794241354&s=cca4ea8fabb126c90df6b4405ae272dd https://t1.pawchive.pw/f/d9f4b76a901cabba/52.png?e=1794241354&s=52a72e3881db12941908b43606c8d555 https://t1.pawchive.pw/f/796c1a3e344e5294/53.png?e=1794241354&s=183ee8f342c6ae8a060a33406bf664fe https://t1.pawchive.pw/f/2763472711108f2c/54.png?e=1794241354&s=293336c0998a071944507c6d173d0f6d https://t1.pawchive.pw/f/0d5ac05a8d899cae/55.png?e=1794241354&s=59205944b6edea607e8b9e74a543760e https://t1.pawchive.pw/f/f63b20c6016504f6/56.png?e=1794241354&s=9aea45065eb80c983b5e30223e688eed https://t1.pawchive.pw/f/56778ddb2ee57d0f/57.png?e=1794241354&s=e8b90a91e1e709c69ac45381628999d4 https://t1.pawchive.pw/f/a3fbce5dcb331131/58.png?e=1794241354&s=e4bd7fa68f526ab3f024cc1c2439b6fa https://t1.pawchive.pw/f/0837d2223c5760cc/59.png?e=1794241354&s=bad6606a7a91ba6ddbfd607c37fc4d03 https://t1.pawchive.pw/f/7c79627837290b8d/60.png?e=1794241354&s=46a46ede1792406b63b19503f2022587 https://t1.pawchive.pw/f/0522aede55afb51b/61.png?e=1794241354&s=ffa3951b872e195e3c0a6dd268bc89d6 https://t1.pawchive.pw/f/75bb24009e812966/62.png?e=1794241354&s=554a36af26d1f3183372081445731760 https://t1.pawchive.pw/f/bf2aca65c37d28f8/63.png?e=1794241354&s=aea3ded5a60ae75586c76d36ca539c4a https://t1.pawchive.pw/f/58163044b4fb84ff/64.png?e=1794241354&s=fb0e3e87858dcd64833dd0ce71f03cee https://t1.pawchive.pw/f/a3874a21ee3387d0/65.png?e=1794241354&s=d6954a11baf085dd99a2f17ada00c207 https://t1.pawchive.pw/f/ecefc07d5039c51a/66.png?e=1794241354&s=d00e13d7a9c6200f5f65144d35083ceb https://t1.pawchive.pw/f/d99f1cba2521db13/67.png?e=1794241354&s=a3318e32d6f09b7b370caded160b7203 https://t1.pawchive.pw/f/fd6e27ee98eeda72/68.png?e=1794241354&s=16471aebe91f5bd42d1123f867ef6e61 https://t1.pawchive.pw/f/448deeaa724027ff/69.png?e=1794241354&s=e6ed98f51e0f16094f9966e2080c4c3d https://t1.pawchive.pw/f/d871e808eb9917fb/70.png?e=1794241354&s=98785483344dcd18910554c0ce2a21ff https://t1.pawchive.pw/f/0acb0b9fff4ff567/71.png?e=1794241354&s=6b22f41d3a469c1baa2bf6281d63eefc https://t1.pawchive.pw/f/1e5eba04ee3ec436/72.png?e=1794241354&s=e195c741c3fe7e7b3283e1abd655b46a https://t1.pawchive.pw/f/c54e70f7938884a7/73.png?e=1794241354&s=077d355eef675651b09ee08a616fe4cc https://t1.pawchive.pw/f/4dfee4b0bab27ae3/74.png?e=1794241354&s=d1907d3e27ed73a32322960128e1f3a6 https://t1.pawchive.pw/f/d61fc411fc41ce17/75.png?e=1794241354&s=28a28f679a7bef047312092a24ba5eb8 https://t1.pawchive.pw/f/1cbccc88874e293d/76.png?e=1794241354&s=34c968ac54d78e02b2516ccbd4675437 https://t1.pawchive.pw/f/e544f19d7ff79e6a/77.png?e=1794241354&s=225462ad503d22e66df5589e49a0a337 https://t1.pawchive.pw/f/3f454af9be86c17f/78.png?e=1794241354&s=aa3888922efc4d166b0a801ae630f89e https://t1.pawchive.pw/f/f893c2574a97dfb7/79.png?e=1794241354&s=c6c3fcc19f13109add742d909813f200 https://t1.pawchive.pw/f/33e6161108055e0f/80.png?e=1794241354&s=4809a5042ed1613da15d0a9cb2318e06 https://t1.pawchive.pw/f/544bff7c92a42444/81.png?e=1794241354&s=7dad82019c200b4cd2beadc957b4c593 https://t1.pawchive.pw/f/6759784ff628d1df/82.png?e=1794241354&s=3937225178588338082c9a1bb2500120 https://t1.pawchive.pw/f/9f8c0b579c7adfda/83.png?e=1794241354&s=651c57fbb6c432a16e353814d66e4845 https://t1.pawchive.pw/f/48c31b4a6f7a4479/84.png?e=1794241354&s=7e2159e7e768e6fb65091e390c554f60 https://t1.pawchive.pw/f/47b63a5472028894/85.png?e=1794241354&s=35fb7f3b6276b3d344347b4bae4fb46e https://t1.pawchive.pw/f/af976718dae3726b/86.png?e=1794241354&s=91aa1670e88e9ef5015307a824388b77 https://t1.pawchive.pw/f/419ba5779285cd59/87.png?e=1794241354&s=44368c37eb041a582aaa9fe202c952f1 https://t1.pawchive.pw/f/9bf4e1363b2fa343/88.png?e=1794241354&s=a933048ca5f8efd8662100d117715b67 https://t1.pawchive.pw/f/6060e05cf126b902/89.png?e=1794241354&s=0ab3d15815c8d4e4955045742fe071a5 https://t1.pawchive.pw/f/769e3a8f1a28f581/90.png?e=1794241354&s=09d3dde5cfd75202765c66e4780ab43d https://t1.pawchive.pw/f/8dab4467be83e90b/91.png?e=1794241354&s=003d6435ae445729b7be1fd200bfabf4 https://t1.pawchive.pw/f/00263e41e8867267/92.png?e=1794241354&s=301dfaad6f2aa25668b96e450504c7f8 https://t1.pawchive.pw/f/e0883207302dec32/93.png?e=1794241354&s=d580bcb052b0405bf73e2ec2b1f53e57 https://t1.pawchive.pw/f/38587b4860767ddc/94.png?e=1794241354&s=9071c685238f89fff25629476ae9ba8b https://t1.pawchive.pw/f/c34c2bf68ac6b0f8/95.png?e=1794241354&s=7db694b40fd8fe74e4503465ab52ffcb https://t1.pawchive.pw/f/c79c05ae22b5b8c7/96.png?e=1794241354&s=8f0ec2416b260bde9e2ed2bceb31f745 https://t1.pawchive.pw/f/ebe1f52ae684acad/97.png?e=1794241354&s=d841a8370be00bc7820044288f3e9699 https://t1.pawchive.pw/f/f2439f3e0d31f5fc/98.png?e=1794241354&s=7856ed2e1eb6ba4d7df346e1ca68948d https://t1.pawchive.pw/f/3dc466207a61b838/99.png?e=1794241354&s=0c91d13b5c4934320830f794b613c038 https://t1.pawchive.pw/f/8f862f392016f45d/100.png?e=1794241354&s=2058ccb2df9094953cf860cf36c8f11a https://t1.pawchive.pw/f/83ea996cb820e55e/101.png?e=1794241354&s=1a8d3aa886637a79f9e4d26c4b49e12f"""

def idx_of(url: str) -> int:
    m = re.search(r"/(\d+)\.png\?", url)
    return int(m.group(1)) if m else 0

urls = sorted(URLS.split(), key=idx_of)
print(f"urls: {len(urls)}")

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36",
    "Referer": PAGE,
}
ok = fail = 0
for u in urls:
    i = idx_of(u)
    dest = OUTDIR / f"{i:03d}.png"
    if dest.exists():
        ok += 1
        continue
    try:
        req = urllib.request.Request(u, headers=headers)
        with urllib.request.urlopen(req, timeout=30) as r, open(dest, "wb") as f:
            f.write(r.read())
        ok += 1
    except Exception as e:
        print(f"fail {i}: {e}")
        fail += 1
print(f"downloaded ok={ok} fail={fail} dir={OUTDIR}")

# Hoja de contacto: 8 columnas x 13 filas (102 imgs), thumb 230px
files = sorted(OUTDIR.glob("*.png"))
COLS, THUMB, PAD, LABEL_H = 8, 230, 6, 26
thumbs = []
for p in files:
    im = Image.open(p).convert("RGB")
    r = THUMB / im.width
    thumbs.append((p.stem, im.resize((THUMB, int(im.height * r)))))
rows = (len(thumbs) + COLS - 1) // COLS
cell_h = max(t[1].height for t in thumbs) + LABEL_H + PAD * 2
W = COLS * (THUMB + PAD) + PAD
H = rows * cell_h + PAD
sheet = Image.new("RGB", (W, H), (18, 18, 18))
d = ImageDraw.Draw(sheet)
try:
    font = ImageFont.load_default(size=13)
except TypeError:
    font = ImageFont.load_default()
for k, (name, th) in enumerate(thumbs):
    x = PAD + (k % COLS) * (THUMB + PAD)
    y = PAD + (k // COLS) * cell_h
    sheet.paste(th, (x, y + LABEL_H))
    d.text((x + 2, y + 4), name, fill=(255, 210, 120), font=font)
out = BASE / "Output" / "pawchive_purah_sheet.jpg"
sheet.save(out, quality=88)
print(out, sheet.size)
