mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Fix bookmarks
This commit is contained in:
@@ -49,7 +49,7 @@ final class DocumentsModel: ObservableObject {
|
||||
|
||||
var documentsDirectory: URL? {
|
||||
if let url = try? fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) {
|
||||
return replacePrivateVar(url)
|
||||
return standardizedURL(url)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -69,12 +69,12 @@ final class DocumentsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func isDocument(_ video: Video) -> Bool {
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = replacePrivateVar(url) else { return false }
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = standardizedURL(url) else { return false }
|
||||
return isDocument(url)
|
||||
}
|
||||
|
||||
func isDocument(_ url: URL) -> Bool {
|
||||
guard let url = replacePrivateVar(url), let documentsDirectory else { return false }
|
||||
guard let url = standardizedURL(url), let documentsDirectory else { return false }
|
||||
return url.absoluteString.starts(with: documentsDirectory.absoluteString)
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ final class DocumentsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func creationDate(_ video: Video) -> Date? {
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = replacePrivateVar(url) else { return nil }
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = standardizedURL(url) else { return nil }
|
||||
return creationDate(url)
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ final class DocumentsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func formattedCreationDate(_ video: Video) -> String? {
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = replacePrivateVar(url) else { return nil }
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = standardizedURL(url) else { return nil }
|
||||
return formattedCreationDate(url)
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ final class DocumentsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func size(_ video: Video) -> Int? {
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = replacePrivateVar(url) else { return nil }
|
||||
guard video.isLocal, let url = video.localStream?.localURL, let url = standardizedURL(url) else { return nil }
|
||||
return size(url)
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ final class DocumentsModel: ObservableObject {
|
||||
|
||||
var canGoBack: Bool {
|
||||
guard let directoryURL, let documentsDirectory else { return false }
|
||||
return replacePrivateVar(directoryURL) != documentsDirectory
|
||||
return standardizedURL(directoryURL) != documentsDirectory
|
||||
}
|
||||
|
||||
func goToURL(_ url: URL) {
|
||||
@@ -187,9 +187,9 @@ final class DocumentsModel: ObservableObject {
|
||||
directoryURL?.deletingLastPathComponent()
|
||||
}
|
||||
|
||||
func replacePrivateVar(_ url: URL) -> URL? {
|
||||
let urlStringWithPrivateVarRemoved = url.absoluteString.replacingFirstOccurrence(of: "/private/var/", with: "/var/")
|
||||
return URL(string: urlStringWithPrivateVarRemoved)
|
||||
func standardizedURL(_ url: URL) -> URL? {
|
||||
let standardizedURL = NSString(string: url.absoluteString).standardizingPath
|
||||
return URL(string: standardizedURL)
|
||||
}
|
||||
|
||||
func refresh() {
|
||||
|
@@ -291,7 +291,9 @@ final class MPVBackend: PlayerBackend {
|
||||
}
|
||||
|
||||
if video.isLocal, video.localStreamIsFile {
|
||||
_ = url.startAccessingSecurityScopedResource()
|
||||
if url.startAccessingSecurityScopedResource() {
|
||||
URLBookmarkModel.shared.saveBookmark(url)
|
||||
}
|
||||
}
|
||||
|
||||
self.client.loadFile(url, sub: captions?.url, time: time, forceSeekable: stream.kind == .hls) { [weak self] _ in
|
||||
|
@@ -18,13 +18,39 @@ struct URLBookmarkModel {
|
||||
}
|
||||
|
||||
func saveBookmark(_ url: URL) {
|
||||
var urlForBookmark = url
|
||||
if let yatteeSanitizedUrl = url.byReplacingYatteeProtocol() {
|
||||
urlForBookmark = yatteeSanitizedUrl
|
||||
}
|
||||
|
||||
guard urlForBookmark.isFileURL else {
|
||||
logger.error("trying to save bookmark for something that is not a file")
|
||||
logger.error("not a file: \(urlForBookmark.absoluteString)")
|
||||
return
|
||||
}
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return
|
||||
}
|
||||
|
||||
if let bookmarkData = try? urlForBookmark.bookmarkData(options: bookmarkCreationOptions, includingResourceValuesForKeys: nil, relativeTo: nil) {
|
||||
defaults.set(bookmarkData, forKey: bookmarkKey(urlForBookmark))
|
||||
logger.info("saved bookmark for \(bookmarkKey(urlForBookmark))")
|
||||
} else {
|
||||
logger.error("no bookmark data for \(urlForBookmark)")
|
||||
}
|
||||
}
|
||||
|
||||
func saveBookmark(_ url: NSURL) {
|
||||
guard url.isFileURL else {
|
||||
logger.error("trying to save bookmark for something that is not a file")
|
||||
logger.error("not a file: \(url.absoluteString)")
|
||||
return
|
||||
}
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -37,14 +63,19 @@ struct URLBookmarkModel {
|
||||
}
|
||||
|
||||
func loadBookmark(_ url: URL) -> URL? {
|
||||
logger.info("loading bookmark for \(bookmarkKey(url))")
|
||||
var urlForBookmark = url
|
||||
if let yatteeSanitizedUrl = url.byReplacingYatteeProtocol() {
|
||||
urlForBookmark = yatteeSanitizedUrl
|
||||
}
|
||||
|
||||
logger.info("loading bookmark for \(bookmarkKey(urlForBookmark))")
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return nil
|
||||
}
|
||||
|
||||
if let data = defaults.data(forKey: bookmarkKey(url)) {
|
||||
if let data = defaults.data(forKey: bookmarkKey(urlForBookmark)) {
|
||||
do {
|
||||
var isStale = false
|
||||
let url = try URL(
|
||||
@@ -54,9 +85,9 @@ struct URLBookmarkModel {
|
||||
bookmarkDataIsStale: &isStale
|
||||
)
|
||||
if isStale {
|
||||
saveBookmark(url)
|
||||
saveBookmark(urlForBookmark)
|
||||
}
|
||||
logger.info("loaded bookmark for \(bookmarkKey(url))")
|
||||
logger.info("loaded bookmark for \(bookmarkKey(urlForBookmark))")
|
||||
|
||||
return url
|
||||
} catch {
|
||||
@@ -64,7 +95,7 @@ struct URLBookmarkModel {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
logger.warning("could not find bookmark for \(bookmarkKey(url))")
|
||||
logger.warning("could not find bookmark for \(bookmarkKey(urlForBookmark))")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -93,7 +124,11 @@ struct URLBookmarkModel {
|
||||
}
|
||||
|
||||
private func bookmarkKey(_ url: URL) -> String {
|
||||
"\(Self.bookmarkPrefix)\(url.absoluteString)"
|
||||
"\(Self.bookmarkPrefix)\(NSString(string: url.absoluteString).standardizingPath)"
|
||||
}
|
||||
|
||||
private func bookmarkKey(_ url: NSURL) -> String {
|
||||
"\(Self.bookmarkPrefix)\(url.standardizingPath?.absoluteString ?? "unknown")"
|
||||
}
|
||||
|
||||
private func urlFromBookmark(_ key: String) -> URL? {
|
||||
|
Reference in New Issue
Block a user