diff --git a/main.py b/main.py index f92f481..f7c7cb1 100755 --- a/main.py +++ b/main.py @@ -26,17 +26,15 @@ import mpv def build_export_path(folder: str, basename: str, counter: int, sub: int | None = None) -> str: - name = f"{basename}_{counter:03d}" - if sub is not None: - name += f"_{sub}" - return os.path.join(folder, name + ".mp4") + group = f"{basename}_{counter:03d}" + name = f"{group}_{sub}" if sub is not None else group + return os.path.join(folder, group, name + ".mp4") def build_sequence_dir(folder: str, basename: str, counter: int, sub: int | None = None) -> str: - name = f"{basename}_{counter:03d}" - if sub is not None: - name += f"_{sub}" - return os.path.join(folder, name) + group = f"{basename}_{counter:03d}" + name = f"{group}_{sub}" if sub is not None else group + return os.path.join(folder, group, name) def format_time(seconds: float) -> str: @@ -1799,6 +1797,9 @@ class MainWindow(QMainWindow): else: name = self._txt_name.text() or "clip" n_clips = self._spn_clips.value() + # Create the group subfolder + group_dir = os.path.join(folder, f"{name}_{self._export_counter:03d}") + os.makedirs(group_dir, exist_ok=True) jobs = [] for sub in range(n_clips): start = self._cursor + sub * spread diff --git a/tests/test_utils.py b/tests/test_utils.py index 4e005f4..6d2c9f5 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -4,21 +4,21 @@ from main import _normalize_filename, ProcessedDB def test_build_export_path_first(): - assert build_export_path("/out", "clip", 1) == "/out/clip_001.mp4" + assert build_export_path("/out", "clip", 1) == "/out/clip_001/clip_001.mp4" def test_build_export_path_counter(): - assert build_export_path("/out", "clip", 42) == "/out/clip_042.mp4" + assert build_export_path("/out", "clip", 42) == "/out/clip_042/clip_042.mp4" def test_build_export_path_deep_counter(): - assert build_export_path("/out", "shot", 999) == "/out/shot_999.mp4" + assert build_export_path("/out", "shot", 999) == "/out/shot_999/shot_999.mp4" def test_build_export_path_sub(): - assert build_export_path("/out", "clip", 1, sub=0) == "/out/clip_001_0.mp4" - assert build_export_path("/out", "clip", 1, sub=2) == "/out/clip_001_2.mp4" + assert build_export_path("/out", "clip", 1, sub=0) == "/out/clip_001/clip_001_0.mp4" + assert build_export_path("/out", "clip", 1, sub=2) == "/out/clip_001/clip_001_2.mp4" def test_build_sequence_dir_sub(): - assert build_sequence_dir("/out", "clip", 1, sub=0) == "/out/clip_001_0" - assert build_sequence_dir("/out", "clip", 1, sub=1) == "/out/clip_001_1" + assert build_sequence_dir("/out", "clip", 1, sub=0) == "/out/clip_001/clip_001_0" + assert build_sequence_dir("/out", "clip", 1, sub=1) == "/out/clip_001/clip_001_1" def test_format_time_seconds(): assert format_time(0.0) == "0:00.0" @@ -216,10 +216,10 @@ def test_audio_extract_timing(): def test_build_sequence_dir_basic(): - assert build_sequence_dir("/out", "clip", 1) == "/out/clip_001" + assert build_sequence_dir("/out", "clip", 1) == "/out/clip_001/clip_001" def test_build_sequence_dir_counter(): - assert build_sequence_dir("/out", "clip", 42) == "/out/clip_042" + assert build_sequence_dir("/out", "clip", 42) == "/out/clip_042/clip_042" def test_ffmpeg_command_image_sequence(): cmd = build_ffmpeg_command("/in/v.mp4", 0.0, "/out/seq_001", image_sequence=True)