pornditt is the same kt_player KVS engine as yespornvip: flashvars carry function/0/-obfuscated get_file urls + license_code, and the VPS reaches it (HTTP 200). It was on _vps_blocked_fallback (WebView), where the scrape grabbed the VAST preroll ad (trafostatic) instead of content (user bug "pornditt łapie reklamę zamiast video"). Extracted the verified yespornvip logic into app/extractors/tubes/_kvs.py (resolve_kvs: fetch page → decode function/0 get_file via kt_player algo → follow 302 in-session → portable CDN, multi-quality). yespornvip.py and new pornditt.py are now thin wrappers. Registry: porndittcom _vps_blocked_fallback → pornditt.extract. Verified on prod: pornditt → 720p/480p on twa.tgprn.com (portable, fresh-session 206 video/mp4); yespornvip still → 1080/720/480p on cdn5 (refactor intact). Backend-only, no OTA — mobile plays mp4+mobile_direct_ok natively with quality picker, zero WebView/ads. Note: a real-browser residential load shows MEDIA_ERR on the content (the page's own player flow / ad gating); server-side decode+follow sidesteps the player entirely, which is why it resolves cleanly. The original bug scene (40f118e1) has its video deleted on pornditt — verified on a live scene (156091). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
1.1 KiB
Python
23 lines
1.1 KiB
Python
"""pornditt.com — KVS (kt_player) direct stream extractor. Patrz app/extractors/tubes/_kvs.py.
|
|
|
|
User bug 2026-05-31 (scene 40f118e1): "Pornditt łapie reklamę zamiast video". pornditt
|
|
był na _vps_blocked_fallback (WebView), gdzie scrape łapał VAST preroll (trafostatic) zamiast
|
|
contentu. Identyczny silnik jak yespornvip: flashvars `video_url`/`video_alt_url` =
|
|
`function/0/...get_file/...` + `license_code`; VPS dociera (HTTP 200). Resolve server-side:
|
|
decode + follow 302 → portable CDN (twa.tgprn.com, time-bound, NIE IP/cookie-bound —
|
|
zweryfikowane cross-IP 2026-06-01 fresh session → 206 video/mp4). Native, multi-quality,
|
|
zero WebView/reklam.
|
|
|
|
NB: runtime `window.flashvars.video_url` pokazuje już ZDEKODOWANY plain get_file, ale raw
|
|
HTML (server-fetch) ma formę `function/0/...` + license — dekodujemy sami (_kvs.real_url).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from app.extractors._models import StreamSource
|
|
from app.extractors.tubes import _kvs
|
|
|
|
_BASE = "https://v.pornditt.com"
|
|
|
|
|
|
def extract(page_url: str, *, timeout: float = 60.0) -> list[StreamSource] | None:
|
|
return _kvs.resolve_kvs(page_url, base_url=_BASE, timeout=timeout)
|