feat: add independent CLI launches and preserve shared video bookmarks
This commit is contained in:
@@ -2,28 +2,34 @@ import Foundation
|
||||
|
||||
struct PlaybackProgress {
|
||||
private let defaults: UserDefaults
|
||||
private var positions: [String: Double]
|
||||
|
||||
init(defaults: UserDefaults = .standard) {
|
||||
self.defaults = defaults
|
||||
positions = defaults.dictionary(forKey: "playbackPositions") as? [String: Double] ?? [:]
|
||||
// Migrate the old shared dictionary once; separate keys prevent cross-player lost updates.
|
||||
if let positions = defaults.dictionary(forKey: "playbackPositions") as? [String: Double] {
|
||||
for (identity, position) in positions where position.isFinite && position > 0 {
|
||||
let key = "playbackPosition:" + identity
|
||||
if defaults.object(forKey: key) == nil { defaults.set(position, forKey: key) }
|
||||
}
|
||||
defaults.removeObject(forKey: "playbackPositions")
|
||||
}
|
||||
}
|
||||
|
||||
func position(for url: URL) -> Double? {
|
||||
guard let position = positions[key(for: url)], position.isFinite, position > 0 else { return nil }
|
||||
guard let position = defaults.object(forKey: key(for: url)) as? Double,
|
||||
position.isFinite, position > 0 else { return nil }
|
||||
return position
|
||||
}
|
||||
|
||||
mutating func save(_ position: Double?, for url: URL) {
|
||||
func save(_ position: Double?, for url: URL) {
|
||||
let key = key(for: url)
|
||||
let position = position.flatMap { $0.isFinite && $0 > 0 ? $0 : nil }
|
||||
guard positions[key] != position else { return }
|
||||
positions[key] = position
|
||||
defaults.set(positions, forKey: "playbackPositions")
|
||||
guard (defaults.object(forKey: key) as? Double) != position else { return }
|
||||
defaults.set(position, forKey: key)
|
||||
}
|
||||
|
||||
private func key(for url: URL) -> String {
|
||||
// YouTube callers supply the canonical webpage URL, never an expiring media URL.
|
||||
return url.isFileURL ? url.standardizedFileURL.resolvingSymlinksInPath().absoluteString : url.absoluteString
|
||||
return "playbackPosition:" + (url.isFileURL ? url.standardizedFileURL.resolvingSymlinksInPath().absoluteString : url.absoluteString)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user