yattee/Model/HistoryModel.swift

121 lines
3.6 KiB
Swift
Raw Normal View History

import CoreData
import CoreMedia
import Defaults
import Foundation
2022-12-09 00:15:19 +00:00
import Siesta
2022-11-10 17:11:28 +00:00
import SwiftyJSON
extension PlayerModel {
func historyVideo(_ id: String) -> Video? {
historyVideos.first { $0.videoID == id }
}
2022-12-09 00:15:19 +00:00
func loadHistoryVideoDetails(_ watch: Watch) {
guard historyVideo(watch.videoID).isNil else {
return
}
2022-12-09 00:15:19 +00:00
if !Video.VideoID.isValid(watch.videoID), let url = URL(string: watch.videoID) {
2022-11-10 17:11:28 +00:00
historyVideos.append(.local(url))
return
}
2022-12-10 00:23:13 +00:00
if let video = VideosCacheModel.shared.retrieveVideo(watch.video.cacheKey) {
historyVideos.append(video)
return
}
2022-12-09 19:33:01 +00:00
guard let api = playerAPI(watch.video) else { return }
api.video(watch.videoID)
.load()
2022-11-10 21:51:34 +00:00
.onSuccess { [weak self] response in
guard let self else { return }
2022-11-10 17:11:28 +00:00
2022-11-10 21:51:34 +00:00
if let video: Video = response.typedContent() {
2022-12-10 00:23:13 +00:00
VideosCacheModel.shared.storeVideo(video)
2022-11-10 21:51:34 +00:00
self.historyVideos.append(video)
}
}
2022-11-10 21:51:34 +00:00
.onCompletion { _ in
2022-12-09 00:15:19 +00:00
self.logger.info("LOADED history details: \(watch.videoID)")
2022-12-09 00:15:19 +00:00
if self.historyItemBeingLoaded == watch.videoID {
2022-11-10 21:51:34 +00:00
self.logger.info("setting no history loaded")
self.historyItemBeingLoaded = nil
}
2022-11-10 17:11:28 +00:00
2022-12-09 00:15:19 +00:00
if let watch = self.historyItemsToLoad.popLast() {
self.loadHistoryVideoDetails(watch)
2022-11-10 21:51:34 +00:00
}
2022-11-10 17:11:28 +00:00
}
}
func updateWatch(finished: Bool = false) {
2022-12-09 00:15:19 +00:00
guard let currentVideo, saveHistory else { return }
2022-12-09 00:15:19 +00:00
let id = currentVideo.videoID
2022-02-16 20:23:11 +00:00
let time = backend.currentTime
let seconds = time?.seconds ?? 0
let watchFetchRequest = Watch.fetchRequest()
watchFetchRequest.predicate = NSPredicate(format: "videoID = %@", id as String)
let results = try? backgroundContext.fetch(watchFetchRequest)
backgroundContext.perform { [weak self] in
2022-12-04 11:07:06 +00:00
guard let self, finished || self.backend.isPlaying else {
return
}
let watch: Watch!
if results?.isEmpty ?? true {
if seconds < 1 {
return
}
watch = Watch(context: self.backgroundContext)
watch.videoID = id
2022-12-09 00:15:19 +00:00
watch.appName = currentVideo.app.rawValue
watch.instanceURL = currentVideo.instanceURL
} else {
watch = results?.first
}
2022-12-04 11:07:06 +00:00
let duration = self.playerTime.duration.seconds
if duration.isFinite, duration > 0 {
watch.videoDuration = duration
}
2022-12-04 11:07:06 +00:00
if watch.finished {
if !finished, self.resetWatchedStatusOnPlaying, seconds.isFinite, seconds > 0 {
watch.stoppedAt = seconds
}
} else if seconds.isFinite, seconds > 0 {
watch.stoppedAt = seconds
}
watch.watchedAt = Date()
try? self.backgroundContext.save()
}
}
2022-11-15 11:22:27 +00:00
func removeHistory() {
removeAllWatches()
CacheModel.shared.removeAll()
}
func removeWatch(_ watch: Watch) {
context.delete(watch)
try? context.save()
}
func removeAllWatches() {
let watchesFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Watch")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: watchesFetchRequest)
_ = try? context.execute(deleteRequest)
_ = try? context.save()
}
}