Generate video thumbnails

This commit is contained in:
Christoph Hagen
2025-01-25 22:14:31 +01:00
parent 200fdc813d
commit 06b4c1ed76
10 changed files with 254 additions and 54 deletions

View File

@ -136,15 +136,14 @@ final class FileResource: Item, LocalizedItem {
}
}
var imageToDisplay: Image {
guard let imageData = content.storage.fileData(for: id) else {
print("Failed to load data for image \(id)")
return failureImage
var imageToDisplay: Image? {
guard let displayImageData else {
return nil
}
update(fileSize: imageData.count)
guard let loadedImage = NSImage(data: imageData) else {
update(fileSize: displayImageData.count)
guard let loadedImage = NSImage(data: displayImageData) else {
print("Failed to create image \(id)")
return failureImage
return nil
}
update(imageDimensions: loadedImage.size)
@ -167,14 +166,25 @@ final class FileResource: Item, LocalizedItem {
return size
}
private var displayImageData: Foundation.Data? {
if type.isImage {
guard let data = content.storage.fileData(for: id) else {
print("Failed to load data for image \(id)")
return nil
}
return data
}
if type.isVideo {
return content.storage.getVideoThumbnail(for: id)
}
return nil
}
private func getCurrentImageDimensions() -> CGSize? {
guard type.isImage else {
guard let displayImageData else {
return nil
}
guard let imageData = content.storage.fileData(for: id) else {
return nil
}
guard let loadedImage = NSImage(data: imageData) else {
guard let loadedImage = NSImage(data: displayImageData) else {
return nil
}
return loadedImage.size
@ -214,10 +224,6 @@ final class FileResource: Item, LocalizedItem {
self.generatedImageVersions = []
}
private var failureImage: Image {
Image(systemSymbol: .exclamationmarkTriangle)
}
/// The path to the output folder where image versions are stored (no leading slash)
var outputImageFolder: String {
"\(content.settings.paths.imagesOutputFolderPath)/\(id.fileNameWithoutExtension)"
@ -260,6 +266,18 @@ final class FileResource: Item, LocalizedItem {
return content.settings.general.url + version.outputPath
}
// MARK: Video thumbnail
func createVideoThumbnail() {
guard type.isVideo else { return }
guard !content.storage.hasVideoThumbnail(for: id) else { return }
Task {
if await content.imageGenerator.createVideoThumbnail(for: id) {
didChange()
}
}
}
// MARK: Paths
func removeFileFromOutputFolder() {