Files
unshackle/tests/core/test_dual_multi_naming.py
T
imSp4rky 17d4905577 fix(titles): compare dub languages under their macrolanguage
A cmn track on a zh title no longer gets DUBBED, and nb and nn count as no; yue stays separate.
2026-10-29 21:23:45 -06:00

155 lines
4.2 KiB
Python

"""Tests for {dual}/{multi}/{dubbed} filename variables and dual_multi_mode."""
from __future__ import annotations
import types
import pytest
from unshackle.core.config import config
from unshackle.core.titles.movie import Movie
class DummyService:
pass
def make_audio(language: str) -> types.SimpleNamespace:
"""Audio track stub carrying just the attributes the context builder reads."""
return types.SimpleNamespace(
language=language,
format="AAC",
channel_layout=None,
channellayout_original=None,
channel_s=2,
channels=2,
format_additionalfeatures=None,
joc=None,
)
def make_media_info(languages: list[str]) -> types.SimpleNamespace:
return types.SimpleNamespace(video_tracks=[], audio_tracks=[make_audio(lang) for lang in languages])
def make_movie(language) -> Movie:
return Movie(id_="movie-0001", service=DummyService, name="The Film", year=2024, language=language)
@pytest.fixture
def strict_mode(monkeypatch):
monkeypatch.setattr(config, "dual_multi_mode", "strict")
@pytest.fixture
def count_mode(monkeypatch):
monkeypatch.setattr(config, "dual_multi_mode", "count")
def ctx(language, languages) -> dict:
return make_movie(language).build_base_template_context(make_media_info(languages))
def test_strict_dual_with_original(strict_mode):
c = ctx("en", ["en", "es"])
assert c["dual"] == "DUAL"
assert c["multi"] == ""
assert c["dubbed"] == ""
def test_strict_two_dubs_no_original(strict_mode):
c = ctx("en", ["es", "fr"])
assert c["dual"] == ""
assert c["multi"] == ""
assert c["dubbed"] == ""
def test_strict_regional_variants_collapse(strict_mode):
c = ctx("en", ["en-US", "en-GB"])
assert c["dual"] == ""
assert c["multi"] == ""
assert c["dubbed"] == ""
def test_strict_multi(strict_mode):
c = ctx("en", ["es", "fr", "de"])
assert c["multi"] == "MULTi"
assert c["dual"] == ""
assert c["dubbed"] == ""
def test_strict_two_unknown_original(strict_mode):
c = ctx(None, ["en", "es"])
assert c["dual"] == ""
assert c["multi"] == ""
assert c["dubbed"] == ""
def test_strict_dubbed(strict_mode):
c = ctx("en", ["es"])
assert c["dubbed"] == "DUBBED"
assert c["dual"] == ""
assert c["multi"] == ""
def test_strict_single_unknown_original_no_dubbed(strict_mode):
c = ctx(None, ["es"])
assert c["dubbed"] == ""
assert c["dual"] == ""
assert c["multi"] == ""
@pytest.mark.parametrize(
("language", "languages", "tags"),
[
("zh", ["cmn"], set()),
("zh-TW", ["cmn-TW"], set()),
("cmn", ["zh-CN"], set()),
("zh", ["zh", "cmn"], set()),
("zh", ["cmn", "yue"], {"dual"}),
("cmn", ["yue"], {"dubbed"}),
("yue", ["cmn"], {"dubbed"}),
("ar", ["arb"], set()),
("no", ["nb-NO"], set()),
("nb", ["nn"], set()),
("no", ["nb", "da"], {"dual"}),
],
)
def test_strict_counts_an_individual_language_as_its_macrolanguage(strict_mode, language, languages, tags):
c = ctx(language, languages)
assert {name for name in ("dual", "multi", "dubbed") if c[name]} == tags
def test_the_primary_audio_is_the_original_language_under_its_macrolanguage(strict_mode):
media_info = make_media_info(["yue", "cmn"])
media_info.audio_tracks[1].channel_s = 6
assert make_movie("zh").build_base_template_context(media_info)["audio_channels"] == "6.0"
def test_count_dual_ignores_original(count_mode):
c = ctx(None, ["en", "es"])
assert c["dual"] == "DUAL"
assert c["multi"] == ""
assert c["dubbed"] == ""
def test_count_multi(count_mode):
c = ctx(None, ["es", "fr", "de"])
assert c["multi"] == "MULTi"
assert c["dual"] == ""
assert c["dubbed"] == ""
def test_count_never_dubbed(count_mode):
c = ctx("en", ["es"])
assert c["dubbed"] == ""
assert c["dual"] == ""
assert c["multi"] == ""
def test_a_missing_template_key_falls_back_instead_of_raising(monkeypatch):
"""dl only checks output_template is non-empty, so the title's own key can be absent."""
monkeypatch.setattr(config, "output_template", {"series": "{title}"})
name = make_movie("en").get_filename(make_media_info(["en"]))
assert name == "The Film (2024)"