"""Wspólne elementy sieci TXXX (vjav, fullvideosporn/sextu, …). Silnik TXXX oddaje URL pliku przez `GET /api/videofile.php?video_id=&lifetime=N` w polu `video_url`, zaciemnionym DWIEMA warstwami: 1. wielkie/małe litery łacińskie podmienione na cyrylickie homoglify (М→M, С→C, …), 2. custom alfabet base64: `,`→`/`, `~`→`=`, `-`→`+`. Po odkręceniu obu i b64decode dostajemy `/get_file/...` (czasem absolutny URL). Wyniesione tutaj, żeby vjav i fullvideosporn nie trzymały dwóch kopii dekodera. """ from __future__ import annotations import base64 # Cyrylickie homoglify → łacina. Bez tego b64decode dostaje śmieci. HOMOGLYPHS = str.maketrans( { "А": "A", "В": "B", "С": "C", "Е": "E", "Н": "H", "К": "K", "М": "M", "О": "O", "Р": "P", "Т": "T", "Х": "X", "У": "Y", "а": "a", "с": "c", "е": "e", "о": "o", "р": "p", "х": "x", "у": "y", } ) def decode_video_url(obfuscated: str) -> str | None: """Zaciemniony `video_url` → ścieżka/URL `get_file`. None gdy dekod padnie.""" if not obfuscated: return None clean = ( obfuscated.translate(HOMOGLYPHS) .replace(",", "/") .replace("~", "=") .replace("-", "+") ) clean += "=" * (-len(clean) % 4) # padding do wielokrotności 4 try: return base64.b64decode(clean).decode("utf-8", "ignore") except Exception: return None