yespornvip was on the WebView fallback, which loaded the ad-heavy host page; the INJECTED_JS scrape grabbed the preroll ad video (bkcdn.net, ~30s) instead of the content, so the native player showed a 30s ad. The get_file content url is also session/cookie-bound (410 for a cookieless ExoPlayer request). Key finding: the VPS now reaches yesporn.vip (HTTP 200 — unblocked, same as porntrex got 2026-05-22), so we can resolve server-side like porntrex instead of relying on the browser. KVS flashvars carry function/0/-obfuscated get_file urls + license_code; decode the hash with the kt_player algorithm (yt-dlp KVS algo, verified to reproduce kt_player's output), then follow each quality's get_file 302 in the same curl_cffi session → final cdn5 url. That url is time-bound signed but NOT IP/cookie-bound — verified portable cross-IP (VPS-resolved url fetched from a different IP → 206 video/mp4). New app/extractors/tubes/yespornvip.py returns 480p/720p/1080p portable CDN urls; registry switched from _vps_blocked_fallback → yespornvip.extract. Mobile plays direct natively with a working quality picker — zero WebView, zero ads, zero proxy. Verified on prod (3 cdn5 sources) and emulator (quality picker → 1080p native decode at 1920px, no WebView, no ad). Backend-only; no OTA needed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| api | ||
| connectors | ||
| extractors | ||
| models | ||
| normalize | ||
| resolve | ||
| scheduler | ||
| templates | ||
| __init__.py | ||
| auth.py | ||
| config.py | ||
| db.py | ||
| ingest.py | ||
| main.py | ||