Import old content, load from disk

This commit is contained in:
Christoph Hagen
2024-11-18 20:19:20 +01:00
parent 0989f06d87
commit 943d8d962b
24 changed files with 1326 additions and 210 deletions

View File

@@ -1,4 +1,5 @@
import Foundation
import SwiftUI
final class Content: ObservableObject {
@@ -17,6 +18,9 @@ final class Content: ObservableObject {
@Published
var files: [FileResources] = []
@AppStorage("contentPath")
var contentPath: String = ""
func generateFeed(for language: ContentLanguage, bookmarkKey: String) {
let posts = posts.map { $0.feedEntry(for: language) }
DispatchQueue.global(qos: .userInitiated).async {
@@ -56,19 +60,178 @@ final class Content: ObservableObject {
}
func importOldContent() {
let importer = Importer()
let storage = Storage(baseFolder: URL(filePath: "/Users/ch/Downloads/Content"))
do {
try importer.importOldContent()
try storage.createFolderStructure()
} catch {
print(error)
return
}
self.posts = importer.posts
self.tags = importer.tags
#warning("TODO: Copy page sources to data folder")
self.pages = importer.pages
self.images = importer.images
#warning("TODO: Copy images to data folder")
let importer = Importer()
do {
try importer.importContent()
} catch {
print(error)
return
}
for (_, file) in importer.files.sorted(by: { $0.key < $1.key }) {
storage.copyFile(at: file.url, fileId: file.name)
// TODO: Store alt text for image and videos
}
var missingPages: [String] = []
for (pageId, page) in importer.pages.sorted(by: { $0.key < $1.key }) {
storage.save(pageMetadata: page.page, for: pageId)
if FileManager.default.fileExists(atPath: page.deContentUrl.path()) {
storage.copyPageContent(from: page.deContentUrl, for: pageId, language: .german)
} else {
missingPages.append(pageId + " (DE)")
}
if FileManager.default.fileExists(atPath: page.enContentUrl.path()) {
storage.copyPageContent(from: page.enContentUrl, for: pageId, language: .english)
} else {
missingPages.append(pageId + " (EN)")
}
}
for (tagId, tag) in importer.tags {
storage.save(tagMetadata: tag, for: tagId)
}
for (postId, post) in importer.posts {
storage.save(post: post, for: postId)
}
let ignoredFiles = importer.ignoredFiles
.map { $0.path() }
.sorted()
print("Ignored files:")
for file in ignoredFiles {
print(file)
}
print("Missing pages:")
for page in missingPages {
print(page)
}
do {
try loadFromDisk()
} catch {
print("Failed to load from disk: \(error)")
}
}
private func convert(_ tag: LocalizedTagFile) -> LocalizedTag {
LocalizedTag(
urlComponent: tag.urlComponent,
name: tag.name,
subtitle: tag.subtitle,
description: tag.description,
thumbnail: tag.thumbnail,
originalUrl: tag.originalURL)
}
func loadFromDisk() throws {
let storage = Storage(baseFolder: URL(filePath: contentPath))
let tagData = try storage.loadAllTags()
let pagesData = try storage.loadAllPages()
let postsData = try storage.loadAllPosts()
let filesData = try storage.loadAllFiles()
let tags = tagData.reduce(into: [:]) { (tags, data) in
tags[data.key] = Tag(german: convert(data.value.german),
english: convert(data.value.english))
}
let pages: [String : Page] = loadPages(pagesData, tags: tags)
let images: [String : ImageResource] = filesData.reduce(into: [:]) { dict, item in
let (file, url) = item
let ext = file.components(separatedBy: ".").last!.lowercased()
let type = FileType(fileExtension: ext)
guard type == .image else { return }
dict[file] = ImageResource(uniqueId: file, altText: .init(en: "", de: ""), fileUrl: url)
}
let files: [FileResources] = filesData.compactMap { file, url in
let ext = file.components(separatedBy: ".").last!.lowercased()
let type = FileType(fileExtension: ext)
guard type == .file else {
return nil
}
return FileResources(uniqueId: file, description: "")
}
let posts = postsData.map { postId, post in
let linkedPage = post.linkedPageId.map { pages[$0] }
let german = LocalizedPost(
title: post.german.title,
content: post.german.content,
lastModified: post.german.lastModifiedDate,
images: post.german.images.compactMap { images[$0] })
let english = LocalizedPost(
title: post.english.title,
content: post.english.content,
lastModified: post.english.lastModifiedDate,
images: post.english.images.compactMap { images[$0] })
return Post(
id: postId,
isDraft: post.isDraft,
createdDate: post.createdDate,
startDate: post.startDate,
endDate: post.endDate,
tags: post.tags.map { tags[$0]! },
german: german,
english: english,
linkedPage: linkedPage)
}
self.tags = tags.values.sorted()
self.pages = pages.values.sorted(ascending: false) { $0.startDate }
self.files = files.sorted { $0.uniqueId }
self.images = images.values.sorted { $0.id }
self.posts = posts.sorted(ascending: false) { $0.startDate }
}
private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] {
pagesData.reduce(into: [:]) { pages, data in
let (pageId, page) = data
let germanPage = LocalizedPage(
urlString: page.german.url,
title: page.german.title,
lastModified: page.german.lastModifiedDate,
originalUrl: page.german.originalURL,
files: page.german.files,
externalFiles: page.german.externalFiles,
requiredFiles: page.german.requiredFiles)
let englishPage = LocalizedPage(
urlString: page.english.url,
title: page.english.title,
lastModified: page.english.lastModifiedDate,
originalUrl: page.english.originalURL,
files: page.english.files,
externalFiles: page.english.externalFiles,
requiredFiles: page.english.requiredFiles)
pages[pageId] = Page(
id: pageId,
isDraft: page.isDraft,
createdDate: page.createdDate,
startDate: page.startDate,
endDate: page.endDate,
german: germanPage,
english: englishPage,
tags: page.tags.map { tags[$0]! })
}
}
static func accessFolderFromBookmark(key: String, operation: (URL) -> Void) {
@@ -100,5 +263,4 @@ final class Content: ObservableObject {
print("Failed to access folder: \(folderURL.path)")
}
}
}