Add videos, delete unused files
This commit is contained in:
@ -76,9 +76,7 @@ final class Storage {
|
||||
|
||||
func createFolderStructure() throws {
|
||||
try create(folder: pagesFolder)
|
||||
try create(folder: imagesFolder)
|
||||
try create(folder: filesFolder)
|
||||
try create(folder: videosFolder)
|
||||
try create(folder: postsFolder)
|
||||
try create(folder: tagsFolder)
|
||||
}
|
||||
@ -88,16 +86,20 @@ final class Storage {
|
||||
/// The folder path where the markdown and metadata files of the pages are stored (by their id/url component)
|
||||
private var pagesFolder: URL { subFolder("pages") }
|
||||
|
||||
private func pageFileUrl(pageId: String) -> URL {
|
||||
pagesFolder.appending(path: pageId, directoryHint: .notDirectory)
|
||||
private func pageContentFileName(_ id: String, _ language: ContentLanguage) -> String {
|
||||
"\(id)-\(language.rawValue).md"
|
||||
}
|
||||
|
||||
private func pageFileName(_ id: String) -> String {
|
||||
id + ".json"
|
||||
}
|
||||
|
||||
private func pageContentUrl(pageId: String, language: ContentLanguage) -> URL {
|
||||
pagesFolder.appending(path: "\(pageId)-\(language.rawValue).md", directoryHint: .notDirectory)
|
||||
pagesFolder.appending(path: pageContentFileName(pageId, language), directoryHint: .notDirectory)
|
||||
}
|
||||
|
||||
private func pageMetadataUrl(pageId: String) -> URL {
|
||||
pagesFolder.appending(path: pageId + ".json", directoryHint: .notDirectory)
|
||||
pagesFolder.appending(path: pageFileName(pageId), directoryHint: .notDirectory)
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
@ -136,6 +138,14 @@ final class Storage {
|
||||
}
|
||||
}
|
||||
|
||||
func deletePageFiles(notIn pages: [String]) throws {
|
||||
var files = Set(pages.map(pageFileName))
|
||||
for language in ContentLanguage.allCases {
|
||||
files.formUnion(pages.map { pageContentFileName($0, language) })
|
||||
}
|
||||
try deleteFiles(in: pagesFolder, notIn: files)
|
||||
}
|
||||
|
||||
// MARK: Posts
|
||||
|
||||
/// The folder path where the markdown files of the posts are stored (by their unique id/url component)
|
||||
@ -164,6 +174,11 @@ final class Storage {
|
||||
return try post(at: url)
|
||||
}
|
||||
|
||||
func deletePostFiles(notIn posts: [String]) throws {
|
||||
let files = Set(posts.map { $0 + ".json" })
|
||||
try deleteFiles(in: postsFolder, notIn: files)
|
||||
}
|
||||
|
||||
// MARK: Tags
|
||||
|
||||
/// The folder path where the source images are stored (by their unique name)
|
||||
@ -187,19 +202,9 @@ final class Storage {
|
||||
try loadAll(in: tagsFolder)
|
||||
}
|
||||
|
||||
// MARK: Images
|
||||
|
||||
/// The folder path where the source images are stored (by their unique name)
|
||||
private var imagesFolder: URL { subFolder("images") }
|
||||
|
||||
private func imageUrl(image: String) -> URL {
|
||||
imagesFolder.appending(path: image, directoryHint: .notDirectory)
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
func copyImage(at url: URL, imageId: String) -> Bool {
|
||||
let contentUrl = imageUrl(image: imageId)
|
||||
return copy(file: url, to: contentUrl, type: "image", id: imageId)
|
||||
func deleteTagFiles(notIn tags: [String]) throws {
|
||||
let files = Set(tags.map { $0 + ".json" })
|
||||
try deleteFiles(in: tagsFolder, notIn: files)
|
||||
}
|
||||
|
||||
// MARK: Files
|
||||
@ -223,23 +228,8 @@ final class Storage {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Videos
|
||||
|
||||
/// The folder path where source videos are stored (by their unique name)
|
||||
private var videosFolder: URL { subFolder("videos") }
|
||||
|
||||
private func videoUrl(video: String) -> URL {
|
||||
videosFolder.appending(path: video, directoryHint: .notDirectory)
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
func copyVideo(at url: URL, videoId: String) -> Bool {
|
||||
let contentUrl = videoUrl(video: videoId)
|
||||
return copy(file: url, to: contentUrl, type: "video", id: videoId)
|
||||
}
|
||||
|
||||
func loadAllVideos() throws -> [String] {
|
||||
try fileNames(in: videosFolder)
|
||||
func deleteFiles(notIn fileSet: [String]) throws {
|
||||
try deleteFiles(in: filesFolder, notIn: Set(fileSet))
|
||||
}
|
||||
|
||||
// MARK: Website data
|
||||
@ -259,6 +249,16 @@ final class Storage {
|
||||
|
||||
// MARK: Writing files
|
||||
|
||||
private func deleteFiles(in folder: URL, notIn fileSet: Set<String>) throws {
|
||||
let filesToDelete = try files(in: folder)
|
||||
.filter { !fileSet.contains($0.lastPathComponent) }
|
||||
|
||||
for file in filesToDelete {
|
||||
try fm.removeItem(at: file)
|
||||
print("Deleted \(file.path())")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Encode a value and write it to a file, if the content changed
|
||||
*/
|
||||
|
Reference in New Issue
Block a user