Add share extension, rework bookmarks model

This commit is contained in:
Arkadiusz Fal
2022-11-11 12:27:37 +01:00
parent 973596f56c
commit 38454720de
13 changed files with 339 additions and 121 deletions

View File

@@ -1,30 +1,14 @@
import Cache
import Foundation
import SwiftyJSON
struct CacheModel {
static var shared = CacheModel()
static let bookmarksGroup = "group.stream.yattee.app.bookmarks"
var urlBookmarksStorage: Storage<String, Data>?
var videoStorage: Storage<Video.ID, JSON>?
init() {
let urlBookmarksStorageConfig = DiskConfig(name: "URLBookmarks", expiry: .never)
let urlBookmarksMemoryConfig = MemoryConfig(expiry: .never, countLimit: 100, totalCostLimit: 100)
urlBookmarksStorage = try? Storage(diskConfig: urlBookmarksStorageConfig, memoryConfig: urlBookmarksMemoryConfig, transformer: TransformerFactory.forData())
let videoStorageConfig = DiskConfig(name: "VideoStorage", expiry: .never)
let videoStorageMemoryConfig = MemoryConfig(expiry: .never, countLimit: 100, totalCostLimit: 100)
let toData: (JSON) throws -> Data = { try $0.rawData() }
let fromData: (Data) throws -> JSON = { try JSON(data: $0) }
let jsonTransformer = Transformer<JSON>(toData: toData, fromData: fromData)
videoStorage = try? Storage<Video.ID, JSON>(diskConfig: videoStorageConfig, memoryConfig: videoStorageMemoryConfig, transformer: jsonTransformer)
}
let bookmarksDefaults = UserDefaults(suiteName: Self.bookmarksGroup)
func removeAll() {
try? videoStorage?.removeAll()
try? urlBookmarksStorage?.removeAll()
guard let bookmarksDefaults else { return }
bookmarksDefaults.dictionaryRepresentation().keys.forEach(bookmarksDefaults.removeObject(forKey:))
}
}

View File

@@ -28,7 +28,8 @@ extension PlayerModel {
return
}
playerAPI.video(id).load()
playerAPI.video(id)
.load()
.onSuccess { [weak self] response in
guard let self else { return }

View File

@@ -1,4 +1,3 @@
import Cache
import Foundation
import Logging
@@ -7,36 +6,48 @@ struct URLBookmarkModel {
var logger = Logger(label: "stream.yattee.url-bookmark")
func saveBookmark(_ url: URL) {
guard let defaults = CacheModel.shared.bookmarksDefaults else {
logger.error("could not open bookmarks defaults")
return
}
if let bookmarkData = try? url.bookmarkData(options: bookmarkCreationOptions, includingResourceValuesForKeys: nil, relativeTo: nil) {
try? CacheModel.shared.urlBookmarksStorage?.setObject(bookmarkData, forKey: url.absoluteString)
defaults.set(bookmarkData, forKey: url.absoluteString)
logger.info("saved bookmark for \(url.absoluteString)")
} else {
logger.error("no bookmark data for \(url.absoluteString)")
}
}
func loadBookmark(_ url: URL) -> URL? {
logger.info("loading bookmark for \(url.absoluteString)")
guard let data = try? CacheModel.shared.urlBookmarksStorage?.object(forKey: url.absoluteString) else {
logger.info("bookmark for \(url.absoluteString) not found")
guard let defaults = CacheModel.shared.bookmarksDefaults else {
logger.error("could not open bookmarks defaults")
return nil
}
do {
var isStale = false
let url = try URL(
resolvingBookmarkData: data,
options: bookmarkResolutionOptions,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
saveBookmark(url)
}
logger.info("loaded bookmark for \(url.absoluteString)")
return url
} catch {
print("Error resolving bookmark:", error)
if let data = defaults.data(forKey: url.absoluteString) {
do {
var isStale = false
let url = try URL(
resolvingBookmarkData: data,
options: bookmarkResolutionOptions,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
saveBookmark(url)
}
logger.info("loaded bookmark for \(url.absoluteString)")
return url
} catch {
print("Error resolving bookmark:", error)
return nil
}
} else {
logger.warning("could not find bookmark for \(url.absoluteString)")
return nil
}
}

View File

@@ -1,23 +0,0 @@
import Foundation
import Logging
import SwiftyJSON
struct VideoCacheModel {
static let shared = VideoCacheModel()
var logger = Logger(label: "stream.yattee.video-cache")
func saveVideo(id: Video.ID, app: VideosApp, json: JSON) {
guard !json.isEmpty else { return }
var jsonWithApp = json
jsonWithApp["app"].string = app.rawValue
try! CacheModel.shared.videoStorage!.setObject(jsonWithApp, forKey: id)
logger.info("saving video \(id)")
}
func loadVideo(id: Video.ID) -> JSON? {
logger.info("loading video \(id)")
let json = try? CacheModel.shared.videoStorage?.object(forKey: id)
return json
}
}