Adds subtitle default dir
This commit is contained in:
@@ -354,6 +354,83 @@ class SubtrackMappingBundleTests(unittest.TestCase):
|
||||
self.assertIn("external subtitle payload", extracted_subtitle)
|
||||
self.assertNotIn("embedded subtitle payload", extracted_subtitle)
|
||||
|
||||
def test_subtitle_prefix_uses_configured_base_directory_when_directory_is_omitted(self):
|
||||
source_filename = "substitute_default_s01e01.mkv"
|
||||
subtitle_prefix = "substitute_default"
|
||||
subtitles_base_dir = self.home_dir / ".local" / "var" / "sync" / "subtitles"
|
||||
resolved_subtitle_dir = subtitles_base_dir / subtitle_prefix
|
||||
resolved_subtitle_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.write_config(
|
||||
{
|
||||
"subtitlesDirectory": "~/.local/var/sync/subtitles",
|
||||
"metadata": {
|
||||
"streams": {
|
||||
"remove": ["BPS"],
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
source_path = create_source_fixture(
|
||||
self.workdir,
|
||||
source_filename,
|
||||
[
|
||||
SourceTrackSpec(TrackType.VIDEO, identity="video-0"),
|
||||
SourceTrackSpec(TrackType.AUDIO, identity="audio-1", language="eng", title="Main Audio"),
|
||||
SourceTrackSpec(
|
||||
TrackType.SUBTITLE,
|
||||
identity="embedded-subtitle",
|
||||
language="eng",
|
||||
title="Embedded Title",
|
||||
extra_tags={"BPS": "remove-me", "EXTERNAL_KEEP": "keep-me"},
|
||||
subtitle_lines=("embedded subtitle payload",),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
write_vtt(
|
||||
resolved_subtitle_dir / f"{subtitle_prefix}_s01e01_2_deu.vtt",
|
||||
("external subtitle payload",),
|
||||
)
|
||||
|
||||
prepare_pattern_database(
|
||||
self.database_path,
|
||||
r"^substitute_default_(s[0-9]+e[0-9]+)\.mkv$",
|
||||
[
|
||||
PatternTrackSpec(index=0, source_index=0, track_type=TrackType.VIDEO),
|
||||
PatternTrackSpec(index=1, source_index=1, track_type=TrackType.AUDIO),
|
||||
PatternTrackSpec(index=2, source_index=2, track_type=TrackType.SUBTITLE),
|
||||
],
|
||||
)
|
||||
|
||||
completed = run_ffx_convert(
|
||||
self.workdir,
|
||||
self.home_dir,
|
||||
self.database_path,
|
||||
"--video-encoder",
|
||||
"copy",
|
||||
"--no-tmdb",
|
||||
"--no-prompt",
|
||||
"--no-signature",
|
||||
"--subtitle-prefix",
|
||||
subtitle_prefix,
|
||||
str(source_path),
|
||||
)
|
||||
self.assertCompleted(completed)
|
||||
|
||||
output_path = expected_output_path(self.workdir, source_filename)
|
||||
streams = ffprobe_json(output_path)["streams"]
|
||||
subtitle_stream = [stream for stream in streams if stream["codec_type"] == "subtitle"][0]
|
||||
|
||||
self.assertEqual(get_tag(subtitle_stream, "language"), "deu")
|
||||
self.assertEqual(get_tag(subtitle_stream, "title"), "Embedded Title")
|
||||
self.assertEqual(get_tag(subtitle_stream, "THIS_IS"), "embedded-subtitle")
|
||||
self.assertEqual(get_tag(subtitle_stream, "EXTERNAL_KEEP"), "keep-me")
|
||||
self.assertIsNone(get_tag(subtitle_stream, "BPS"))
|
||||
|
||||
extracted_subtitle = extract_first_subtitle_text(self.workdir, output_path)
|
||||
self.assertIn("external subtitle payload", extracted_subtitle)
|
||||
self.assertNotIn("embedded subtitle payload", extracted_subtitle)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
84
tests/unit/test_cli_subtitle_directory.py
Normal file
84
tests/unit/test_cli_subtitle_directory.py
Normal file
@@ -0,0 +1,84 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from click.testing import CliRunner
|
||||
|
||||
|
||||
SRC_ROOT = Path(__file__).resolve().parents[2] / "src"
|
||||
|
||||
if str(SRC_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(SRC_ROOT))
|
||||
|
||||
|
||||
from ffx import cli # noqa: E402
|
||||
|
||||
|
||||
class SubtitleDirectoryCliTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.tempdir = tempfile.TemporaryDirectory()
|
||||
self.home_dir = Path(self.tempdir.name) / "home"
|
||||
self.home_dir.mkdir()
|
||||
self.database_path = Path(self.tempdir.name) / "test.db"
|
||||
|
||||
def tearDown(self):
|
||||
self.tempdir.cleanup()
|
||||
|
||||
def write_config(self, data: dict) -> None:
|
||||
config_dir = self.home_dir / ".local" / "etc"
|
||||
config_dir.mkdir(parents=True, exist_ok=True)
|
||||
(config_dir / "ffx.json").write_text(json.dumps(data), encoding="utf-8")
|
||||
|
||||
def invoke_convert(self, *args: str):
|
||||
runner = CliRunner()
|
||||
return runner.invoke(
|
||||
cli.ffx,
|
||||
[
|
||||
"--database-file",
|
||||
str(self.database_path),
|
||||
"convert",
|
||||
"--no-tmdb",
|
||||
*args,
|
||||
],
|
||||
env={**os.environ, "HOME": str(self.home_dir)},
|
||||
)
|
||||
|
||||
def test_subtitle_prefix_without_directory_or_default_fails(self):
|
||||
result = self.invoke_convert("--subtitle-prefix", "dball")
|
||||
|
||||
self.assertNotEqual(0, result.exit_code)
|
||||
self.assertIn("no --subtitle-directory was provided", result.output)
|
||||
self.assertIn("no subtitlesDirectory default is configured", result.output)
|
||||
|
||||
def test_subtitle_prefix_without_directory_fails_when_configured_subdir_is_missing(self):
|
||||
subtitles_base_dir = self.home_dir / ".local" / "var" / "sync" / "subtitles"
|
||||
subtitles_base_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.write_config({"subtitlesDirectory": "~/.local/var/sync/subtitles"})
|
||||
|
||||
result = self.invoke_convert("--subtitle-prefix", "dball")
|
||||
|
||||
self.assertNotEqual(0, result.exit_code)
|
||||
self.assertIn("resolved subtitle directory does not exist", result.output)
|
||||
self.assertIn(str(subtitles_base_dir / "dball"), result.output)
|
||||
|
||||
def test_explicit_subtitle_directory_wins_over_missing_default(self):
|
||||
explicit_subtitle_directory = self.home_dir / "manual-subtitles"
|
||||
explicit_subtitle_directory.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
result = self.invoke_convert(
|
||||
"--subtitle-directory",
|
||||
str(explicit_subtitle_directory),
|
||||
"--subtitle-prefix",
|
||||
"dball",
|
||||
)
|
||||
|
||||
self.assertEqual(0, result.exit_code, result.output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user