From 157dc01673bccb0a5f1780fb9244e65cfcc76dfe Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 27 May 2023 17:20:01 -0500 Subject: [PATCH] Fix:Android close playback session on server when streaming --- .../app/media/MediaProgressSyncer.kt | 4 ++-- .../app/player/PlayerNotificationService.kt | 16 ++++++++++++++++ .../com/audiobookshelf/app/server/ApiHandler.kt | 12 ++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/media/MediaProgressSyncer.kt b/android/app/src/main/java/com/audiobookshelf/app/media/MediaProgressSyncer.kt index 70c65d25..0daa8d63 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/media/MediaProgressSyncer.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/media/MediaProgressSyncer.kt @@ -38,8 +38,8 @@ class MediaProgressSyncer(val playerNotificationService: PlayerNotificationServi var currentLocalMediaProgress: LocalMediaProgress? = null private val currentDisplayTitle get() = currentPlaybackSession?.displayTitle ?: "Unset" - private val currentIsLocal get() = currentPlaybackSession?.isLocal == true - private val currentSessionId get() = currentPlaybackSession?.id ?: "" + val currentIsLocal get() = currentPlaybackSession?.isLocal == true + val currentSessionId get() = currentPlaybackSession?.id ?: "" private val currentPlaybackDuration get() = currentPlaybackSession?.duration ?: 0.0 fun start(playbackSession:PlaybackSession) { diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt index fb90d53d..0e6d8c90 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt @@ -863,10 +863,26 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { fun closePlayback(calledOnError:Boolean? = false) { Log.d(tag, "closePlayback") + val isLocal = mediaProgressSyncer.currentIsLocal + val currentSessionId = mediaProgressSyncer.currentSessionId if (mediaProgressSyncer.listeningTimerRunning) { Log.i(tag, "About to close playback so stopping media progress syncer first") mediaProgressSyncer.stop(calledOnError == false) { // If closing on error then do not sync progress (causes exception) Log.d(tag, "Media Progress syncer stopped") + + // If not local session then close on server + if (!isLocal && currentSessionId != "") { + apiHandler.closePlaybackSession(currentSessionId) { + Log.d(tag, "Closed playback session $currentSessionId") + } + } + } + } else { + // If not local session then close on server + if (!isLocal && currentSessionId != "") { + apiHandler.closePlaybackSession(currentSessionId) { + Log.d(tag, "Closed playback session $currentSessionId") + } } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt index 2b069519..748b693e 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt @@ -17,6 +17,7 @@ import com.getcapacitor.JSObject import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.internal.EMPTY_REQUEST import org.json.JSONArray import org.json.JSONException import org.json.JSONObject @@ -45,11 +46,11 @@ class ApiHandler(var ctx:Context) { makeRequest(request, httpClient, cb) } - private fun postRequest(endpoint:String, payload: JSObject, config:ServerConnectionConfig?, cb: (JSObject) -> Unit) { + private fun postRequest(endpoint:String, payload: JSObject?, config:ServerConnectionConfig?, cb: (JSObject) -> Unit) { val address = config?.address ?: DeviceManager.serverAddress val token = config?.token ?: DeviceManager.token val mediaType = "application/json; charset=utf-8".toMediaType() - val requestBody = payload.toString().toRequestBody(mediaType) + val requestBody = payload?.toString()?.toRequestBody(mediaType) ?: EMPTY_REQUEST val requestUrl = "${address}$endpoint" Log.d(tag, "postRequest to $requestUrl") val request = Request.Builder().post(requestBody) @@ -292,6 +293,13 @@ class ApiHandler(var ctx:Context) { } } + fun closePlaybackSession(playbackSessionId:String, cb: (Boolean) -> Unit) { + Log.d(tag, "closePlaybackSession: playbackSessionId=$playbackSessionId") + postRequest("/api/session/$playbackSessionId/close", null, null) { + cb(true) + } + } + fun authorize(config:ServerConnectionConfig, cb: (MutableList?) -> Unit) { Log.d(tag, "authorize: Authorizing ${config.address}") postRequest("/api/authorize", JSObject(), config) {