diff --git a/src/ffx/cli.py b/src/ffx/cli.py index 9e2b487..146db52 100755 --- a/src/ffx/cli.py +++ b/src/ffx/cli.py @@ -585,6 +585,7 @@ def unmux(ctx, cpu): from ffx.file_properties import FileProperties from ffx.process import executeProcess + from ffx.shifted_season_controller import ShiftedSeasonController from ffx.track_disposition import TrackDisposition from ffx.track_type import TrackType @@ -605,6 +606,8 @@ def unmux(ctx, if create_output_directory and existingSourcePaths and not ctx.obj.get('dry_run', False): os.makedirs(output_directory, exist_ok=True) + shiftedSeasonController = ShiftedSeasonController(ctx.obj) + for sourcePath in existingSourcePaths: fp = FileProperties(ctx.obj, sourcePath) @@ -621,8 +624,12 @@ def unmux(ctx, currentShowDescriptor, ) - season = fp.getSeason() - episode = fp.getEpisode() + season, episode = shiftedSeasonController.shiftSeason( + fp.getShowId(), + season=fp.getSeason(), + episode=fp.getEpisode(), + patternId=currentPattern.getId() if currentPattern is not None else None, + ) #TODO: Recognition für alle Formate anpassen targetLabel = label if label else fp.getFileBasename() diff --git a/tests/integration/test_cli_unmux.py b/tests/integration/test_cli_unmux.py index 84b4b52..a09728f 100644 --- a/tests/integration/test_cli_unmux.py +++ b/tests/integration/test_cli_unmux.py @@ -18,6 +18,7 @@ from tests.support.ffx_bundle import ( from ffx.pattern_controller import PatternController from ffx.show_controller import ShowController from ffx.show_descriptor import ShowDescriptor +from ffx.shifted_season_controller import ShiftedSeasonController from ffx.track_codec import TrackCodec from ffx.track_descriptor import TrackDescriptor from ffx.track_type import TrackType @@ -109,6 +110,31 @@ class UnmuxCliTests(unittest.TestCase): finally: dispose_controller_context(context) + def add_show_shift( + self, + *, + show_id: int, + original_season: int, + first_episode: int, + last_episode: int, + season_offset: int, + episode_offset: int, + ) -> None: + context = build_controller_context(self.database_path) + try: + ShiftedSeasonController(context).addShiftedSeason( + showId=show_id, + shiftedSeasonObj={ + "original_season": original_season, + "first_episode": first_episode, + "last_episode": last_episode, + "season_offset": season_offset, + "episode_offset": episode_offset, + }, + ) + finally: + dispose_controller_context(context) + def test_subtitles_only_without_output_directory_uses_configured_base_plus_label(self): self.write_config( { @@ -223,6 +249,55 @@ class UnmuxCliTests(unittest.TestCase): output_filenames, ) + def test_unmux_applies_shifted_season_mapping_to_output_filenames(self): + self.seed_matching_show( + r"^unmux_([sS][0-9]+[eE][0-9]+)\.mkv$", + indicator_season_digits=2, + indicator_episode_digits=2, + ) + self.add_show_shift( + show_id=1, + original_season=1, + first_episode=1, + last_episode=99, + season_offset=1, + episode_offset=-88, + ) + source_filename = "unmux_s01e89.mkv" + output_directory = self.workdir / "unmux-output" + output_directory.mkdir() + source_path = create_source_fixture( + self.workdir, + source_filename, + [ + SourceTrackSpec(TrackType.VIDEO, identity="video-0"), + SourceTrackSpec( + TrackType.SUBTITLE, + identity="subtitle-1", + language="eng", + subtitle_lines=("subtitle payload",), + ), + ], + ) + + completed = run_ffx_unmux( + self.workdir, + self.home_dir, + self.database_path, + "--label", + "dball", + "--output-directory", + str(output_directory), + "--subtitles-only", + str(source_path), + ) + self.assertCompleted(completed) + + self.assertIn( + "Unmuxing stream 1 into file dball_S02E01_1_eng", + completed.stderr, + ) + if __name__ == "__main__": unittest.main()