feat: VOSTFR/VO/FRENCH detection and subtitle embedding
Docker / docker (push) Successful in 1m32s

Query Arte Player API before each download to determine available stream
versions. Select lang tag (VOSTFR > VO, FRENCH if audio is fr). Embed
French subtitles as default MKV track when VOSTFR. All output now .mkv.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dev
2026-05-10 12:01:48 +02:00
parent 3f17203976
commit e1a2dd1685
2 changed files with 58 additions and 12 deletions
+29
View File
@@ -278,6 +278,35 @@ async def fetch_concerts(page: int = 1, search: str = "", page_size: int = 24, c
}
def get_versions(pid: str) -> list[dict]:
"""Fetch available stream versions from Arte Player API for a programme ID."""
try:
raw = _fetch_url(
PLAYER_API.format(pid=pid),
headers={"User-Agent": _HEADERS["User-Agent"], "Accept": "application/json"},
)
data = json.loads(raw)
streams = data["data"]["attributes"].get("streams") or []
return streams[0].get("versions") or [] if streams else []
except Exception as ex:
logger.debug("Failed to get versions for %s: %s", pid, ex)
return []
def select_lang_tag(versions: list[dict]) -> str:
"""
Determine UNFR language tag from stream versions.
FR audio → FRENCH, non-FR + FR subs → VOSTFR, otherwise → VO.
"""
if not versions:
return "VO"
if any(v.get("audioLanguage") == "fr" for v in versions):
return "FRENCH"
if any(v.get("subtitleLanguage") == "fr" for v in versions):
return "VOSTFR"
return "VO"
async def invalidate_cache() -> int:
_cache["ts"] = 0
try: