diff --git a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift index a22cdb9..7ec423e 100644 --- a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift +++ b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift @@ -190,6 +190,10 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele private var subtitleDelay: Double = 0.0 var currentPlaybackSpeed: Float = 1.0 + private var wasPlayingBeforeBackground = false + private var backgroundToken: Any? + private var foregroundToken: Any? + init(module: ScrapingModule, urlString: String, fullUrl: String, @@ -250,6 +254,14 @@ 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() @@ -404,6 +416,21 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele player.pause() } + deinit { + if let token = timeObserverToken { + player.removeTimeObserver(token) + } + + if let backgroundToken = backgroundToken { + NotificationCenter.default.removeObserver(backgroundToken) + } + if let foregroundToken = foregroundToken { + NotificationCenter.default.removeObserver(foregroundToken) + } + + player.pause() + } + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard context == &playerItemKVOContext else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) @@ -1766,6 +1793,25 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele } } + func handleEnterBackground() { + wasPlayingBeforeBackground = player.rate > 0 + if isPipAutoEnabled && AVPictureInPictureController.isPictureInPictureSupported() { + startPipIfNeeded() + } else { + player.pause() + } + } + + private func handleBecomeActive() { + if wasPlayingBeforeBackground && + !(pipController?.isPictureInPictureActive ?? false) { + player.play() + player.rate = currentPlaybackSpeed + isPlaying = true + playPauseButton.image = UIImage(systemName: "pause.fill") + } + } + @objc private func skipIntro() { if let range = skipIntervals.op { player.seek(to: range.end) @@ -1876,6 +1922,8 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele } }() + + client.updateAnimeProgress( animeId: self.aniListID, episodeNumber: self.episodeNumber, diff --git a/Sora/Utils/MediaPlayer/NormalPlayer.swift b/Sora/Utils/MediaPlayer/NormalPlayer.swift index 28df8a9..da9e9c3 100644 --- a/Sora/Utils/MediaPlayer/NormalPlayer.swift +++ b/Sora/Utils/MediaPlayer/NormalPlayer.swift @@ -14,6 +14,7 @@ class NormalPlayer: AVPlayerViewController { override func viewDidLoad() { super.viewDidLoad() setupHoldGesture() + setupAudioSession() } private func setupHoldGesture() { @@ -45,4 +46,16 @@ class NormalPlayer: AVPlayerViewController { private func endHoldSpeed() { player?.rate = originalRate } + + func setupAudioSession() { + do { + let audioSession = AVAudioSession.sharedInstance() + try audioSession.setCategory(.playback, mode: .moviePlayback, options: .mixWithOthers) + try audioSession.setActive(true) + + try audioSession.overrideOutputAudioPort(.speaker) + } catch { + Logger.shared.log("Didn't set up AVAudioSession: \(error)", type: "Debug") + } + } }