diff --git a/Model/Player/PlayerModel.swift b/Model/Player/PlayerModel.swift index 2dd8ab28..527b3118 100644 --- a/Model/Player/PlayerModel.swift +++ b/Model/Player/PlayerModel.swift @@ -50,49 +50,16 @@ final class PlayerModel: ObservableObject { private var statusObservation: NSKeyValueObservation? - var autoPlayItems = false - init(accounts: AccountsModel? = nil, instances: InstancesModel? = nil) { self.accounts = accounts ?? AccountsModel() self.instances = instances ?? InstancesModel() + addItemDidPlayToEndTimeObserver() addFrequentTimeObserver() addInfrequentTimeObserver() addPlayerTimeControlStatusObserver() } - func loadHistoryDetails() { - guard !accounts.current.isNil else { - return - } - - queue = Defaults[.queue] - queue.forEach { item in - accounts.api.loadDetails(item) { newItem in - if let index = self.queue.firstIndex(where: { $0.id == item.id }) { - self.queue[index] = newItem - } - } - } - - history = Defaults[.history] - history.forEach { item in - accounts.api.loadDetails(item) { newItem in - if let index = self.history.firstIndex(where: { $0.id == item.id }) { - self.history[index] = newItem - } - } - } - - if let item = Defaults[.lastPlayed] { - accounts.api.loadDetails(item) { [weak self] newItem in - self?.playNow(newItem.video, at: newItem.playbackTime?.seconds) - } - } else { - autoPlayItems = true - } - } - func presentPlayer() { presentingPlayer = true } @@ -193,15 +160,7 @@ final class PlayerModel: ObservableObject { #endif DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in - guard let self = self else { - return - } - - guard self.autoPlayItems else { - return - } - - self.play() + self?.play() } } diff --git a/Model/Player/PlayerQueue.swift b/Model/Player/PlayerQueue.swift index ccee3424..1dc2c61d 100644 --- a/Model/Player/PlayerQueue.swift +++ b/Model/Player/PlayerQueue.swift @@ -1,4 +1,5 @@ import AVFoundation +import Defaults import Foundation import Siesta @@ -105,16 +106,7 @@ extension PlayerModel { } func isAutoplaying(_ item: AVPlayerItem) -> Bool { - guard player.currentItem == item else { - return false - } - - if !autoPlayItems { - autoPlayItems = true - return false - } - - return true + player.currentItem == item } @discardableResult func enqueueVideo( @@ -141,14 +133,18 @@ extension PlayerModel { func addCurrentItemToHistory() { if let item = currentItem { - if let index = history.firstIndex(where: { $0.video.videoID == item.video?.videoID }) { - history.remove(at: index) - } - - history.insert(currentItem, at: 0) + addItemToHistory(item) } } + func addItemToHistory(_ item: PlayerQueueItem) { + if let index = history.firstIndex(where: { $0.video.videoID == item.video?.videoID }) { + history.remove(at: index) + } + + history.insert(currentItem, at: 0) + } + func playHistory(_ item: PlayerQueueItem) { var time = item.playbackTime @@ -180,4 +176,30 @@ extension PlayerModel { func removeHistoryItems() { history.removeAll() } + + func loadHistoryDetails() { + guard !accounts.current.isNil else { + return + } + + queue = Defaults[.queue] + queue.forEach { item in + accounts.api.loadDetails(item) { newItem in + if let index = self.queue.firstIndex(where: { $0.id == item.id }) { + self.queue[index] = newItem + } + } + } + + history = [Defaults[.lastPlayed]].compactMap { $0 } + Defaults[.history] + history.forEach { item in + accounts.api.loadDetails(item) { newItem in + if let index = self.history.firstIndex(where: { $0.id == item.id }) { + self.history[index] = newItem + } + } + } + + Defaults[.lastPlayed] = nil + } } diff --git a/Pearvidious.xcodeproj/project.pbxproj b/Pearvidious.xcodeproj/project.pbxproj index f8dd8d5f..7bd6fb27 100644 --- a/Pearvidious.xcodeproj/project.pbxproj +++ b/Pearvidious.xcodeproj/project.pbxproj @@ -1078,19 +1078,19 @@ children = ( 3743B86627216A1E00261544 /* Accounts */, 3743B864272169E200261544 /* Applications */, + 3743B86527216A0600261544 /* Player */, + 37FB283F2721B20800A57617 /* Search */, + 374C0539272436DA009BDDBE /* SponsorBlock */, 37AAF28F26740715007FC770 /* Channel.swift */, 37C3A24427235DA70087A57A /* ChannelPlaylist.swift */, 37FB28402721B22200A57617 /* ContentItem.swift */, 37141672267A8E10006CA35D /* Country.swift */, 371F2F19269B43D300E4A7AB /* NavigationModel.swift */, - 3743B86527216A0600261544 /* Player */, 376578882685471400D4EA09 /* Playlist.swift */, 37BA794226DBA973002A0235 /* PlaylistsModel.swift */, 37C194C626F6A9C8005D3B96 /* RecentsModel.swift */, - 37FB283F2721B20800A57617 /* Search */, 37EAD86E267B9ED100D9E01B /* Segment.swift */, 37CEE4BC2677B670005A1EFE /* SingleAssetStream.swift */, - 374C0539272436DA009BDDBE /* SponsorBlock */, 3797758A2689345500DD52A8 /* Store.swift */, 37CEE4C02677B697005A1EFE /* Stream.swift */, 37E64DD026D597EB00C71877 /* SubscriptionsModel.swift */, diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index 4e94d5fc..1d7fd78a 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -144,7 +144,7 @@ struct ContentView: View { accounts.api.video(id).load().onSuccess { response in if let video: Video = response.typedContent() { - self.player.autoPlayItems = true + player.addCurrentItemToHistory() self.player.playNow(video, at: parser.time) self.player.presentPlayer() }