From a6ba2db81fbc3987491f2e2d769c13eae7f0ec57 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:24:41 +0200 Subject: [PATCH] ok yes im dumb. Also maybe fixed #153 --- .../CustomPlayer/CustomPlayer.swift | 36 +++++++++++++------ .../SettingsSubViews/SettingsViewData.swift | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift index 52ec730..82cc240 100644 --- a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift +++ b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift @@ -154,6 +154,7 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele private var playerItemKVOContext = 0 private var loadedTimeRangesObservation: NSKeyValueObservation? private var playerTimeControlStatusObserver: NSKeyValueObservation? + private var playerRateObserver: NSKeyValueObservation? private var controlsLocked = false private var lockButtonTimer: Timer? @@ -255,14 +256,6 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele super.viewDidLoad() view.backgroundColor = .black - backgroundToken = NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main ) { [weak self] _ in - self?.handleEnterBackground() - } - - foregroundToken = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main ) { [weak self] _ in - self?.handleBecomeActive() - } - setupHoldGesture() loadSubtitleSettings() setupPlayerViewController() @@ -317,6 +310,17 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele Logger.shared.log("Error activating audio session: \(error)", type: "Debug") } + playerRateObserver = player.observe(\.rate, options: [.new, .old]) { [weak self] player, change in + guard let self = self else { return } + DispatchQueue.main.async { + let isActuallyPlaying = player.rate != 0 + if self.isPlaying != isActuallyPlaying { + self.isPlaying = isActuallyPlaying + self.playPauseButton.image = UIImage(systemName: isActuallyPlaying ? "pause.fill" : "play.fill") + } + } + } + volumeViewModel.value = Double(audioSession.outputVolume) volumeObserver = audioSession.observe(\.outputVolume, options: [.new]) { [weak self] session, change in @@ -418,11 +422,21 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele } deinit { - if let token = timeObserverToken { - player.removeTimeObserver(token) - } + playerRateObserver?.invalidate() + inactivityTimer?.invalidate() + updateTimer?.invalidate() + lockButtonTimer?.invalidate() + dimButtonTimer?.invalidate() + loadedTimeRangesObservation?.invalidate() + playerTimeControlStatusObserver?.invalidate() + volumeObserver?.invalidate() + player.replaceCurrentItem(with: nil) player.pause() + + playerViewController = nil + sliderHostingController = nil + try? AVAudioSession.sharedInstance().setActive(false) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { diff --git a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift index 53b155f..f9eb3e7 100644 --- a/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift +++ b/Sora/Views/SettingsView/SettingsSubViews/SettingsViewData.swift @@ -421,7 +421,7 @@ struct SettingsViewData: View { let formatter = ByteCountFormatter() formatter.allowedUnits = [.useBytes, .useKB, .useMB, .useGB] formatter.countStyle = .file - return formatter.string(fromByteCount: bytes) ?? "\(bytes) bytes" + return formatter.string(fromByteCount: bytes) } func updateSizes() {