diff --git a/CHDataManagement/Generator/ImageGenerator.swift b/CHDataManagement/Generator/ImageGenerator.swift index e3b335e..a758c7a 100644 --- a/CHDataManagement/Generator/ImageGenerator.swift +++ b/CHDataManagement/Generator/ImageGenerator.swift @@ -19,7 +19,7 @@ final class ImageGenerator { settings.paths.imagesOutputFolderPath } - private func needsToGenerate(_ version: ImageVersion) -> Bool { + func needsToGenerate(_ version: ImageVersion) -> Bool { if version.wasPreviouslyGenerated { return !exists(version) } @@ -44,10 +44,6 @@ final class ImageGenerator { // MARK: Image operations func generate(version: ImageVersion) -> Bool { - guard needsToGenerate(version) else { - return true - } - if version.type == .avif { if version.image.type == .gif { // Skip GIFs, since they can't be converted by avifenc diff --git a/CHDataManagement/Model/Content+Generation.swift b/CHDataManagement/Model/Content+Generation.swift index 134e2c6..b1d4a22 100644 --- a/CHDataManagement/Model/Content+Generation.swift +++ b/CHDataManagement/Model/Content+Generation.swift @@ -72,19 +72,48 @@ extension Content { private func generateRequiredImages() { let images = results.imagesToGenerate.sorted() + let count = images.count var completed = 0 + + func didFinishOneImage() { + completed += 1 + status("Generating required images: \(completed) / \(count)") + } + + // Finish existing images + var newImagesToGenerate: [ImageVersion] = [] + var avifImagesToGenerate: [ImageVersion] = [] for image in images { guard shouldGenerateWebsite else { return } - defer { - completed += 1 - status("Generating required images: \(completed) / \(count)") - } - if imageGenerator.generate(version: image) { + guard imageGenerator.needsToGenerate(image) else { results.created(outputFile: image.outputPath) + didFinishOneImage() continue } - results.failed(image: image) + if image.type == .avif { + avifImagesToGenerate.append(image) + } else { + newImagesToGenerate.append(image) + } + } + + func generate(images: [ImageVersion]) { + for image in images { + guard shouldGenerateWebsite else { return } + defer { didFinishOneImage() } + if imageGenerator.generate(version: image) { + results.created(outputFile: image.outputPath) + continue + } + results.failed(image: image) + } + } + + generate(images: newImagesToGenerate) + generate(images: avifImagesToGenerate) + if completed != count { + print("Expected \(count) images processed, but only \(completed) were") } } diff --git a/CHDataManagement/Views/Generation/GenerationContentView.swift b/CHDataManagement/Views/Generation/GenerationContentView.swift index 20171da..a62f3bc 100644 --- a/CHDataManagement/Views/Generation/GenerationContentView.swift +++ b/CHDataManagement/Views/Generation/GenerationContentView.swift @@ -71,6 +71,9 @@ struct GenerationContentView: View { GenerationStringIssuesView( text: "unsaved output files", items: $content.results.unsavedOutputFiles) + GenerationStringIssuesView( + text: "failed image generations", + items: $content.results.failedImages) { $0.outputPath } GenerationStringIssuesView( text: "missing files", items: $content.results.missingFiles)