From 20085c5eed8386aac10f12c6ee600ac0f723ce0a Mon Sep 17 00:00:00 2001 From: benonymity Date: Tue, 24 Jan 2023 17:34:53 -0500 Subject: [PATCH 1/2] update: increase update intervals --- ios/App/Podfile | 2 +- ios/App/Shared/player/AudioPlayer.swift | 30 ++++++++++++++++--------- ios/App/Shared/util/ApiClient.swift | 16 +++++++++++++ 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/ios/App/Podfile b/ios/App/Podfile index a38b7824..2e14ec52 100644 --- a/ios/App/Podfile +++ b/ios/App/Podfile @@ -24,7 +24,7 @@ target 'Audiobookshelf' do capacitor_pods # Add your Pods here - pod 'RealmSwift', '~>10' + pod 'RealmSwift', '~> 10' pod 'Alamofire', '~> 5.5' end diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 92e2c4ab..4ac1678b 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -37,6 +37,7 @@ class AudioPlayer: NSObject { private var sessionId: String private var timeObserverToken: Any? + private var sleepTimerObserverToken: Any? private var queueObserver:NSKeyValueObservation? private var queueItemStatusObserver:NSKeyValueObservation? @@ -96,7 +97,7 @@ class AudioPlayer: NSObject { self.audioPlayer.insert(item, after:self.audioPlayer.items().last) } - setupTimeObserver() + setupTimeObservers() setupQueueObserver() setupQueueItemStatusObserver() @@ -130,7 +131,7 @@ class AudioPlayer: NSObject { // Remove observers self.audioPlayer.removeObserver(self, forKeyPath: #keyPath(AVPlayer.rate), context: &playerContext) self.audioPlayer.removeObserver(self, forKeyPath: #keyPath(AVPlayer.currentItem), context: &playerContext) - self.removeTimeObserver() + self.removeTimeObservers() NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.closed.rawValue), object: nil) @@ -170,15 +171,15 @@ class AudioPlayer: NSObject { NotificationCenter.default.removeObserver(self, name: AVAudioSession.routeChangeNotification, object: AVAudioSession.sharedInstance()) } - private func setupTimeObserver() { + private func setupTimeObservers() { // Time observer should be configured on the main queue DispatchQueue.runOnMainQueue { - self.removeTimeObserver() + self.removeTimeObservers() let timeScale = CMTimeScale(NSEC_PER_SEC) - // Rate will be different depending on playback speed, aim for 2 observations/sec - let seconds = 0.5 * (self.rate > 0 ? self.rate : 1.0) - let time = CMTime(seconds: Double(seconds), preferredTimescale: timeScale) + // Save the current time every 15 seconds + var seconds = 15.0 + var time = CMTime(seconds: Double(seconds), preferredTimescale: timeScale) self.timeObserverToken = self.audioPlayer.addPeriodicTimeObserver(forInterval: time, queue: self.queue) { [weak self] time in guard let self = self else { return } guard self.isInitialized() else { return } @@ -190,7 +191,12 @@ class AudioPlayer: NSObject { // Let the player update the current playback positions await PlayerProgress.shared.syncFromPlayer(currentTime: currentTime, includesPlayProgress: isPlaying, isStopping: false) } - + } + // Update the sleep timer every second + seconds = 1.0 + time = CMTime(seconds: Double(seconds), preferredTimescale: timeScale) + self.sleepTimerObserverToken = self.audioPlayer.addPeriodicTimeObserver(forInterval: time, queue: self.queue) { [weak self] time in + guard let self = self else { return } if self.isSleepTimerSet() { // Update the UI NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.sleepSet.rawValue), object: nil) @@ -199,11 +205,15 @@ class AudioPlayer: NSObject { } } - private func removeTimeObserver() { + private func removeTimeObservers() { if let timeObserverToken = timeObserverToken { self.audioPlayer.removeTimeObserver(timeObserverToken) self.timeObserverToken = nil } + if let sleepTimerObserverToken = sleepTimerObserverToken { + self.audioPlayer.removeTimeObserver(sleepTimerObserverToken) + self.sleepTimerObserverToken = nil + } } private func setupQueueObserver() { @@ -426,7 +436,7 @@ class AudioPlayer: NSObject { self.tmpRate = rate // Setup the time observer again at the new rate - self.setupTimeObserver() + self.setupTimeObservers() } } diff --git a/ios/App/Shared/util/ApiClient.swift b/ios/App/Shared/util/ApiClient.swift index b3428a14..c193f913 100644 --- a/ios/App/Shared/util/ApiClient.swift +++ b/ios/App/Shared/util/ApiClient.swift @@ -243,12 +243,28 @@ class ApiClient { callback(obj) } } + public static func pingServer() async -> Bool { + var status = true + AF.request("\(Store.serverConfig!.address)/ping", method: .get).responseDecodable(of: PingResponsePayload.self) { response in + switch response.result { + case .success: + status = true + case .failure: + status = false + } + } + return status + } } struct LocalMediaProgressSyncPayload: Codable { var localMediaProgress: [LocalMediaProgress] } +struct PingResponsePayload: Codable { + var success: Bool +} + struct MediaProgressSyncResponsePayload: Decodable { var numServerProgressUpdates: Int? var localProgressUpdates: [LocalMediaProgress]? From bca5421dbc436b346e77b63a6605c73e3d06f873 Mon Sep 17 00:00:00 2001 From: benonymity Date: Tue, 24 Jan 2023 17:35:12 -0500 Subject: [PATCH 2/2] update: higher sync interval on low power mode --- ios/App/Shared/player/PlayerProgress.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ios/App/Shared/player/PlayerProgress.swift b/ios/App/Shared/player/PlayerProgress.swift index 52c54d74..9aa15739 100644 --- a/ios/App/Shared/player/PlayerProgress.swift +++ b/ios/App/Shared/player/PlayerProgress.swift @@ -12,7 +12,7 @@ import RealmSwift class PlayerProgress { public static let shared = PlayerProgress() - private static let TIME_BETWEEN_SESSION_SYNC_IN_SECONDS = 10.0 + private static var TIME_BETWEEN_SESSION_SYNC_IN_SECONDS = 15.0 private let logger = AppLogger(category: "PlayerProgress") @@ -117,6 +117,11 @@ class PlayerProgress { } private func updateServerSessionFromLocalSession(_ session: PlaybackSession, rateLimitSync: Bool = false) async throws { + if ProcessInfo.processInfo.isLowPowerModeEnabled == true { + PlayerProgress.TIME_BETWEEN_SESSION_SYNC_IN_SECONDS = 60.0 + } else { + PlayerProgress.TIME_BETWEEN_SESSION_SYNC_IN_SECONDS = 15.0 + } var safeToSync = true guard var session = session.thaw() else { return }