Add more file properties, organize storage, add video block

This commit is contained in:
Christoph Hagen
2025-01-06 15:31:19 +01:00
parent 96c0a75c2f
commit 6cf310d849
25 changed files with 712 additions and 219 deletions

View File

@ -82,7 +82,6 @@ extension Content {
results.failed(image: image)
}
imageGenerator.save()
imageGenerator.writeAvifCommandScript()
//let images = Set(self.images.map { $0.id })
//imageGenerator.recalculateGeneratedImages(by: images)

View File

@ -45,9 +45,6 @@ extension Content {
}
let settings = storage.loadSettings() ?? .default
let imageDescriptions = storage.loadFileDescriptions()
.default([])
.reduce(into: [:]) { $0[$1.fileId] = $1 }
guard let tagData = storage.loadAllTags() else {
print("Failed to load file tags")
@ -73,30 +70,14 @@ extension Content {
}
if fileList.isEmpty { print("No files loaded") }
let externalFiles = storage.loadExternalFileList() ?? []
if externalFiles.isEmpty { print("No external files loaded") }
print("Loaded data from disk, processing...")
// All data loaded from storage, start constructing the data model
var files: [String : FileResource] = fileList.reduce(into: [:]) { files, fileId in
let descriptions = imageDescriptions[fileId]
files[fileId] = FileResource(
content: self,
id: fileId,
isExternallyStored: false,
en: descriptions?.english ?? "",
de: descriptions?.german ?? "")
}
for fileId in externalFiles {
let descriptions = imageDescriptions[fileId]
files[fileId] = FileResource(
content: self,
id: fileId,
isExternallyStored: true,
en: descriptions?.english ?? "",
de: descriptions?.german ?? "")
let files: [String : FileResource] = fileList.reduce(into: [:]) { (files, data) in
let fileId = data.key
let fileData = data.value.data
let isExternal = data.value.isExternal
files[fileId] = FileResource(content: self, id: fileId, file: fileData, isExternalFile: isExternal)
}
let images = files.filter { $0.value.type.isImage }

View File

@ -13,21 +13,7 @@ extension Content {
failedSaves += posts.count { !storage.save(post: $0.postFile, for: $0.id) }
failedSaves += tags.count { !storage.save(tagMetadata: $0.file, for: $0.id) }
failedSaves.increment(!storage.save(settings: settings.file(tagOverview: tagOverview)))
let fileDescriptions: [FileDescriptions] = files.sorted().compactMap { file in
guard !file.english.isEmpty || !file.german.isEmpty else {
return nil
}
return FileDescriptions(
fileId: file.id,
german: file.german.nonEmpty,
english: file.english.nonEmpty)
}
failedSaves.increment(!storage.save(fileDescriptions: fileDescriptions))
let externalFileList = files.filter { $0.isExternallyStored }.map { $0.id }
failedSaves.increment(!storage.save(externalFileList: externalFileList))
failedSaves += files.count { !storage.save(fileInfo: $0.fileInfo, for: $0.id) }
if failedSaves > 0 {
print("Save partially failed with \(failedSaves) errors")

View File

@ -14,6 +14,24 @@ final class FileResource: Item {
@Published
var english: String
@Published
var version: String?
@Published
var sourceUrl: String?
@Published
var generatedImageVersions: Set<String>
@Published
var customOutputPath: String?
@Published
var addedDate: Date
@Published
var modifiedDate: Date
/// The dimensions of the image
@Published
var imageDimensions: CGSize? = nil
@ -22,11 +40,41 @@ final class FileResource: Item {
@Published
var fileSize: Int? = nil
init(content: Content, id: String, isExternallyStored: Bool, en: String, de: String) {
init(content: Content,
id: String,
isExternallyStored: Bool,
english: String?,
german: String?,
version: String? = nil,
sourceUrl: String? = nil,
generatedImageVersions: Set<String> = [],
customOutputPath: String? = nil,
addedDate: Date = .now,
modifiedDate: Date = .now) {
self.type = FileType(fileExtension: id.fileExtension)
self.english = en
self.german = de
self.isExternallyStored = isExternallyStored
self.german = german ?? ""
self.english = english ?? ""
self.version = version
self.sourceUrl = sourceUrl
self.generatedImageVersions = generatedImageVersions
self.customOutputPath = customOutputPath
self.addedDate = addedDate
self.modifiedDate = modifiedDate
super.init(content: content, id: id)
}
init(content: Content, id: String, file: FileResourceFile, isExternalFile: Bool) {
self.type = FileType(fileExtension: id.fileExtension)
self.isExternallyStored = isExternalFile
self.german = file.germanDescription ?? ""
self.english = file.englishDescription ?? ""
self.version = file.version
self.sourceUrl = file.sourceUrl
self.generatedImageVersions = Set(file.generatedImages ?? [])
self.customOutputPath = file.customOutputPath
self.addedDate = file.addedDate
self.modifiedDate = file.modifiedDate
super.init(content: content, id: id)
}
@ -38,6 +86,12 @@ final class FileResource: Item {
self.english = "A test image included in the bundle"
self.german = "Ein Testbild aus dem Bundle"
self.isExternallyStored = true
self.version = nil
self.sourceUrl = nil
self.generatedImageVersions = []
self.customOutputPath = nil
self.addedDate = Date.now
self.modifiedDate = Date.now
super.init(content: .mock, id: resourceImage) // TODO: Add images to mock
}
@ -143,8 +197,10 @@ final class FileResource: Item {
func removeGeneratedImages() {
guard type.isImage else { return }
content.imageGenerator.removeVersions(of: id)
content.storage.deleteInOutputFolder(outputImageFolder)
guard content.storage.deleteInOutputFolder(outputImageFolder) else {
return
}
self.generatedImageVersions = []
}
private var failureImage: Image {
@ -236,6 +292,21 @@ final class FileResource: Item {
}
}
extension FileResource {
var fileInfo: FileResourceFile {
.init(
englishDescription: english.nonEmpty,
germanDescription: german.nonEmpty,
generatedImages: generatedImageVersions.sorted().nonEmpty,
customOutputPath: customOutputPath,
version: version,
sourceUrl: sourceUrl,
addedDate: addedDate,
modifiedDate: modifiedDate)
}
}
extension FileResource: LocalizedItem {
}