diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt index 7f4d4780..93fd4c72 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt @@ -74,6 +74,7 @@ open class LibraryItemWrapper(var id:String) { @JsonIgnoreProperties(ignoreUnknown = true) data class DeviceInfo( + var deviceId:String, var manufacturer:String, var model:String, var brand:String, 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 f21b93a2..fb90d53d 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 @@ -1,5 +1,6 @@ package com.audiobookshelf.app.player +import android.annotation.SuppressLint import android.app.* import android.appwidget.AppWidgetManager import android.content.ComponentName @@ -16,6 +17,7 @@ import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.* import android.provider.MediaStore +import android.provider.Settings import android.support.v4.media.MediaBrowserCompat import android.support.v4.media.MediaDescriptionCompat import android.support.v4.media.MediaMetadataCompat @@ -31,7 +33,6 @@ import androidx.core.content.ContextCompat import androidx.media.MediaBrowserServiceCompat import androidx.media.utils.MediaConstants import com.audiobookshelf.app.BuildConfig -import com.audiobookshelf.app.MediaPlayerWidget import com.audiobookshelf.app.R import com.audiobookshelf.app.data.* import com.audiobookshelf.app.data.DeviceInfo @@ -894,6 +895,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { return if(currentPlayer == castPlayer) PLAYER_CAST else PLAYER_EXO } + @SuppressLint("HardwareIds") private fun getDeviceInfo(): DeviceInfo { /* EXAMPLE manufacturer: Google @@ -902,7 +904,8 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { sdkVersion: 32 appVersion: 0.9.46-beta */ - return DeviceInfo(Build.MANUFACTURER, Build.MODEL, Build.BRAND, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME) + val deviceId = Settings.Secure.getString(ctx.contentResolver, Settings.Secure.ANDROID_ID) + return DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.BRAND, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME) } private val deviceSettings get() = DeviceManager.deviceData.deviceSettings ?: DeviceSettings.default() diff --git a/plugins/capacitor/AbsAudioPlayer.js b/plugins/capacitor/AbsAudioPlayer.js index 2b04e005..b1fb6482 100644 --- a/plugins/capacitor/AbsAudioPlayer.js +++ b/plugins/capacitor/AbsAudioPlayer.js @@ -1,4 +1,5 @@ -import { registerPlugin, WebPlugin } from '@capacitor/core'; +import { registerPlugin, WebPlugin } from '@capacitor/core' +import { nanoid } from 'nanoid' const { PlayerState } = require('../constants') var $axios = null @@ -42,6 +43,15 @@ class AbsAudioPlayerWeb extends WebPlugin { return this.player && !this.player.paused } + getDeviceId() { + let deviceId = localStorage.getItem('absDeviceId') + if (!deviceId) { + deviceId = nanoid() + localStorage.setItem('absDeviceId', deviceId) + } + return deviceId + } + // PluginMethod async prepareLibraryItem({ libraryItemId, episodeId, playWhenReady, startTime }) { console.log('[AbsAudioPlayer] Prepare library item', libraryItemId) @@ -49,8 +59,11 @@ class AbsAudioPlayerWeb extends WebPlugin { if (libraryItemId.startsWith('local_')) { // Fetch Local - local not implemented on web } else { - var route = !episodeId ? `/api/items/${libraryItemId}/play` : `/api/items/${libraryItemId}/play/${episodeId}` - var playbackSession = await $axios.$post(route, { mediaPlayer: 'html5-mobile', forceDirectPlay: true }) + const route = !episodeId ? `/api/items/${libraryItemId}/play` : `/api/items/${libraryItemId}/play/${episodeId}` + const deviceInfo = { + deviceId: this.getDeviceId() + } + const playbackSession = await $axios.$post(route, { deviceInfo, mediaPlayer: 'html5-mobile', forceDirectPlay: true }) if (playbackSession) { if (startTime !== undefined && startTime !== null) playbackSession.currentTime = startTime this.setAudioPlayer(playbackSession, playWhenReady)