chore: apply pre-commit auto-fixes (trim trailing whitespace, EOF)
This commit is contained in:
@@ -20,8 +20,9 @@ from alfred.domain.shared.media import AudioTrack, MediaInfo, SubtitleTrack, Vid
|
||||
|
||||
class TestTracks:
|
||||
def test_audio_track_defaults(self):
|
||||
t = AudioTrack(index=0, codec="aac", channels=2, channel_layout="stereo",
|
||||
language="eng")
|
||||
t = AudioTrack(
|
||||
index=0, codec="aac", channels=2, channel_layout="stereo", language="eng"
|
||||
)
|
||||
assert t.is_default is False
|
||||
|
||||
def test_subtitle_track_defaults(self):
|
||||
@@ -36,7 +37,9 @@ class TestTracks:
|
||||
|
||||
class TestVideoTrackResolution:
|
||||
def test_no_dimensions(self):
|
||||
assert VideoTrack(index=0, codec=None, width=None, height=None).resolution is None
|
||||
assert (
|
||||
VideoTrack(index=0, codec=None, width=None, height=None).resolution is None
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"w,expected",
|
||||
@@ -50,11 +53,16 @@ class TestVideoTrackResolution:
|
||||
],
|
||||
)
|
||||
def test_width_priority(self, w, expected):
|
||||
assert VideoTrack(index=0, codec=None, width=w, height=1080).resolution == expected
|
||||
assert (
|
||||
VideoTrack(index=0, codec=None, width=w, height=1080).resolution == expected
|
||||
)
|
||||
|
||||
def test_widescreen_scope_crop(self):
|
||||
# 1920x960 (scope crop) → still 1080p because width-priority
|
||||
assert VideoTrack(index=0, codec=None, width=1920, height=960).resolution == "1080p"
|
||||
assert (
|
||||
VideoTrack(index=0, codec=None, width=1920, height=960).resolution
|
||||
== "1080p"
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"h,expected",
|
||||
@@ -67,11 +75,15 @@ class TestVideoTrackResolution:
|
||||
],
|
||||
)
|
||||
def test_height_fallback_when_width_missing(self, h, expected):
|
||||
assert VideoTrack(index=0, codec=None, width=None, height=h).resolution == expected
|
||||
assert (
|
||||
VideoTrack(index=0, codec=None, width=None, height=h).resolution == expected
|
||||
)
|
||||
|
||||
def test_width_below_buckets_falls_to_height(self):
|
||||
# width=320 falls below every bucket; falls back to f"{h}p"
|
||||
assert VideoTrack(index=0, codec=None, width=320, height=240).resolution == "240p"
|
||||
assert (
|
||||
VideoTrack(index=0, codec=None, width=320, height=240).resolution == "240p"
|
||||
)
|
||||
|
||||
def test_width_only_below_buckets(self):
|
||||
# width=200, no height → f"{w}w" sentinel
|
||||
@@ -127,9 +139,7 @@ class TestAudioLanguages:
|
||||
assert m.audio_languages == []
|
||||
|
||||
def test_is_multi_audio_false_single_lang(self):
|
||||
m = MediaInfo(
|
||||
audio_tracks=[AudioTrack(0, "aac", 2, "stereo", "eng")]
|
||||
)
|
||||
m = MediaInfo(audio_tracks=[AudioTrack(0, "aac", 2, "stereo", "eng")])
|
||||
assert m.is_multi_audio is False
|
||||
|
||||
def test_is_multi_audio_true(self):
|
||||
|
||||
@@ -49,8 +49,11 @@ def identifier(kb):
|
||||
return SubtitleIdentifier(kb)
|
||||
|
||||
|
||||
def _pattern(strategy: ScanStrategy, root_folder: str | None = None,
|
||||
detection: TypeDetectionMethod = TypeDetectionMethod.TOKEN_IN_NAME) -> SubtitlePattern:
|
||||
def _pattern(
|
||||
strategy: ScanStrategy,
|
||||
root_folder: str | None = None,
|
||||
detection: TypeDetectionMethod = TypeDetectionMethod.TOKEN_IN_NAME,
|
||||
) -> SubtitlePattern:
|
||||
return SubtitlePattern(
|
||||
id=f"test-{strategy.value}",
|
||||
description="",
|
||||
@@ -70,9 +73,7 @@ class TestTokenize:
|
||||
assert _tokenize("Show.S01E01.French") == ["show", "s01e01", "french"]
|
||||
|
||||
def test_mixed_separators(self):
|
||||
assert _tokenize("Show_S01-E01 French") == [
|
||||
"show", "s01", "e01", "french"
|
||||
]
|
||||
assert _tokenize("Show_S01-E01 French") == ["show", "s01", "e01", "french"]
|
||||
|
||||
def test_strips_parenthesized(self):
|
||||
assert _tokenize("episode (Brazil).French") == ["episode", "french"]
|
||||
|
||||
@@ -77,9 +77,7 @@ class TestUnresolved:
|
||||
|
||||
def test_threshold_exact_passes(self, matcher):
|
||||
t = _track(confidence=0.7)
|
||||
rules = SubtitleMatchingRules(
|
||||
min_confidence=0.7, preferred_languages=["fra"]
|
||||
)
|
||||
rules = SubtitleMatchingRules(min_confidence=0.7, preferred_languages=["fra"])
|
||||
matched, unresolved = matcher.match([t], rules)
|
||||
assert matched == [t]
|
||||
|
||||
@@ -92,17 +90,13 @@ class TestUnresolved:
|
||||
class TestLanguageFilter:
|
||||
def test_preferred_languages_filters_out(self, matcher):
|
||||
t_eng = _track(lang=ENG)
|
||||
rules = SubtitleMatchingRules(
|
||||
preferred_languages=["fra"], min_confidence=0.0
|
||||
)
|
||||
rules = SubtitleMatchingRules(preferred_languages=["fra"], min_confidence=0.0)
|
||||
matched, _ = matcher.match([t_eng], rules)
|
||||
assert matched == []
|
||||
|
||||
def test_preferred_language_match_passes(self, matcher):
|
||||
t_fra = _track(lang=FRA)
|
||||
rules = SubtitleMatchingRules(
|
||||
preferred_languages=["fra"], min_confidence=0.0
|
||||
)
|
||||
rules = SubtitleMatchingRules(preferred_languages=["fra"], min_confidence=0.0)
|
||||
matched, _ = matcher.match([t_fra], rules)
|
||||
assert matched == [t_fra]
|
||||
|
||||
@@ -118,17 +112,13 @@ class TestLanguageFilter:
|
||||
class TestFormatFilter:
|
||||
def test_format_outside_preferred_filtered(self, matcher):
|
||||
t = _track(fmt=ASS)
|
||||
rules = SubtitleMatchingRules(
|
||||
preferred_formats=["srt"], min_confidence=0.0
|
||||
)
|
||||
rules = SubtitleMatchingRules(preferred_formats=["srt"], min_confidence=0.0)
|
||||
matched, _ = matcher.match([t], rules)
|
||||
assert matched == []
|
||||
|
||||
def test_no_format_attribute_filtered_when_pref_set(self, matcher):
|
||||
t = _track(fmt=None)
|
||||
rules = SubtitleMatchingRules(
|
||||
preferred_formats=["srt"], min_confidence=0.0
|
||||
)
|
||||
rules = SubtitleMatchingRules(preferred_formats=["srt"], min_confidence=0.0)
|
||||
matched, _ = matcher.match([t], rules)
|
||||
assert matched == []
|
||||
|
||||
@@ -144,9 +134,7 @@ class TestTypeFilter:
|
||||
|
||||
def test_allowed_type_passes(self, matcher):
|
||||
t = _track(stype=SubtitleType.STANDARD)
|
||||
rules = SubtitleMatchingRules(
|
||||
allowed_types=["standard"], min_confidence=0.0
|
||||
)
|
||||
rules = SubtitleMatchingRules(allowed_types=["standard"], min_confidence=0.0)
|
||||
matched, _ = matcher.match([t], rules)
|
||||
assert matched == [t]
|
||||
|
||||
|
||||
@@ -83,11 +83,15 @@ class TestSubtitleCandidateDestName:
|
||||
assert t.destination_name == "fra.sdh.srt"
|
||||
|
||||
def test_forced(self):
|
||||
t = SubtitleCandidate(language=FRA, format=SRT, subtitle_type=SubtitleType.FORCED)
|
||||
t = SubtitleCandidate(
|
||||
language=FRA, format=SRT, subtitle_type=SubtitleType.FORCED
|
||||
)
|
||||
assert t.destination_name == "fra.forced.srt"
|
||||
|
||||
def test_unknown_treated_as_standard(self):
|
||||
t = SubtitleCandidate(language=FRA, format=SRT, subtitle_type=SubtitleType.UNKNOWN)
|
||||
t = SubtitleCandidate(
|
||||
language=FRA, format=SRT, subtitle_type=SubtitleType.UNKNOWN
|
||||
)
|
||||
# UNKNOWN doesn't add a suffix → same as standard.
|
||||
assert t.destination_name == "fra.srt"
|
||||
|
||||
@@ -110,7 +114,9 @@ class TestSubtitleCandidateDestName:
|
||||
|
||||
class TestSubtitleCandidateRepr:
|
||||
def test_embedded_repr(self):
|
||||
t = SubtitleCandidate(language=FRA, format=None, is_embedded=True, confidence=1.0)
|
||||
t = SubtitleCandidate(
|
||||
language=FRA, format=None, is_embedded=True, confidence=1.0
|
||||
)
|
||||
r = repr(t)
|
||||
assert "fra" in r
|
||||
assert "embedded" in r
|
||||
@@ -118,9 +124,7 @@ class TestSubtitleCandidateRepr:
|
||||
def test_external_repr_uses_filename(self, tmp_path):
|
||||
f = tmp_path / "fr.srt"
|
||||
f.write_text("")
|
||||
t = SubtitleCandidate(
|
||||
language=FRA, format=SRT, file_path=f, confidence=0.85
|
||||
)
|
||||
t = SubtitleCandidate(language=FRA, format=SRT, file_path=f, confidence=0.85)
|
||||
r = repr(t)
|
||||
assert "fra" in r
|
||||
assert "fr.srt" in r
|
||||
@@ -159,7 +163,9 @@ class TestMediaSubtitleMetadata:
|
||||
def test_unresolved_tracks_only_external_with_none_lang(self):
|
||||
# An embedded with None language must NOT appear in unresolved_tracks
|
||||
# (the property only iterates external_tracks).
|
||||
embedded_unknown = SubtitleCandidate(language=None, format=None, is_embedded=True)
|
||||
embedded_unknown = SubtitleCandidate(
|
||||
language=None, format=None, is_embedded=True
|
||||
)
|
||||
external_known = SubtitleCandidate(
|
||||
language=FRA, format=SRT, file_path=Path("/a.srt")
|
||||
)
|
||||
@@ -184,10 +190,16 @@ class TestAvailableSubtitles:
|
||||
def test_dedup_by_lang_and_type(self):
|
||||
ENG = SubtitleLanguage(code="eng", tokens=["en"])
|
||||
tracks = [
|
||||
SubtitleCandidate(language=FRA, format=SRT, subtitle_type=SubtitleType.STANDARD),
|
||||
SubtitleCandidate(language=FRA, format=SRT, subtitle_type=SubtitleType.STANDARD),
|
||||
SubtitleCandidate(
|
||||
language=FRA, format=SRT, subtitle_type=SubtitleType.STANDARD
|
||||
),
|
||||
SubtitleCandidate(
|
||||
language=FRA, format=SRT, subtitle_type=SubtitleType.STANDARD
|
||||
),
|
||||
SubtitleCandidate(language=FRA, format=SRT, subtitle_type=SubtitleType.SDH),
|
||||
SubtitleCandidate(language=ENG, format=SRT, subtitle_type=SubtitleType.STANDARD),
|
||||
SubtitleCandidate(
|
||||
language=ENG, format=SRT, subtitle_type=SubtitleType.STANDARD
|
||||
),
|
||||
]
|
||||
result = available_subtitles(tracks)
|
||||
keys = [(t.language.code, t.subtitle_type) for t in result]
|
||||
|
||||
@@ -182,11 +182,13 @@ class TestEpisode:
|
||||
assert e.has_audio_in("ger") is False
|
||||
|
||||
def test_has_audio_in_with_language(self):
|
||||
lang = Language(iso="fre", english_name="French", native_name="Français",
|
||||
aliases=("fr", "fra", "french"))
|
||||
e = self._ep(
|
||||
audio_tracks=[AudioTrack(0, "ac3", 6, "5.1", "fr")]
|
||||
lang = Language(
|
||||
iso="fre",
|
||||
english_name="French",
|
||||
native_name="Français",
|
||||
aliases=("fr", "fra", "french"),
|
||||
)
|
||||
e = self._ep(audio_tracks=[AudioTrack(0, "ac3", 6, "5.1", "fr")])
|
||||
# str query "fre" wouldn't match "fr" directly — but Language does cross-format
|
||||
assert e.has_audio_in(lang) is True
|
||||
assert e.has_audio_in("fre") is False # direct compare misses
|
||||
@@ -205,9 +207,7 @@ class TestEpisode:
|
||||
# ── Subtitle helpers ───────────────────────────────────────────────
|
||||
|
||||
def test_has_subtitles_in(self):
|
||||
e = self._ep(
|
||||
subtitle_tracks=[SubtitleTrack(0, "subrip", "fre")]
|
||||
)
|
||||
e = self._ep(subtitle_tracks=[SubtitleTrack(0, "subrip", "fre")])
|
||||
assert e.has_subtitles_in("fre") is True
|
||||
assert e.has_subtitles_in("eng") is False
|
||||
|
||||
|
||||
Reference in New Issue
Block a user