mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Add share extension, rework bookmarks model
This commit is contained in:
@@ -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:))
|
||||
}
|
||||
}
|
||||
|
@@ -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 }
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user