diff --git a/src/ffx/cli.py b/src/ffx/cli.py index 387060f..08de4d7 100755 --- a/src/ffx/cli.py +++ b/src/ffx/cli.py @@ -1276,7 +1276,8 @@ def convert(ctx, targetMediaDescriptor.importSubtitles(context['subtitle_directory'], context['subtitle_prefix'], showSeason, - showEpisode) + showEpisode, + preserve_dispositions=True) # ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getAllTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getAllTrackDescriptors()]}") ctx.obj['logger'].debug(f"tmd subindices: {[t.getIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getSubIndex() for t in targetMediaDescriptor.getTrackDescriptors()]} {[t.getDispositionFlag(TrackDisposition.DEFAULT) for t in targetMediaDescriptor.getTrackDescriptors()]}") diff --git a/src/ffx/media_descriptor.py b/src/ffx/media_descriptor.py index c0db35d..deee087 100644 --- a/src/ffx/media_descriptor.py +++ b/src/ffx/media_descriptor.py @@ -500,7 +500,14 @@ class MediaDescriptor: return subtitleFileDescriptors - def importSubtitles(self, searchDirectory, prefix, season: int = -1, episode: int = -1): + def importSubtitles( + self, + searchDirectory, + prefix, + season: int = -1, + episode: int = -1, + preserve_dispositions: bool = False, + ): # click.echo(f"Season: {season} Episode: {episode}") self.__logger.debug(f"importSubtitles(): Season: {season} Episode: {episode}") @@ -543,7 +550,7 @@ class MediaDescriptor: # Prefer metadata coming from the external single-track source when # it is provided explicitly by the filename contract. matchingTrack.getTags()["language"] = msfd["language"] - if msfd["disposition_set"]: + if msfd["disposition_set"] and not preserve_dispositions: matchingTrack.setDispositionSet(msfd["disposition_set"]) diff --git a/tests/unit/test_media_descriptor_import_subtitles.py b/tests/unit/test_media_descriptor_import_subtitles.py new file mode 100644 index 0000000..6754b0e --- /dev/null +++ b/tests/unit/test_media_descriptor_import_subtitles.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from pathlib import Path +import sys +import tempfile +import unittest + + +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.logging_utils import get_ffx_logger # noqa: E402 +from ffx.media_descriptor import MediaDescriptor # noqa: E402 +from ffx.track_descriptor import TrackDescriptor # noqa: E402 +from ffx.track_disposition import TrackDisposition # noqa: E402 +from ffx.track_type import TrackType # noqa: E402 + + +class MediaDescriptorImportSubtitlesTests(unittest.TestCase): + def make_descriptor(self) -> MediaDescriptor: + return MediaDescriptor( + context={"logger": get_ffx_logger()}, + track_descriptors=[ + TrackDescriptor( + index=3, + source_index=3, + sub_index=0, + track_type=TrackType.SUBTITLE, + tags={"language": "eng", "title": "DB Subtitle"}, + disposition_set={TrackDisposition.DEFAULT}, + ) + ], + ) + + def test_import_subtitles_preserves_target_dispositions_when_requested(self): + descriptor = self.make_descriptor() + + with tempfile.TemporaryDirectory() as tmpdir: + sidecar_path = Path(tmpdir) / "dball_S01E01_3_deu_FOR.vtt" + sidecar_path.write_text("WEBVTT\n\n", encoding="utf-8") + + descriptor.importSubtitles( + tmpdir, + "dball", + season=1, + episode=1, + preserve_dispositions=True, + ) + + track = descriptor.getSubtitleTracks()[0] + self.assertEqual(str(sidecar_path), track.getExternalSourceFilePath()) + self.assertEqual("deu", track.getTags()["language"]) + self.assertEqual({TrackDisposition.DEFAULT}, track.getDispositionSet()) + + def test_import_subtitles_uses_sidecar_dispositions_by_default(self): + descriptor = self.make_descriptor() + + with tempfile.TemporaryDirectory() as tmpdir: + sidecar_path = Path(tmpdir) / "dball_S01E01_3_deu_FOR.vtt" + sidecar_path.write_text("WEBVTT\n\n", encoding="utf-8") + + descriptor.importSubtitles( + tmpdir, + "dball", + season=1, + episode=1, + ) + + track = descriptor.getSubtitleTracks()[0] + self.assertEqual(str(sidecar_path), track.getExternalSourceFilePath()) + self.assertEqual("deu", track.getTags()["language"]) + self.assertEqual({TrackDisposition.FORCED}, track.getDispositionSet()) + + +if __name__ == "__main__": + unittest.main()