- Parser no longer requires a pagination block: single-page results
(small tags, short searches) used to parse to zero items.
- Search path is slugged like the site's own form: "2b/9s" 404'd, "%20"
is refused with 403 and "&" truncated the query.
- Probed archives need >= 4 videos to beat keyword search ("elf girl" was a
one-video tag); conclusive query -> target resolutions are remembered for 6h
so later pages and the prefetch skip the probes.
- Enriched details are cached per video URL for 2h (tokens last ~12h);
detail fetches go through get_probe so a lasting 429 stops the batch instead
of escalating each page to Jina/FlareSolverr. Archive failures serve stale
cache.
- requester: get_probe waits before retrying 429/5xx and compares redirect
paths percent-decoded (non-ASCII archives like /tags/pokémon-species/ were
treated as redirected away); get_with_headers backs off 1/2/4s on 429.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUYdCh2nCVsQYgJAT7gwSi
Raw requester calls did not adopt the remembered FlareSolverr user agent,
so a RedGifs token minted under it was rejected on every gif lookup.
Tag/creator pages that mix non-RedGifs sources are refilled from later
cursor batches instead of coming back empty.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUYdCh2nCVsQYgJAT7gwSi
- Implement fullporner.com provider with search, pagination, categories, pornstars
- Add xiaoshenke.net proxy for Cloudflare-protected embed videos
- Proxy fetches signed URLs via FlareSolverr and streams video content
- Fix quality bitmask mapping (1=360p, 2=480p, 4=720p, 8=1080p)
- Support HEAD/GET/Range for video streaming
Co-Authored-By: Claude Code <noreply@anthropic.com>
- wowxxx: site migrated wow.xxx -> wowxxx.to; update BASE_URL and stop
pinning Version::HTTP_11, which mismatched the TLS handshake's h2 ALPN
and got scored as a bot (same root cause already fixed for jable.tv)
- porndish: recognize playmogo.com iframes as the same Doodstream-clone
embed protocol as myvidplay.com (confirmed live) instead of falling
through to a naive branch that pointed formats[0] at the unresolved,
Cloudflare-protected iframe URL; kept in sync in both providers/porndish.rs
and proxies/porndish.rs since single-provider builds can't share code
across that boundary
- noodlemagazine: entity-decode the thumb URL pulled from a raw
data-original="..." attribute - undecoded `&` in the query string
was getting the CDN to 400 the request
- requester.rs: cap the previously-unbounded HTTP 429 retry loop at 3
attempts before falling through to the existing Jina/FlareSolverr
fallback, instead of retrying forever with no bound
Also fixes check.py: the thumbnail check never consulted the
CF-protected-host allowlist (only the page-url check did), and adds
missav.ws/surrit.com, tik.porn/image-cdn.tik.porn, vrporn.com, and
www.wowxxx.to/img.wowxxx.to to that allowlist - all four providers
already work fine through the app's real client; the checker's plain
probes (and its yt-dlp invocation, which never applies a channel's
declared ytdlpCommand impersonation flag) just can't replicate that.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QTqf6orbHZ9rFFpVpcgzcR
Three bugs prevented jable.tv from returning items:
1. FlaresolverrCookie deserialization (root cause): fields like `expires`,
`size`, `priority`, `sameParty`, `sourceScheme`, `sourcePort` are
omitted by FlareSolverr for session cookies, causing serde to fail with
"missing field" and the entire solve to return Err. Added #[serde(default)]
to all non-essential cookie fields.
2. Transport-error branch in get_with_headers: when direct fetch fails with
a transport error and Jina returns a CF challenge body, the old code
returned Ok(challenge_html) instead of falling through to FlareSolverr.
Now checks looks_like_cloudflare_challenge and breaks to FS.
3. Post-FlareSolverr retry: wreq's Firefox136 TLS fingerprint causes CF to
drop the connection even with FS cookies applied, so request.send()
returns Err. Was propagated with `?`; now catches and returns
res.solution.response (the headless-browser body) directly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New channel: hotbunny (AI-generated hentai, hotbunny.ai JSON API).
Includes thumbnail proxy (/proxy/hotbunny-thumb/) since assets.hotbunny.ai
is CF bot-managed. check.py updated to treat CF-protected format URLs as
warnings rather than errors.
requester.rs: store_response_cookies now honours the Domain attribute in
Set-Cookie headers — cookies scoped to .domain.com are registered against
the parent domain so the wreq Jar returns them for sub.domain.com requests
automatically, without per-provider workarounds.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>