yattee/Model/Player/PlayerQueueItemBridge.swift

97 lines
2.7 KiB
Swift
Raw Permalink Normal View History

import CoreMedia
import Defaults
import Foundation
struct PlayerQueueItemBridge: Defaults.Bridge {
typealias Value = PlayerQueueItem
typealias Serializable = [String: String]
func serialize(_ value: Value?) -> Serializable? {
2022-09-28 14:27:01 +00:00
guard let value else {
return nil
}
var playbackTime = ""
if let time = value.playbackTime {
if time.seconds.isFinite {
playbackTime = String(time.seconds)
}
}
var videoDuration = ""
if let duration = value.videoDuration {
if duration.isFinite {
videoDuration = String(duration)
}
}
2022-11-10 17:11:28 +00:00
var localURL = ""
if let video = value.video, video.isLocal {
localURL = video.localStream?.localURL.absoluteString ?? ""
}
return [
2022-11-10 17:11:28 +00:00
"localURL": localURL,
2021-11-01 21:56:18 +00:00
"videoID": value.videoID,
"app": (value.app ?? value.video.app)?.rawValue ?? "",
"instanceURL": (value.instanceURL ?? value.video.instanceURL)?.absoluteString ?? "",
"playbackTime": playbackTime,
"videoDuration": videoDuration
]
}
func deserialize(_ object: Serializable?) -> Value? {
2022-11-10 17:11:28 +00:00
guard let object else { return nil }
var app: VideosApp?
var instanceURL: URL?
var playbackTime: CMTime?
var videoDuration: TimeInterval?
if let time = object["playbackTime"],
!time.isEmpty,
let seconds = TimeInterval(time)
{
playbackTime = .secondsInDefaultTimescale(seconds)
}
if let duration = object["videoDuration"],
!duration.isEmpty
{
videoDuration = TimeInterval(duration)
}
if let appString = object["app"],
!appString.isEmpty
{
app = VideosApp(rawValue: appString)
}
if let url = object["instanceURL"]?.url {
instanceURL = url
}
2022-11-10 17:11:28 +00:00
if let localUrlString = object["localURL"],
!localUrlString.isEmpty,
let localURL = URL(string: localUrlString)
{
return PlayerQueueItem(
.local(localURL),
playbackTime: playbackTime,
videoDuration: videoDuration
)
}
guard let videoID = object["videoID"] else { return nil }
return PlayerQueueItem(
.init(app: app ?? .local, instanceURL: instanceURL, videoID: videoID),
videoID: videoID,
app: app,
instanceURL: instanceURL,
playbackTime: playbackTime,
videoDuration: videoDuration
)
}
}