feat(tracks): add muxing.original_label to mark original-language tracks

Adds the label to audio, subtitle and embedded audio names unless the name already says it, and escapes track lines in the --list tree.
This commit is contained in:
imSp4rky
2026-10-24 22:51:35 -06:00
parent 80bda08f36
commit cc33600cc7
6 changed files with 105 additions and 13 deletions
+52 -2
View File
@@ -3,14 +3,23 @@ from typing import Callable, Optional
import pytest
from langcodes import Language
from rich.text import Text
from unshackle.core.config import config
from unshackle.core.tracks import Audio, Subtitle, Tracks, Video
from unshackle.core.utilities import language_name, multi_script_languages, with_script
def sub(lang: str, name: Optional[str] = None, sdh: bool = False) -> Subtitle:
return Subtitle(id_="s", url="https://x/s", codec=Subtitle.Codec.WebVTT, language=lang, name=name, sdh=sdh)
def sub(lang: str, name: Optional[str] = None, sdh: bool = False, original: bool = False) -> Subtitle:
return Subtitle(
id_="s",
url="https://x/s",
codec=Subtitle.Codec.WebVTT,
language=lang,
name=name,
sdh=sdh,
is_original_lang=original,
)
def test_multi_script_languages_come_from_cldr() -> None:
@@ -117,6 +126,47 @@ def test_no_language_name_when_track_names_is_none(monkeypatch: pytest.MonkeyPat
assert video.embedded_audio_name() == ""
@pytest.mark.parametrize(
("muxing", "track", "expected"),
[
({"original_label": "[Original]"}, sub("ja", sdh=True, original=True), "Japanese [Original] (SDH)"),
({"original_label": "[Original]"}, sub("ko"), "Korean"),
({"original_label": "| Original", "track_names": "none"}, sub("ja", original=True), "| Original"),
],
)
def test_original_label_follows_the_name_of_an_original_language_track(
muxing: dict, track: Subtitle, expected: str, monkeypatch: pytest.MonkeyPatch
) -> None:
monkeypatch.setattr(config, "muxing", muxing)
assert track.get_track_name() == expected
@pytest.mark.parametrize("name", ["Original", "Japanese [Original]", "Japanese (original)"])
def test_original_label_is_not_added_twice(name: str, monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(config, "muxing", {"original_label": "[Original]"})
assert sub("ja", name=name, original=True).get_track_name() == name
@pytest.mark.parametrize("label", [True, 1, ["Original"], " "])
def test_original_label_that_is_not_text_is_ignored(label: object, monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(config, "muxing", {"original_label": label, "track_names": "none"})
assert sub("ja", sdh=True, original=True).get_track_name() == "SDH"
def test_embedded_audio_takes_the_original_label(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(config, "muxing", {"original_label": "[Original]"})
video = Video(id_="v", url="https://x/v", codec=Video.Codec.AVC, language="ja", is_original_lang=True)
video.data["audio_language"] = "ja"
assert video.embedded_audio_name() == "Japanese [Original]"
def test_track_list_shows_a_bracketed_label_as_text(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(config, "muxing", {"original_label": "[/]"})
tree = Tracks([sub("ja", original=True)]).tree()[0]
labels = [Text.from_markup(node.label).plain for node in tree.children[0].children]
assert labels == ["[VTT] | ja | Japanese [/]"]
def test_subtitle_names_and_tags_the_script_but_keeps_its_language() -> None:
track = sub("zh-TW")
assert track.name is None