Improve storage
This commit is contained in:
@@ -2,6 +2,40 @@ import Foundation
|
||||
|
||||
extension Content {
|
||||
|
||||
func generateFeed() -> Bool {
|
||||
#warning("Implement feed generation")
|
||||
return false
|
||||
}
|
||||
|
||||
func generateAllPages() -> Bool {
|
||||
guard startGenerating() else { return false }
|
||||
defer { endGenerating() }
|
||||
|
||||
for page in pages {
|
||||
for language in ContentLanguage.allCases {
|
||||
guard generateInternal(page, in: language) else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let failedAssetCopies = results.values
|
||||
.reduce(Set()) { $0.union($1.assets) }
|
||||
.filter { !$0.isExternallyStored }
|
||||
.filter { !storage.copy(file: $0.id, to: $0.assetUrl) }
|
||||
|
||||
let failedFileCopies = results.values
|
||||
.reduce(Set()) { $0.union($1.files) }
|
||||
.filter { !$0.isExternallyStored }
|
||||
.filter { !storage.copy(file: $0.id, to: $0.absoluteUrl) }
|
||||
|
||||
|
||||
guard imageGenerator.runJobs(callback: { _ in }) else {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func generatePage(_ page: Page) -> Bool {
|
||||
guard startGenerating() else { return false }
|
||||
defer { endGenerating() }
|
||||
@@ -11,6 +45,20 @@ extension Content {
|
||||
return false
|
||||
}
|
||||
}
|
||||
guard imageGenerator.runJobs(callback: { _ in }) else {
|
||||
return false
|
||||
}
|
||||
|
||||
let failedAssetCopies = results.values
|
||||
.reduce(Set()) { $0.union($1.assets) }
|
||||
.filter { !$0.isExternallyStored }
|
||||
.filter { !storage.copy(file: $0.id, to: $0.assetUrl) }
|
||||
|
||||
let failedFileCopies = results.values
|
||||
.reduce(Set()) { $0.union($1.files) }
|
||||
.filter { !$0.isExternallyStored }
|
||||
.filter { !storage.copy(file: $0.id, to: $0.absoluteUrl) }
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -73,6 +121,13 @@ extension Content {
|
||||
return result
|
||||
}
|
||||
|
||||
// MARK: Images
|
||||
|
||||
func recalculateGeneratedImages() {
|
||||
let images = Set(self.images.map { $0.id })
|
||||
imageGenerator.recalculateGeneratedImages(by: images)
|
||||
}
|
||||
|
||||
// MARK: Generation
|
||||
|
||||
private func startGenerating() -> Bool {
|
||||
@@ -90,64 +145,36 @@ extension Content {
|
||||
}
|
||||
|
||||
private func generateInternal(_ page: Page, in language: ContentLanguage) -> Bool {
|
||||
let pagesFolder = settings.paths.pagesOutputFolderPath
|
||||
guard storage.create(folder: pagesFolder, in: .outputPath) else {
|
||||
print("Failed to generate output folder")
|
||||
return false
|
||||
}
|
||||
let imageGenerator = ImageGenerator(
|
||||
storage: storage,
|
||||
settings: settings)
|
||||
|
||||
let pageGenerator = PageGenerator(
|
||||
content: self,
|
||||
imageGenerator: imageGenerator)
|
||||
|
||||
let content: String
|
||||
let results: PageGenerationResults
|
||||
do {
|
||||
(content, results) = try pageGenerator.generate(page: page, language: language)
|
||||
} catch {
|
||||
print("Failed to generate page \(page.id) in language \(language): \(error)")
|
||||
guard let (content, results) = pageGenerator.generate(page: page, language: language) else {
|
||||
print("Failed to generate page \(page.id) in language \(language)")
|
||||
return false
|
||||
}
|
||||
guard !content.trimmed.isEmpty else {
|
||||
#warning("Generate page with placeholder content")
|
||||
return true
|
||||
|
||||
DispatchQueue.main.async {
|
||||
let id = ItemId(itemId: page.id, language: language, itemType: .page)
|
||||
self.results[id] = results
|
||||
}
|
||||
|
||||
let path = page.absoluteUrl(in: language) + ".html"
|
||||
do {
|
||||
try storage.write(content: content, to: path)
|
||||
} catch {
|
||||
print("Failed to save page \(page.id): \(error)")
|
||||
guard storage.write(content, to: path) else {
|
||||
print("Failed to save page \(page.id)")
|
||||
return false
|
||||
}
|
||||
guard imageGenerator.runJobs(callback: { _ in }) else {
|
||||
return false
|
||||
}
|
||||
guard copy(requiredFiles: results.files) else {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
return true
|
||||
}
|
||||
|
||||
private func copy(requiredFiles: Set<FileResource>) -> Bool {
|
||||
//print("Copying \(requiredVideoFiles.count) files...")
|
||||
for file in requiredFiles {
|
||||
guard !file.isExternallyStored else {
|
||||
continue
|
||||
}
|
||||
|
||||
do {
|
||||
try storage.copy(file: file.id, to: file.absoluteUrl)
|
||||
} catch {
|
||||
print("Failed to copy file \(file.id): \(error)")
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
prefix operator ~>
|
||||
|
||||
prefix func ~> (operation: () throws -> Void) -> Bool {
|
||||
do {
|
||||
try operation()
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user