{{ failed ? 'Failed to get local library item ' + localLibraryItemId : 'Loading..' }}
diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DataClasses.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DataClasses.kt index bbddbf77..307ed81d 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DataClasses.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DataClasses.kt @@ -305,9 +305,9 @@ data class PodcastEpisode( .setSubtitle(libraryItemDescription.title) .setExtras(extras) - libraryItemDescription.iconBitmap?.let { - mediaDescriptionBuilder.setIconBitmap(it) - } +// libraryItemDescription.iconBitmap?.let { +// mediaDescriptionBuilder.setIconBitmap(it) +// } return mediaDescriptionBuilder.build() } diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt index f52d45df..f1487c53 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt @@ -110,17 +110,17 @@ class LocalLibraryItem( override fun getMediaDescription(progress:MediaProgressWrapper?, ctx:Context?): MediaDescriptionCompat { val coverUri = getCoverUri() - var bitmap:Bitmap? = null - if (coverContentUrl != null) { - ctx?.let { - bitmap = if (Build.VERSION.SDK_INT < 28) { - MediaStore.Images.Media.getBitmap(it.contentResolver, coverUri) - } else { - val source: ImageDecoder.Source = ImageDecoder.createSource(it.contentResolver, coverUri) - ImageDecoder.decodeBitmap(source) - } - } - } +// var bitmap:Bitmap? = null +// if (coverContentUrl != null) { +// ctx?.let { +// bitmap = if (Build.VERSION.SDK_INT < 28) { +// MediaStore.Images.Media.getBitmap(it.contentResolver, coverUri) +// } else { +// val source: ImageDecoder.Source = ImageDecoder.createSource(it.contentResolver, coverUri) +// ImageDecoder.decodeBitmap(source) +// } +// } +// } val extras = Bundle() extras.putLong( @@ -156,9 +156,9 @@ class LocalLibraryItem( .setSubtitle(authorName) .setExtras(extras) - bitmap?.let { - mediaDescriptionBuilder.setIconBitmap(bitmap) - } +// bitmap?.let { +// mediaDescriptionBuilder.setIconBitmap(bitmap) +// } return mediaDescriptionBuilder.build() } diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/PlaybackSession.kt b/android/app/src/main/java/com/audiobookshelf/app/data/PlaybackSession.kt index 06a1c923..2125c939 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/PlaybackSession.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/PlaybackSession.kt @@ -1,10 +1,7 @@ package com.audiobookshelf.app.data import android.content.Context -import android.graphics.ImageDecoder import android.net.Uri -import android.os.Build -import android.provider.MediaStore import android.support.v4.media.MediaMetadataCompat import com.audiobookshelf.app.BuildConfig import com.audiobookshelf.app.R @@ -168,16 +165,16 @@ class PlaybackSession( .putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, getCoverUri().toString()) // Local covers get bitmap - if (localLibraryItem?.coverContentUrl != null) { - val bitmap = if (Build.VERSION.SDK_INT < 28) { - MediaStore.Images.Media.getBitmap(ctx.contentResolver, getCoverUri()) - } else { - val source: ImageDecoder.Source = ImageDecoder.createSource(ctx.contentResolver, getCoverUri()) - ImageDecoder.decodeBitmap(source) - } - metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap) - metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap) - } +// if (localLibraryItem?.coverContentUrl != null) { +// val bitmap = if (Build.VERSION.SDK_INT < 28) { +// MediaStore.Images.Media.getBitmap(ctx.contentResolver, getCoverUri()) +// } else { +// val source: ImageDecoder.Source = ImageDecoder.createSource(ctx.contentResolver, getCoverUri()) +// ImageDecoder.decodeBitmap(source) +// } +// metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap) +// metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap) +// } return metadataBuilder.build() } 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 0daa8d63..d8b9baad 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 @@ -215,7 +215,6 @@ class MediaProgressSyncer(val playerNotificationService: PlayerNotificationServi val listeningTimeToAdd = diffSinceLastSync / 1000L val syncData = MediaProgressSyncData(listeningTimeToAdd,currentPlaybackDuration,currentTime) - currentPlaybackSession?.syncData(syncData) if (currentPlaybackSession?.progress?.isNaN() == true) { @@ -243,11 +242,6 @@ class MediaProgressSyncer(val playerNotificationService: PlayerNotificationServi // Send sync to server also if connected to this server and local item belongs to this server if (hasNetworkConnection && shouldSyncServer && !it.libraryItemId.isNullOrEmpty() && it.serverConnectionConfigId != null && DeviceManager.serverConnectionConfig?.id == it.serverConnectionConfigId) { apiHandler.sendLocalProgressSync(it) { syncSuccess, errorMsg -> - Log.d( - tag, - "Local progress sync data sent to server $currentDisplayTitle for time $currentTime" - ) - if (syncSuccess) { failedSyncs = 0 playerNotificationService.alertSyncSuccess() 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 65fe343d..524599f3 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 @@ -4,9 +4,7 @@ import android.annotation.SuppressLint import android.app.* import android.content.Context import android.content.Intent -import android.graphics.Bitmap import android.graphics.Color -import android.graphics.ImageDecoder import android.hardware.Sensor import android.hardware.SensorManager import android.net.ConnectivityManager @@ -14,7 +12,6 @@ import android.net.Network 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 @@ -292,18 +289,18 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { return MediaDescriptionCompat.Builder().build() } - val coverUri = currentPlaybackSession!!.getCoverUri() + var coverUri = currentPlaybackSession!!.getCoverUri() - var bitmap:Bitmap? = null +// var bitmap:Bitmap? = null // Local covers get bitmap - if (currentPlaybackSession!!.localLibraryItem?.coverContentUrl != null) { - bitmap = if (Build.VERSION.SDK_INT < 28) { - MediaStore.Images.Media.getBitmap(ctx.contentResolver, coverUri) - } else { - val source: ImageDecoder.Source = ImageDecoder.createSource(ctx.contentResolver, coverUri) - ImageDecoder.decodeBitmap(source) - } - } +// if (currentPlaybackSession!!.localLibraryItem?.coverContentUrl != null) { +// bitmap = if (Build.VERSION.SDK_INT < 28) { +// MediaStore.Images.Media.getBitmap(ctx.contentResolver, coverUri) +// } else { +// val source: ImageDecoder.Source = ImageDecoder.createSource(ctx.contentResolver, coverUri) +// ImageDecoder.decodeBitmap(source) +// } +// } // Fix for local images crashing on Android 11 for specific devices // https://stackoverflow.com/questions/64186578/android-11-mediastyle-notification-crash/64232958#64232958 @@ -325,9 +322,9 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { .setTitle(currentPlaybackSession!!.displayTitle) .setIconUri(coverUri) - bitmap?.let { - mediaDescriptionBuilder.setIconBitmap(it) - } +// bitmap?.let { +// mediaDescriptionBuilder.setIconBitmap(it) +// } return mediaDescriptionBuilder.build() } diff --git a/components/app/Appbar.vue b/components/app/Appbar.vue index c91311c4..c07c000d 100644 --- a/components/app/Appbar.vue +++ b/components/app/Appbar.vue @@ -79,7 +79,7 @@ export default { }, methods: { castClick() { - if (this.$store.state.playerIsLocal) { + if (this.$store.getters['getIsCurrentSessionLocal']) { this.$eventBus.$emit('cast-local-item') return } diff --git a/components/app/AudioPlayer.vue b/components/app/AudioPlayer.vue index 6c21010b..bc70aa16 100644 --- a/components/app/AudioPlayer.vue +++ b/components/app/AudioPlayer.vue @@ -574,8 +574,8 @@ export default { AbsAudioPlayer.seek({ value: Math.floor(time) }) if (this.$refs.playedTrack) { - var perc = time / this.totalDuration - var ptWidth = Math.round(perc * this.trackWidth) + const perc = time / this.totalDuration + const ptWidth = Math.round(perc * this.trackWidth) this.$refs.playedTrack.style.width = ptWidth + 'px' this.$refs.playedTrack.classList.remove('bg-gray-200') @@ -721,7 +721,7 @@ export default { AbsAudioPlayer.closePlayback() }, endPlayback() { - this.$store.commit('setPlayerItem', null) + this.$store.commit('setPlaybackSession', null) this.showFullscreen = false this.isEnded = false this.isLoading = false @@ -767,7 +767,7 @@ export default { this.isEnded = false this.isLoading = true this.syncStatus = 0 - this.$store.commit('setPlayerItem', this.playbackSession) + this.$store.commit('setPlaybackSession', this.playbackSession) // Set track width this.$nextTick(() => { diff --git a/components/app/AudioPlayerContainer.vue b/components/app/AudioPlayerContainer.vue index b1923e2b..94a13b4f 100644 --- a/components/app/AudioPlayerContainer.vue +++ b/components/app/AudioPlayerContainer.vue @@ -110,7 +110,7 @@ export default { }, streamProgress(data) { if (!data.numSegments) return - var chunks = data.chunks + const chunks = data.chunks if (this.$refs.audioPlayer) { this.$refs.audioPlayer.setChunksReady(chunks, data.numSegments) } @@ -265,8 +265,7 @@ export default { this.$store.commit('globals/updateLocalMediaProgress', localMediaProgress) }, onMediaPlayerChanged(data) { - var mediaPlayer = data.value - this.$store.commit('setMediaPlayer', mediaPlayer) + this.$store.commit('setMediaPlayer', data.value) }, onReady() { // The UI is reporting elsewhere we are ready @@ -283,6 +282,9 @@ export default { this.$store.commit('setIsFirstAudioLoad', false) // Only run this once on app launch AbsAudioPlayer.onReady() } + }, + playbackTimeUpdate(currentTime) { + this.$refs.audioPlayer?.seek(currentTime) } }, mounted() { @@ -300,6 +302,7 @@ export default { this.$eventBus.$on('close-stream', this.closeStreamOnly) this.$eventBus.$on('cast-local-item', this.castLocalItem) this.$eventBus.$on('user-settings', this.settingsUpdated) + this.$eventBus.$on('playback-time-update', this.playbackTimeUpdate) }, beforeDestroy() { if (this.onLocalMediaProgressUpdateListener) this.onLocalMediaProgressUpdateListener.remove() @@ -313,6 +316,7 @@ export default { this.$eventBus.$off('close-stream', this.closeStreamOnly) this.$eventBus.$off('cast-local-item', this.castLocalItem) this.$eventBus.$off('user-settings', this.settingsUpdated) + this.$eventBus.$off('playback-time-update', this.playbackTimeUpdate) } } \ No newline at end of file diff --git a/components/cards/LazyBookCard.vue b/components/cards/LazyBookCard.vue index 59d5256b..69a8aed9 100644 --- a/components/cards/LazyBookCard.vue +++ b/components/cards/LazyBookCard.vue @@ -213,7 +213,7 @@ export default { return this.mediaMetadata.series }, seriesSequence() { - return this.series ? this.series.sequence : null + return this.series?.sequence || null }, recentEpisode() { // Only added to item when getting currently listening podcasts @@ -232,14 +232,14 @@ export default { }, booksInSeries() { // Only added to item object when collapseSeries is enabled - return this.collapsedSeries ? this.collapsedSeries.numBooks : 0 + return this.collapsedSeries?.numBooks || 0 }, seriesSequenceList() { - return this.collapsedSeries ? this.collapsedSeries.seriesSequenceList : null + return this.collapsedSeries?.seriesSequenceList || null }, libraryItemIdsInSeries() { // Only added to item object when collapseSeries is enabled - return this.collapsedSeries ? this.collapsedSeries.libraryItemIds || [] : [] + return this.collapsedSeries?.libraryItemIds || [] }, displayTitle() { if (this.recentEpisode) return this.recentEpisode.title @@ -291,20 +291,18 @@ export default { showError() { return this.numMissingParts || this.isMissing || this.isInvalid }, - playerIsLocal() { - return !!this.$store.state.playerIsLocal - }, localLibraryItemId() { if (this.isLocal) return this.libraryItemId - return this.localLibraryItem ? this.localLibraryItem.id : null + return this.localLibraryItem?.id || null + }, + localEpisode() { + if (!this.recentEpisode || !this.localLibraryItem) return null + // Current recentEpisode is only implemented server side so this will always be the serverEpisodeId + return this.localLibraryItem.media.episodes.find((ep) => ep.serverEpisodeId === this.recentEpisode.id) }, isStreaming() { if (this.isPodcast) { - if (this.playerIsLocal) { - // Check is streaming local version of this episode - return false // episode cards not implemented for local yet - } - return this.$store.getters['getIsEpisodeStreaming'](this.libraryItemId, this.recentEpisode.id) + return this.$store.getters['getIsMediaStreaming'](this.libraryItemId, this.recentEpisode.id) } else { return false // not yet necessary for books } @@ -380,8 +378,7 @@ export default { showHasLocalDownload() { if (this.localLibraryItem || this.isLocal) { if (this.recentEpisode && !this.isLocal) { - const localEpisode = this.localLibraryItem.media.episodes.find((ep) => ep.serverEpisodeId === this.recentEpisode.id) - return !!localEpisode + return !!this.localEpisode } else { return true } @@ -436,18 +433,15 @@ export default { return } - if (this.localLibraryItem) { - const localEpisode = this.localLibraryItem.media.episodes.find((ep) => ep.serverEpisodeId === this.recentEpisode.id) - if (localEpisode) { - // Play episode locally - eventBus.$emit('play-item', { - libraryItemId: this.localLibraryItemId, - episodeId: localEpisode.id, - serverLibraryItemId: this.libraryItemId, - serverEpisodeId: this.recentEpisode.id - }) - return - } + if (this.localEpisode) { + // Play episode locally + eventBus.$emit('play-item', { + libraryItemId: this.localLibraryItemId, + episodeId: this.localEpisode.id, + serverLibraryItemId: this.libraryItemId, + serverEpisodeId: this.recentEpisode.id + }) + return } eventBus.$emit('play-item', { libraryItemId: this.libraryItemId, episodeId: this.recentEpisode.id }) diff --git a/components/readers/ComicReader.vue b/components/readers/ComicReader.vue index a5927f80..62167b9f 100644 --- a/components/readers/ComicReader.vue +++ b/components/readers/ComicReader.vue @@ -23,7 +23,7 @@ -
{{ page }} / {{ numPages }}
{{ progress }}%
{{ page }} / {{ numPages }}
{{ failed ? 'Failed to get local library item ' + localLibraryItemId : 'Loading..' }}