image: use asdeferred
Use asDeferred with the ExoPlayer image parser. This is much better compared to using withContext.
This commit is contained in:
parent
eddba44819
commit
abeac90735
2 changed files with 7 additions and 24 deletions
|
@ -75,7 +75,8 @@ dependencies {
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"
|
||||||
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.4"
|
||||||
|
|
||||||
// --- SUPPORT ---
|
// --- SUPPORT ---
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ import java.io.ByteArrayInputStream
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.guava.asDeferred
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.oxycblt.auxio.image.CoverMode
|
import org.oxycblt.auxio.image.CoverMode
|
||||||
import org.oxycblt.auxio.image.ImageSettings
|
import org.oxycblt.auxio.image.ImageSettings
|
||||||
|
@ -75,30 +76,11 @@ constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun extractExoplayerCover(album: Album): InputStream? {
|
private suspend fun extractExoplayerCover(album: Album): InputStream? {
|
||||||
val future =
|
|
||||||
MetadataRetriever.retrieveMetadata(
|
|
||||||
mediaSourceFactory, MediaItem.fromUri(album.songs[0].uri))
|
|
||||||
|
|
||||||
// future.get is a blocking call that makes us spin until the future is done.
|
|
||||||
// This is bad for a co-routine, as it prevents cancellation and by extension
|
|
||||||
// messes with the image loading process and causes annoying bugs.
|
|
||||||
// To fix this we wrap this around in a withContext call to make it suspend and make
|
|
||||||
// sure that the runner can do other coroutines.
|
|
||||||
@Suppress("BlockingMethodInNonBlockingContext")
|
|
||||||
val tracks =
|
val tracks =
|
||||||
withContext(Dispatchers.Default) {
|
MetadataRetriever.retrieveMetadata(
|
||||||
try {
|
mediaSourceFactory, MediaItem.fromUri(album.songs[0].uri))
|
||||||
future.get()
|
.asDeferred()
|
||||||
} catch (e: Exception) {
|
.await()
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tracks == null || tracks.isEmpty) {
|
|
||||||
// Unrecognized format. This is expected, as ExoPlayer only supports a
|
|
||||||
// subset of formats.
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
// The metadata extraction process of ExoPlayer results in a dump of all metadata
|
// The metadata extraction process of ExoPlayer results in a dump of all metadata
|
||||||
// it found, which must be iterated through.
|
// it found, which must be iterated through.
|
||||||
|
|
Loading…
Reference in a new issue