mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2026-08-09 05:18:40 +02:00
Start of refactor
This commit is contained in:
@@ -34,6 +34,7 @@ class AudioPlayer: NSObject {
|
|||||||
private var audioPlayer: AVQueuePlayer
|
private var audioPlayer: AVQueuePlayer
|
||||||
private var sessionId: String
|
private var sessionId: String
|
||||||
|
|
||||||
|
private var timeObserverToken: Any?
|
||||||
private var queueObserver:NSKeyValueObservation?
|
private var queueObserver:NSKeyValueObservation?
|
||||||
private var queueItemStatusObserver:NSKeyValueObservation?
|
private var queueItemStatusObserver:NSKeyValueObservation?
|
||||||
|
|
||||||
@@ -77,12 +78,14 @@ class AudioPlayer: NSObject {
|
|||||||
self.audioPlayer.insert(item, after:self.audioPlayer.items().last)
|
self.audioPlayer.insert(item, after:self.audioPlayer.items().last)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setupTimeObserver()
|
||||||
setupQueueObserver()
|
setupQueueObserver()
|
||||||
setupQueueItemStatusObserver()
|
setupQueueItemStatusObserver()
|
||||||
|
|
||||||
NSLog("Audioplayer ready")
|
NSLog("Audioplayer ready")
|
||||||
}
|
}
|
||||||
deinit {
|
deinit {
|
||||||
|
self.removeTimeObserver()
|
||||||
self.queueObserver?.invalidate()
|
self.queueObserver?.invalidate()
|
||||||
self.queueItemStatusObserver?.invalidate()
|
self.queueItemStatusObserver?.invalidate()
|
||||||
destroy()
|
destroy()
|
||||||
@@ -124,6 +127,21 @@ class AudioPlayer: NSObject {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func setupTimeObserver() {
|
||||||
|
let timeScale = CMTimeScale(NSEC_PER_SEC)
|
||||||
|
let time = CMTime(seconds: 1, preferredTimescale: timeScale)
|
||||||
|
self.timeObserverToken = self.audioPlayer.addPeriodicTimeObserver(forInterval: time, queue: .main) { [weak self] currentTime in
|
||||||
|
NSLog("currentTime: \(currentTime)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func removeTimeObserver() {
|
||||||
|
if let timeObserverToken = timeObserverToken {
|
||||||
|
self.audioPlayer.removeTimeObserver(timeObserverToken)
|
||||||
|
self.timeObserverToken = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setupQueueObserver() {
|
func setupQueueObserver() {
|
||||||
self.queueObserver = self.audioPlayer.observe(\.currentItem, options: [.new]) {_,_ in
|
self.queueObserver = self.audioPlayer.observe(\.currentItem, options: [.new]) {_,_ in
|
||||||
let prevTrackIndex = self.currentTrackIndex
|
let prevTrackIndex = self.currentTrackIndex
|
||||||
|
|||||||
@@ -141,23 +141,20 @@ class PlayerHandler {
|
|||||||
|
|
||||||
public static func getPlaybackSession() -> PlaybackSession? {
|
public static func getPlaybackSession() -> PlaybackSession? {
|
||||||
guard let player = player else { return nil }
|
guard let player = player else { return nil }
|
||||||
|
guard player.isInitialized() else { return nil }
|
||||||
guard let session = Database.shared.getPlaybackSession(id: player.getPlaybackSessionId()) else { return nil }
|
guard let session = Database.shared.getPlaybackSession(id: player.getPlaybackSessionId()) else { return nil }
|
||||||
return session
|
return session
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func seekForward(amount: Double) {
|
public static func seekForward(amount: Double) {
|
||||||
guard let player = player else {
|
guard let player = player else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let destinationTime = player.getCurrentTime() + amount
|
let destinationTime = player.getCurrentTime() + amount
|
||||||
player.seek(destinationTime, from: "handler")
|
player.seek(destinationTime, from: "handler")
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func seekBackward(amount: Double) {
|
public static func seekBackward(amount: Double) {
|
||||||
guard let player = player else {
|
guard let player = player else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let destinationTime = player.getCurrentTime() - amount
|
let destinationTime = player.getCurrentTime() - amount
|
||||||
player.seek(destinationTime, from: "handler")
|
player.seek(destinationTime, from: "handler")
|
||||||
@@ -240,7 +237,7 @@ class PlayerHandler {
|
|||||||
listeningTimePassedSinceLastSync = 0
|
listeningTimePassedSinceLastSync = 0
|
||||||
|
|
||||||
// Persist items in the database and sync to the server
|
// Persist items in the database and sync to the server
|
||||||
if session.isLocal { PlayerProgress.shared.syncFromPlayer() }
|
if session.isLocal { Task { await PlayerProgress.shared.syncFromPlayer() } }
|
||||||
Task { await PlayerProgress.shared.syncToServer() }
|
Task { await PlayerProgress.shared.syncToServer() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,10 @@ class PlayerProgress {
|
|||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
|
|
||||||
public func syncFromPlayer() {
|
public func syncFromPlayer() async {
|
||||||
|
let backgroundToken = await UIApplication.shared.beginBackgroundTask(withName: "ABS:syncFromPlayer")
|
||||||
updateLocalMediaProgressFromLocalSession()
|
updateLocalMediaProgressFromLocalSession()
|
||||||
|
await UIApplication.shared.endBackgroundTask(backgroundToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func syncToServer() async {
|
public func syncToServer() async {
|
||||||
@@ -31,6 +33,10 @@ class PlayerProgress {
|
|||||||
await UIApplication.shared.endBackgroundTask(backgroundToken)
|
await UIApplication.shared.endBackgroundTask(backgroundToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func updateLocalSessionFromPlayer() async {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private func updateLocalMediaProgressFromLocalSession() {
|
private func updateLocalMediaProgressFromLocalSession() {
|
||||||
guard let session = PlayerHandler.getPlaybackSession() else { return }
|
guard let session = PlayerHandler.getPlaybackSession() else { return }
|
||||||
guard session.isLocal else { return }
|
guard session.isLocal else { return }
|
||||||
|
|||||||
Reference in New Issue
Block a user