Replace environment objects with observed objects

This commit is contained in:
Arkadiusz Fal
2022-11-24 21:36:05 +01:00
parent 23fa0968c6
commit 0d333b5583
102 changed files with 427 additions and 723 deletions

View File

@@ -12,11 +12,11 @@ final class AVPlayerBackend: PlayerBackend {
private var logger = Logger(label: "avplayer-backend")
var model: PlayerModel! { .shared }
var controls: PlayerControlsModel! { .shared }
var playerTime: PlayerTimeModel! { .shared }
var networkState: NetworkStateModel! { .shared }
var seek: SeekModel! { .shared }
var model: PlayerModel { .shared }
var controls: PlayerControlsModel { .shared }
var playerTime: PlayerTimeModel { .shared }
var networkState: NetworkStateModel { .shared }
var seek: SeekModel { .shared }
var stream: Stream?
var video: Video?

View File

@@ -13,11 +13,11 @@ final class MPVBackend: PlayerBackend {
private var logger = Logger(label: "mpv-backend")
var model: PlayerModel! { .shared }
var controls: PlayerControlsModel! { .shared }
var playerTime: PlayerTimeModel! { .shared }
var networkState: NetworkStateModel! { .shared }
var seek: SeekModel! { .shared }
var model: PlayerModel { .shared }
var controls: PlayerControlsModel { .shared }
var playerTime: PlayerTimeModel { .shared }
var networkState: NetworkStateModel { .shared }
var seek: SeekModel { .shared }
var stream: Stream?
var video: Video?
@@ -37,9 +37,9 @@ final class MPVBackend: PlayerBackend {
return
}
self.controls?.isLoadingVideo = self.isLoadingVideo
self.controls.isLoadingVideo = self.isLoadingVideo
self.setNeedsNetworkStateUpdates(true)
self.model?.objectWillChange.send()
self.model.objectWillChange.send()
}
}}
@@ -333,7 +333,7 @@ final class MPVBackend: PlayerBackend {
isPlaying = true
startClientUpdates()
if controls?.presentingControls ?? false {
if controls.presentingControls {
startControlsUpdates()
}
@@ -428,9 +428,9 @@ final class MPVBackend: PlayerBackend {
}
private func updateControlsIsPlaying() {
guard model?.activeBackend == .mpv else { return }
guard model.activeBackend == .mpv else { return }
DispatchQueue.main.async { [weak self] in
self?.controls?.isPlaying = self?.isPlaying ?? false
self?.controls.isPlaying = self?.isPlaying ?? false
}
}
@@ -533,14 +533,11 @@ final class MPVBackend: PlayerBackend {
}
func updateNetworkState() {
guard let client, let networkState else {
return
}
DispatchQueue.main.async {
networkState.pausedForCache = client.pausedForCache
networkState.cacheDuration = client.cacheDuration
networkState.bufferingState = client.bufferingState
DispatchQueue.main.async { [weak self] in
guard let self else { return }
self.networkState.pausedForCache = self.client.pausedForCache
self.networkState.cacheDuration = self.client.cacheDuration
self.networkState.bufferingState = self.client.bufferingState
}
if !networkState.needsUpdates {

View File

@@ -312,7 +312,8 @@ final class MPVClient: ObservableObject {
}
DispatchQueue.main.async { [weak self] in
guard let self, let model = self.backend.model else { return }
guard let self else { return }
let model = self.backend.model
UIView.animate(withDuration: 0.2, animations: {
let aspectRatio = self.aspectRatio > 0 && self.aspectRatio < VideoPlayerView.defaultAspectRatio ? self.aspectRatio : VideoPlayerView.defaultAspectRatio
let height = [model.playerSize.height, model.playerSize.width / aspectRatio].min()!
@@ -329,7 +330,7 @@ final class MPVClient: ObservableObject {
self.glView?.queue.async {
self.glView.display()
}
self.backend?.controls?.objectWillChange.send()
self.backend?.controls.objectWillChange.send()
}
}
}

View File

@@ -7,10 +7,10 @@ import Foundation
protocol PlayerBackend {
var suggestedPlaybackRates: [Double] { get }
var model: PlayerModel! { get }
var controls: PlayerControlsModel! { get }
var playerTime: PlayerTimeModel! { get }
var networkState: NetworkStateModel! { get }
var model: PlayerModel { get }
var controls: PlayerControlsModel { get }
var playerTime: PlayerTimeModel { get }
var networkState: NetworkStateModel { get }
var stream: Stream? { get set }
var video: Video? { get set }

View File

@@ -45,7 +45,7 @@ final class PlayerModel: ObservableObject {
}
}
static var shared: PlayerModel!
static var shared = PlayerModel()
let logger = Logger(label: "stream.yattee.app")
@@ -76,7 +76,7 @@ final class PlayerModel: ObservableObject {
}
}
var playerBackendView = PlayerBackendView()
lazy var playerBackendView = PlayerBackendView()
@Published var playerSize: CGSize = .zero { didSet {
#if !os(tvOS)
@@ -125,13 +125,12 @@ final class PlayerModel: ObservableObject {
@Default(.rotateToPortraitOnExitFullScreen) private var rotateToPortraitOnExitFullScreen
#endif
var accounts: AccountsModel
var comments: CommentsModel
var comments: CommentsModel { .shared }
var controls: PlayerControlsModel { .shared }
var playerTime: PlayerTimeModel { .shared }
var networkState: NetworkStateModel { .shared }
var seek: SeekModel { .shared }
var navigation: NavigationModel
var navigation: NavigationModel { .shared }
var context: NSManagedObjectContext = PersistenceController.shared.container.viewContext
var backgroundContext = PersistenceController.shared.container.newBackgroundContext()
@@ -173,15 +172,7 @@ final class PlayerModel: ObservableObject {
var onPresentPlayer = [() -> Void]()
private var remoteCommandCenterConfigured = false
init(
accounts: AccountsModel = AccountsModel(),
comments: CommentsModel = CommentsModel(),
navigation: NavigationModel = NavigationModel()
) {
self.accounts = accounts
self.comments = comments
self.navigation = navigation
init() {
#if !os(macOS)
mpvBackend.controller = mpvController
mpvBackend.client = mpvController.client

View File

@@ -83,11 +83,11 @@ extension PlayerModel {
}
var playerInstance: Instance? {
InstancesModel.forPlayer ?? accounts.current?.instance ?? InstancesModel.all.first
InstancesModel.shared.forPlayer ?? AccountsModel.shared.current?.instance ?? InstancesModel.shared.all.first
}
var playerAPI: VideosAPI {
playerInstance?.anonymous ?? accounts.api
playerInstance?.anonymous ?? AccountsModel.shared.api
}
var qualityProfile: QualityProfile? {
@@ -269,7 +269,7 @@ extension PlayerModel {
}
func loadQueueVideoDetails(_ item: PlayerQueueItem) {
guard !accounts.current.isNil, !item.hasDetailsLoaded else { return }
guard !AccountsModel.shared.current.isNil, !item.hasDetailsLoaded else { return }
let videoID = item.video?.videoID ?? item.videoID

View File

@@ -9,14 +9,14 @@ final class PlayerTimeModel: ObservableObject {
@Published var currentTime = CMTime.zero
@Published var duration = CMTime.zero
var player: PlayerModel!
var player: PlayerModel { .shared }
var forceHours: Bool {
duration.seconds >= 60 * 60
}
var currentPlaybackTime: String {
if player?.currentItem.isNil ?? true || duration.seconds.isZero {
if player.currentItem.isNil || duration.seconds.isZero {
return Self.timePlaceholder
}
@@ -24,7 +24,7 @@ final class PlayerTimeModel: ObservableObject {
}
var durationPlaybackTime: String {
if player?.currentItem.isNil ?? true {
if player.currentItem.isNil {
return Self.timePlaceholder
}
@@ -32,7 +32,7 @@ final class PlayerTimeModel: ObservableObject {
}
var withoutSegmentsPlaybackTime: String {
guard let withoutSegmentsDuration = player?.playerItemDurationWithoutSponsorSegments?.seconds else { return Self.timePlaceholder }
guard let withoutSegmentsDuration = player.playerItemDurationWithoutSponsorSegments?.seconds else { return Self.timePlaceholder }
return withoutSegmentsDuration.formattedAsPlaybackTime(forceHours: forceHours) ?? Self.timePlaceholder
}
}