Add face-based continuity planning, clip diagnostics and draft preview
This commit is contained in:
1 parent
0f64561062
commit
2efe6929d1
10 files changed
+900
-35
No files matched your search
@@ -29,6 +29,7 @@ struct RenderIntegration {
|
||||
|
||||
@MainActor
|
||||
static func main() async throws {
|
||||
try ContinuityChecks.run()
|
||||
let defaults = RenderSettings()
|
||||
try require(defaults.inputFolder == nil && defaults.outputFile == nil
|
||||
&& defaults.ffmpegExecutable == nil && defaults.ffprobeExecutable == nil, "Machine-specific defaults")
|
||||
@@ -124,6 +125,40 @@ struct RenderIntegration {
|
||||
try require(streams.count == 1 && streams[0]["width"] as? Int == 160, "Silent native-size render")
|
||||
print("PASS two-clip render, ownership, dimensions and audio removal")
|
||||
|
||||
let draftSourceState = processor.project!
|
||||
let finalBytesBeforeDraft = try Data(contentsOf: first.outputFileURL)
|
||||
let finalJSONBeforeDraft = try Data(contentsOf: GrowthLapseProject.url(for: first.outputFileURL))
|
||||
var draftSettings = settings
|
||||
draftSettings.outputFormat = .portrait1080x1920
|
||||
processor.startDraft(settings: draftSettings)
|
||||
let draftDeadline = Date().addingTimeInterval(60)
|
||||
while processor.state.isRunning && Date() < draftDeadline { try await Task.sleep(nanoseconds: 20_000_000) }
|
||||
try require(processor.draftOutput != nil && !processor.state.isRunning, "Draft failed: \(processor.state)")
|
||||
try require(processor.project == draftSourceState, "Draft modified the working project")
|
||||
let finalBytesAfterDraft = try Data(contentsOf: first.outputFileURL)
|
||||
let finalJSONAfterDraft = try Data(contentsOf: GrowthLapseProject.url(for: first.outputFileURL))
|
||||
try require(finalBytesBeforeDraft == finalBytesAfterDraft && finalJSONBeforeDraft == finalJSONAfterDraft, "Draft replaced final artifacts")
|
||||
let draftMetadata = try await probe(processor.draftOutput!, tools: service, ffprobe: tools.ffprobe)
|
||||
let draftStreams = draftMetadata["streams"] as! [[String: Any]]
|
||||
let draftVideo = draftStreams.first { $0["codec_type"] as? String == "video" }!
|
||||
try require(draftVideo["width"] as? Int == 360 && draftVideo["height"] as? Int == 640, "Draft dimensions")
|
||||
let draftURL = processor.draftOutput!
|
||||
processor.discardDraft()
|
||||
try require(!manager.fileExists(atPath: draftURL.path), "Draft cleanup failed")
|
||||
print("PASS portrait draft 360x640 preserves final output, project and cache; cleanup removes only draft")
|
||||
|
||||
let analysisOnly = VideoProcessor()
|
||||
var analysisSettings = settings
|
||||
analysisSettings.outputFile = root.appendingPathComponent("Analysis-only.mp4")
|
||||
analysisOnly.analyze(settings: analysisSettings)
|
||||
let analysisDeadline = Date().addingTimeInterval(60)
|
||||
while analysisOnly.state.isRunning && Date() < analysisDeadline { try await Task.sleep(nanoseconds: 20_000_000) }
|
||||
try require(analysisOnly.state == .idle && analysisOnly.project?.clips.count == 2, "Analysis-only failed")
|
||||
try require(!manager.fileExists(atPath: analysisSettings.outputFile!.path), "Analysis created a final video")
|
||||
try require(analysisOnly.project!.clips.allSatisfy { !($0.review?.messages.isEmpty ?? true) }, "Missing-face warnings absent")
|
||||
print("PASS pre-render analysis and missing-face diagnostics without producing final video")
|
||||
|
||||
|
||||
let alias = root.appendingPathComponent("GrowthLapse-alias.growthlapse-cache")
|
||||
try manager.createSymbolicLink(at: alias, withDestinationURL: first.cacheDirectoryURL)
|
||||
try require(!RenderWorkspace.isOwned(alias, by: first.outputFileURL), "Symlink cache accepted")
|
||||
|
||||
Reference in new issue
Block a user