mirror of
				https://github.com/yattee/yattee.git
				synced 2025-10-31 12:41:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
| import CoreData
 | |
| import CoreMedia
 | |
| import Defaults
 | |
| import Foundation
 | |
| import Siesta
 | |
| import SwiftyJSON
 | |
| 
 | |
| extension PlayerModel {
 | |
|     func historyVideo(_ id: String) -> Video? {
 | |
|         historyVideos.first { $0.videoID == id }
 | |
|     }
 | |
| 
 | |
|     func loadHistoryVideoDetails(_ watch: Watch) {
 | |
|         guard historyVideo(watch.videoID).isNil else {
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         if !Video.VideoID.isValid(watch.videoID), let url = URL(string: watch.videoID) {
 | |
|             historyVideos.append(.local(url))
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         if let video = VideosCacheModel.shared.retrieveVideo(watch.video.cacheKey) {
 | |
|             historyVideos.append(video)
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         guard let api = playerAPI(watch.video) else { return }
 | |
| 
 | |
|         api.video(watch.videoID)
 | |
|             .load()
 | |
|             .onSuccess { [weak self] response in
 | |
|                 guard let self else { return }
 | |
| 
 | |
|                 if let video: Video = response.typedContent() {
 | |
|                     VideosCacheModel.shared.storeVideo(video)
 | |
|                     self.historyVideos.append(video)
 | |
|                 }
 | |
|             }
 | |
|             .onCompletion { _ in
 | |
|                 self.logger.info("LOADED history details: \(watch.videoID)")
 | |
|             }
 | |
|     }
 | |
| 
 | |
|     func updateWatch(finished: Bool = false) {
 | |
|         guard let currentVideo, saveHistory else { return }
 | |
| 
 | |
|         let id = currentVideo.videoID
 | |
|         let time = backend.currentTime
 | |
|         let seconds = time?.seconds ?? 0
 | |
|         let duration = playerTime.duration.seconds
 | |
|         if seconds < 3 {
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         let watchFetchRequest = Watch.fetchRequest()
 | |
|         watchFetchRequest.predicate = NSPredicate(format: "videoID = %@", id as String)
 | |
| 
 | |
|         let results = try? backgroundContext.fetch(watchFetchRequest)
 | |
| 
 | |
|         backgroundContext.perform { [weak self] in
 | |
|             guard let self, finished || self.backend.isPlaying else {
 | |
|                 return
 | |
|             }
 | |
| 
 | |
|             let watch: Watch!
 | |
| 
 | |
|             let duration = self.playerTime.duration.seconds
 | |
| 
 | |
|             if results?.isEmpty ?? true {
 | |
|                 watch = Watch(context: self.backgroundContext)
 | |
|                 watch.videoID = id
 | |
|                 watch.appName = currentVideo.app.rawValue
 | |
|                 watch.instanceURL = currentVideo.instanceURL
 | |
|             } else {
 | |
|                 watch = results?.first
 | |
|             }
 | |
| 
 | |
|             if duration.isFinite, duration > 0 {
 | |
|                 watch.videoDuration = duration
 | |
|             }
 | |
| 
 | |
|             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()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     func removeHistory() {
 | |
|         removeAllWatches()
 | |
|         BookmarksCacheModel.shared.clear()
 | |
|     }
 | |
| 
 | |
|     func removeWatch(_ watch: Watch) {
 | |
|         context.perform { [weak self] in
 | |
|             guard let self else { return }
 | |
|             self.context.delete(watch)
 | |
| 
 | |
|             try? self.context.save()
 | |
| 
 | |
|             FeedModel.shared.calculateUnwatchedFeed()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     func removeAllWatches() {
 | |
|         let watchesFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Watch")
 | |
|         let deleteRequest = NSBatchDeleteRequest(fetchRequest: watchesFetchRequest)
 | |
|         _ = try? context.execute(deleteRequest)
 | |
|         _ = try? context.save()
 | |
|     }
 | |
| }
 | 
