forked from jsl/video_editing_poc
Add cinematic category fixture integration tests
This commit is contained in:
parent
2ec2b9c37f
commit
72a0626ab7
|
|
@ -313,7 +313,8 @@ The plan should be strict JSON so a cheaper model or deterministic renderer can
|
||||||
- [x] Milestone 14 progress: Renderer now writes `qa-report.json` with structural checks, asset resolution checks, overlay safety checks, audio mastering checks, FFmpeg command completion checks, and FFmpeg probe checks for black frames, long silence, and audio clipping.
|
- [x] Milestone 14 progress: Renderer now writes `qa-report.json` with structural checks, asset resolution checks, overlay safety checks, audio mastering checks, FFmpeg command completion checks, and FFmpeg probe checks for black frames, long silence, and audio clipping.
|
||||||
- [x] Milestone 15: Add an operator runbook for placing a video, running the service locally, choosing a model, reviewing the director plan, and finding final clips.
|
- [x] Milestone 15: Add an operator runbook for placing a video, running the service locally, choosing a model, reviewing the director plan, and finding final clips.
|
||||||
- [x] Milestone 15 progress: Added `docs/cinematic-editing-runbook.md` with local setup, source placement, AI director model guidance, edit-plan review, rendering, final output lookup, QA report review, and troubleshooting.
|
- [x] Milestone 15 progress: Added `docs/cinematic-editing-runbook.md` with local setup, source placement, AI director model guidance, edit-plan review, rendering, final output lookup, QA report review, and troubleshooting.
|
||||||
- [ ] Milestone 16: Add integration tests with small fixture videos for family, food, car, and generic content.
|
- [x] Milestone 16: Add integration tests with small fixture videos for family, food, car, and generic content.
|
||||||
|
- [x] Milestone 16 progress: Added FFmpeg-backed local director integration coverage for car, food, family, and generic fixture projects, verifying category artifacts, highlight candidates, and director prompts.
|
||||||
- [ ] Milestone 17: Add benchmark metrics for analysis time, render time, token usage, asset generation cost, and final output size.
|
- [ ] Milestone 17: Add benchmark metrics for analysis time, render time, token usage, asset generation cost, and final output size.
|
||||||
- [ ] Milestone 18: Add a human review mode where the user can approve or edit the AI director plan before rendering.
|
- [ ] Milestone 18: Add a human review mode where the user can approve or edit the AI director plan before rendering.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ import org.example.videoclips.config.VideoClippingProperties;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.condition.EnabledIf;
|
import org.junit.jupiter.api.condition.EnabledIf;
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.CsvSource;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
|
@ -65,6 +67,44 @@ class CinematicEditingIntegrationTest {
|
||||||
assertThat(projects.getProject(projectId).status()).isEqualTo(EditProjectStatus.RENDERED);
|
assertThat(projects.getProject(projectId).status()).isEqualTo(EditProjectStatus.RENDERED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@CsvSource({
|
||||||
|
"car-drive,car-drive.mp4,CAR_VLOG",
|
||||||
|
"food-recipe,food-recipe.mp4,FOOD_VLOG",
|
||||||
|
"family-birthday,family-birthday.mp4,FAMILY_VLOG",
|
||||||
|
"city-walk,city-walk.mp4,GENERIC_VLOG"
|
||||||
|
})
|
||||||
|
void analyzesCategoryFixturesAndCreatesHighlightCandidates(String projectId, String fileName,
|
||||||
|
ContentCategory expectedCategory) throws Exception {
|
||||||
|
VideoClippingProperties properties = properties();
|
||||||
|
ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
|
||||||
|
FileSystemEditProjectStore store = new FileSystemEditProjectStore(properties, mapper);
|
||||||
|
new EditProjectDirectoryInitializer(properties).initialize();
|
||||||
|
Path source = Files.createDirectory(tempDir.resolve("source").resolve(projectId));
|
||||||
|
createClip(source.resolve(fileName), "green", 550);
|
||||||
|
|
||||||
|
EditProjectService projects = new EditProjectService(store, Clock.systemUTC());
|
||||||
|
EditProjectAnalyzer analyzer = new EditProjectAnalyzer(store, new EditClipDiscovery(),
|
||||||
|
new FfmpegClipInspector(properties, mapper), new ThumbnailExtractor(properties),
|
||||||
|
new ContactSheetGenerator(properties), new ProxyGenerator(properties),
|
||||||
|
new CinematicHighlightAnalyzer(Clock.systemUTC()), Clock.systemUTC(), null);
|
||||||
|
StoryboardPromptGenerator storyboard = new StoryboardPromptGenerator(store);
|
||||||
|
AiDirectorPromptGenerator director = new AiDirectorPromptGenerator(store, storyboard, properties);
|
||||||
|
LocalDirectorScheduler scheduler = new LocalDirectorScheduler(
|
||||||
|
properties, projects, new EditClipDiscovery(), analyzer, director, store);
|
||||||
|
|
||||||
|
scheduler.scan();
|
||||||
|
|
||||||
|
CinematicHighlightAnalysis category = store.readJson(projectId, "category.json",
|
||||||
|
CinematicHighlightAnalysis.class);
|
||||||
|
HighlightCandidate[] candidates = mapper.readValue(
|
||||||
|
store.projectDirectory(projectId).resolve("highlight-candidates.json").toFile(),
|
||||||
|
HighlightCandidate[].class);
|
||||||
|
assertThat(category.category()).isEqualTo(expectedCategory);
|
||||||
|
assertThat(candidates).isNotEmpty();
|
||||||
|
assertThat(store.projectDirectory(projectId).resolve("ai-director-prompt.md")).exists();
|
||||||
|
}
|
||||||
|
|
||||||
private VideoClippingProperties properties() {
|
private VideoClippingProperties properties() {
|
||||||
VideoClippingProperties properties = new VideoClippingProperties();
|
VideoClippingProperties properties = new VideoClippingProperties();
|
||||||
properties.getEditing().setProjectDirectory(tempDir.resolve("projects").toString());
|
properties.getEditing().setProjectDirectory(tempDir.resolve("projects").toString());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue