diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 04c14ee8..252e2c93 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,7 +28,7 @@ android { } debug { matchingFallbacks.add("release") - isDebuggable = true + isDebuggable = false } } diff --git a/app/src/main/java/org/grakovne/lissen/content/LissenMediaProvider.kt b/app/src/main/java/org/grakovne/lissen/content/LissenMediaProvider.kt index f6ee0168..52e66381 100644 --- a/app/src/main/java/org/grakovne/lissen/content/LissenMediaProvider.kt +++ b/app/src/main/java/org/grakovne/lissen/content/LissenMediaProvider.kt @@ -32,9 +32,18 @@ class LissenMediaProvider @Inject constructor( fun provideFileUri( libraryItemId: String, chapterId: String - ): Uri = when (cacheConfiguration.localCacheUsing()) { - true -> localCacheRepository.provideFileUri(libraryItemId, chapterId) - false -> providePreferredChannel().provideFileUri(libraryItemId, chapterId) + ): ApiResult = when (cacheConfiguration.localCacheUsing()) { + true -> localCacheRepository + .provideFileUri(libraryItemId, chapterId) + ?.let { ApiResult.Success(it) } + ?: ApiResult.Error(ApiError.InternalError) + + false -> localCacheRepository + .provideFileUri(libraryItemId, chapterId) + ?.let { ApiResult.Success(it) } + ?: providePreferredChannel() + .provideFileUri(libraryItemId, chapterId) + .let { ApiResult.Success(it) } } fun provideBookCoverUri( diff --git a/app/src/main/java/org/grakovne/lissen/content/cache/LocalCacheRepository.kt b/app/src/main/java/org/grakovne/lissen/content/cache/LocalCacheRepository.kt index c091913b..e9f416f4 100644 --- a/app/src/main/java/org/grakovne/lissen/content/cache/LocalCacheRepository.kt +++ b/app/src/main/java/org/grakovne/lissen/content/cache/LocalCacheRepository.kt @@ -2,6 +2,7 @@ package org.grakovne.lissen.content.cache import android.net.Uri import android.net.Uri.parse +import androidx.core.net.toFile import org.grakovne.lissen.channel.common.ApiError import org.grakovne.lissen.channel.common.ApiResult import org.grakovne.lissen.content.cache.api.CachedBookRepository @@ -12,6 +13,7 @@ import org.grakovne.lissen.domain.PagedItems import org.grakovne.lissen.domain.PlaybackProgress import org.grakovne.lissen.domain.PlaybackSession import org.grakovne.lissen.domain.RecentBook +import java.io.File import java.io.InputStream import javax.inject.Inject import javax.inject.Singleton @@ -23,8 +25,10 @@ class LocalCacheRepository @Inject constructor( private val properties: CacheBookStorageProperties ) { - fun provideFileUri(libraryItemId: String, fileId: String): Uri = - cachedBookRepository.provideFileUri(libraryItemId, fileId) + fun provideFileUri(libraryItemId: String, fileId: String): Uri? = + cachedBookRepository + .provideFileUri(libraryItemId, fileId) + .takeIf { it.toFile().exists() } fun provideBookCover(bookId: String): Uri = cachedBookRepository @@ -32,7 +36,6 @@ class LocalCacheRepository @Inject constructor( .toString() .let { parse(it) } - /** * For the local cache we avoiding to create intermediary entity like Session and using BookId * as a Playback Session Key diff --git a/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackService.kt b/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackService.kt index cc5152d7..558204be 100644 --- a/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackService.kt +++ b/app/src/main/java/org/grakovne/lissen/playback/service/PlaybackService.kt @@ -117,19 +117,27 @@ class AudioPlayerService : MediaSessionService() { val prepareQueue = async { val playingQueue = book .files - .map { file -> - MediaItem.Builder() - .setMediaId(file.id) - .setUri(mediaChannel.provideFileUri(book.id, file.id)) - .setTag(book) - .setMediaMetadata( - MediaMetadata.Builder() - .setTitle(file.name) - .setArtist(book.title) - .setArtworkUri(mediaChannel.provideBookCoverUri(book.id)) - .build() + .mapNotNull { file -> + mediaChannel + .provideFileUri(book.id, file.id) + .fold( + onSuccess = { + MediaItem.Builder() + .setMediaId(file.id) + .setUri(it) + .setTag(book) + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(file.name) + .setArtist(book.title) + .setArtworkUri(mediaChannel.provideBookCoverUri(book.id)) + .build() + ) + .build() + }, + onFailure = { null } ) - .build() + } withContext(Dispatchers.Main) {