fix: Originalsprache bei Videos mit KI-synchronisierten Tonspuren
Gefunden mit einem englischen Video (0LmCveTM788): ohne -l wurde Arabisch gewählt, denn jede der 20 Synchron-Tonspuren hat eine eigene „-orig“-Spur. - original_language(): aus „language“, sonst Tonspur mit „original“, sonst die einzige „-orig“-Spur - Automatische Untertitel nur in der Originalsprache (keine Synchronisation) - Sprachen auch mit Region: „en“ findet manuelle Untertitel „en-US“ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
7e6ffa5899
commit
547dcb358d
2 changed files with 108 additions and 19 deletions
|
|
@ -46,6 +46,19 @@ def test_default_language_is_original_audio(fake_yt_dlp, tmp_path, monkeypatch,
|
|||
assert [p.name for p in tmp_path.iterdir()] == ["output.txt"]
|
||||
|
||||
|
||||
def test_default_language_ignores_dubbed_tracks(fake_yt_dlp, tmp_path, monkeypatch):
|
||||
info = {
|
||||
"id": "dub", "language": "en-US", "subtitles": {"en-US": []},
|
||||
"automatic_captions": {"ar-orig": [], "en-orig": []},
|
||||
}
|
||||
run = fake_yt_dlp(info, vtt=VTT)
|
||||
monkeypatch.setattr(yt.subprocess, "run", run)
|
||||
run_main(monkeypatch, "-u", URL, "-o", tmp_path / "out.txt")
|
||||
download = run.calls[1]
|
||||
assert download[download.index("--sub-langs") + 1] == "en-US"
|
||||
assert "--write-subs" in download
|
||||
|
||||
|
||||
def test_fliesstext(fake_yt_dlp, tmp_path, monkeypatch, capsys):
|
||||
long_vtt = "WEBVTT\n\n" + "".join(
|
||||
f"00:00:{i:02d}.000 --> 00:00:{i + 1:02d}.000\nSatz Nummer {i} zum EU-Gipfel.\n\n"
|
||||
|
|
|
|||
|
|
@ -47,6 +47,49 @@ def test_original_language(info, expected):
|
|||
assert yt.original_language(info) == expected
|
||||
|
||||
|
||||
# English original with AI-dubbed audio tracks: every dub has its own "-orig"
|
||||
DUBBED = {
|
||||
"id": "dub",
|
||||
"language": "en-US",
|
||||
"subtitles": {"en-US": []},
|
||||
"automatic_captions": {"ar-orig": [], "en-orig": [], "de-DE-orig": [], "de": []},
|
||||
}
|
||||
DUBBED_NO_METADATA = {
|
||||
"formats": [
|
||||
{"format_note": "Arabic, low", "language": "ar"},
|
||||
{"format_note": "English (US) original (default), low", "language": "en-US"},
|
||||
],
|
||||
"subtitles": {},
|
||||
"automatic_captions": {"ar-orig": [], "en-orig": [], "de-DE-orig": []},
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize("info, lang, expected", [
|
||||
(DUBBED, "en", ("en-US", False)), # region variant of a manual track
|
||||
(DUBBED, "en-US", ("en-US", False)),
|
||||
(DUBBED, "de", None), # only the German AI dub
|
||||
(DUBBED, "ar", None),
|
||||
(DUBBED_NO_METADATA, "en-US", ("en-orig", True)),
|
||||
(DUBBED_NO_METADATA, "en", ("en-orig", True)),
|
||||
(DUBBED_NO_METADATA, "de", None),
|
||||
])
|
||||
def test_choose_track_with_dubbed_audio(info, lang, expected):
|
||||
assert yt.choose_track(info, lang) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize("info, expected", [
|
||||
(DUBBED, "en-US"),
|
||||
(DUBBED_NO_METADATA, "en-US"), # from the audio track marked original
|
||||
({"automatic_captions": {"ar-orig": [], "en-orig": []}}, None),
|
||||
])
|
||||
def test_original_language_with_dubbed_audio(info, expected):
|
||||
assert yt.original_language(info) == expected
|
||||
|
||||
|
||||
def test_available_tracks_hides_dubs():
|
||||
assert yt.available_tracks(DUBBED) == (["en-US"], ["en"])
|
||||
|
||||
|
||||
def test_available_tracks():
|
||||
info = {"subtitles": {"fr": []}, "automatic_captions": {"de-orig": [], "de": []}}
|
||||
assert yt.available_tracks(info) == (["fr"], ["de"])
|
||||
|
|
|
|||
Loading…
Reference in a new issue