mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Replace environment objects with observed objects
This commit is contained in:
@@ -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?
|
||||
|
@@ -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 {
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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 }
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user