forked from jsl/video_editing_poc
Archive successfully clipped sources
This commit is contained in:
parent
aaacd7f592
commit
020edf9821
|
|
@ -26,7 +26,7 @@ Note: the local machine's filesystem root is read-only in this workspace, so abs
|
||||||
6. [x] Add valid-video detection using extension filtering and `ffprobe`.
|
6. [x] Add valid-video detection using extension filtering and `ffprobe`.
|
||||||
7. [x] Add invalid-file handling that logs the reason and moves files to rejected storage.
|
7. [x] Add invalid-file handling that logs the reason and moves files to rejected storage.
|
||||||
8. [x] Add FFmpeg clipping into `/output/clips/<video-name>/` using 8-second MP4/H.264/AAC segments.
|
8. [x] Add FFmpeg clipping into `/output/clips/<video-name>/` using 8-second MP4/H.264/AAC segments.
|
||||||
9. [ ] Add success handling that moves processed source files to processed storage.
|
9. [x] Add success handling that moves processed source files to processed storage.
|
||||||
10. [ ] Add failure handling for FFmpeg or filesystem errors.
|
10. [ ] Add failure handling for FFmpeg or filesystem errors.
|
||||||
11. [ ] Add unit tests for ordering, invalid-file handling, repeat prevention, and state transitions.
|
11. [ ] Add unit tests for ordering, invalid-file handling, repeat prevention, and state transitions.
|
||||||
12. [ ] Add optional FFmpeg integration test for a short fixture.
|
12. [ ] Add optional FFmpeg integration test for a short fixture.
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,8 @@ public class FolderVideoScanScheduler {
|
||||||
log.info("Validated folder video candidate: {}", workingFile.getFileName());
|
log.info("Validated folder video candidate: {}", workingFile.getFileName());
|
||||||
FolderFfmpegClipper.ClipResult clipResult = clipper.clip(workingFile);
|
FolderFfmpegClipper.ClipResult clipResult = clipper.clip(workingFile);
|
||||||
log.info("Generated {} clips in {}", clipResult.clipCount(), clipResult.outputDirectory().getFileName());
|
log.info("Generated {} clips in {}", clipResult.clipCount(), clipResult.outputDirectory().getFileName());
|
||||||
|
Path processedFile = moveToDirectory(workingFile, Path.of(properties.getProcessedDirectory()));
|
||||||
|
log.info("Moved successfully processed source to processed storage: {}", processedFile.getFileName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ class FolderVideoScanSchedulerTest {
|
||||||
|
|
||||||
assertFalse(((AtomicBoolean) scanningField.get(scheduler)).get());
|
assertFalse(((AtomicBoolean) scanningField.get(scheduler)).get());
|
||||||
assertFalse(Files.exists(tempDir.resolve("1.mp4")));
|
assertFalse(Files.exists(tempDir.resolve("1.mp4")));
|
||||||
assertTrue(Files.exists(tempDir.resolve("working/1.mp4")));
|
assertTrue(Files.exists(tempDir.resolve("processed/1.mp4")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -118,7 +118,7 @@ class FolderVideoScanSchedulerTest {
|
||||||
scheduler.scan();
|
scheduler.scan();
|
||||||
|
|
||||||
assertTrue(scheduler.findNextCandidate().isEmpty());
|
assertTrue(scheduler.findNextCandidate().isEmpty());
|
||||||
assertEquals("video", Files.readString(tempDir.resolve("working/1.mp4")));
|
assertEquals("video", Files.readString(tempDir.resolve("processed/1.mp4")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -147,6 +147,18 @@ class FolderVideoScanSchedulerTest {
|
||||||
assertTrue(Files.exists(tempDir.resolve("working/invalid.mp4")));
|
assertTrue(Files.exists(tempDir.resolve("working/invalid.mp4")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void doesNotOverwriteExistingProcessedSource() throws Exception {
|
||||||
|
Files.writeString(tempDir.resolve("1.mp4"), "new video");
|
||||||
|
Files.createDirectory(tempDir.resolve("processed"));
|
||||||
|
Files.writeString(tempDir.resolve("processed/1.mp4"), "existing video");
|
||||||
|
|
||||||
|
assertThrows(IllegalStateException.class, () -> scheduler(tempDir).scan());
|
||||||
|
|
||||||
|
assertEquals("existing video", Files.readString(tempDir.resolve("processed/1.mp4")));
|
||||||
|
assertEquals("new video", Files.readString(tempDir.resolve("working/1.mp4")));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void failsWhenCandidateCannotBeMovedToWorkingDirectory() throws Exception {
|
void failsWhenCandidateCannotBeMovedToWorkingDirectory() throws Exception {
|
||||||
Path candidate = Files.writeString(tempDir.resolve("1.mp4"), "video");
|
Path candidate = Files.writeString(tempDir.resolve("1.mp4"), "video");
|
||||||
|
|
@ -189,6 +201,13 @@ class FolderVideoScanSchedulerTest {
|
||||||
throw new IllegalStateException(ex);
|
throw new IllegalStateException(ex);
|
||||||
}
|
}
|
||||||
properties.getFolderScheduler().setRejectedDirectory(rejectedDirectory.toString());
|
properties.getFolderScheduler().setRejectedDirectory(rejectedDirectory.toString());
|
||||||
|
Path processedDirectory = tempDir.resolve("processed");
|
||||||
|
try {
|
||||||
|
Files.createDirectories(processedDirectory);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new IllegalStateException(ex);
|
||||||
|
}
|
||||||
|
properties.getFolderScheduler().setProcessedDirectory(processedDirectory.toString());
|
||||||
return new FolderVideoScanScheduler(properties, validator, clipper);
|
return new FolderVideoScanScheduler(properties, validator, clipper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue