image: use cover retriever in app

This commit is contained in:
Alexander Capehart 2024-11-29 09:49:45 -07:00
parent ddfe10b869
commit c3f9f0d80e
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
4 changed files with 20 additions and 11 deletions

View file

@ -43,7 +43,7 @@ import kotlinx.coroutines.withContext
import okio.FileSystem import okio.FileSystem
import okio.buffer import okio.buffer
import okio.source import okio.source
import org.oxycblt.auxio.image.stack.extractor.CoverExtractor import org.oxycblt.auxio.image.stack.CoverRetriever
class CoverKeyer @Inject constructor() : Keyer<Cover> { class CoverKeyer @Inject constructor() : Keyer<Cover> {
override fun key(data: Cover, options: Options) = "${data.key}&${options.size}" override fun key(data: Cover, options: Options) = "${data.key}&${options.size}"
@ -54,16 +54,16 @@ private constructor(
private val context: Context, private val context: Context,
private val cover: Cover, private val cover: Cover,
private val size: Size, private val size: Size,
private val coverExtractor: CoverExtractor, private val coverRetriever: CoverRetriever,
) : Fetcher { ) : Fetcher {
override suspend fun fetch(): FetchResult? { override suspend fun fetch(): FetchResult? {
val streams = val streams =
when (val cover = cover) { when (val cover = cover) {
is Cover.Single -> listOfNotNull(coverExtractor.extract(cover)) is Cover.Single -> listOfNotNull(coverRetriever.retrieve(cover))
is Cover.Multi -> is Cover.Multi ->
buildList { buildList {
for (single in cover.all) { for (single in cover.all) {
coverExtractor.extract(single)?.let { add(it) } coverRetriever.retrieve(single)?.let { add(it) }
if (size == 4) { if (size == 4) {
break break
} }
@ -147,9 +147,9 @@ private constructor(
return if (size.mod(2) > 0) size + 1 else size return if (size.mod(2) > 0) size + 1 else size
} }
class Factory @Inject constructor(private val coverExtractor: CoverExtractor) : class Factory @Inject constructor(private val coverRetriever: CoverRetriever) :
Fetcher.Factory<Cover> { Fetcher.Factory<Cover> {
override fun create(data: Cover, options: Options, imageLoader: ImageLoader) = override fun create(data: Cover, options: Options, imageLoader: ImageLoader) =
CoverFetcher(options.context, data, options.size, coverExtractor) CoverFetcher(options.context, data, options.size, coverRetriever)
} }
} }

View file

@ -26,7 +26,9 @@ sealed interface Cover {
class Single(song: Song) : Cover { class Single(song: Song) : Cover {
override val key = "${song.uid}@${song.lastModified}" override val key = "${song.uid}@${song.lastModified}"
val uid = song.uid
val uri = song.uri val uri = song.uri
val lastModified = song.lastModified
} }
class Multi(val all: List<Single>) : Cover { class Multi(val all: List<Single>) : Cover {

View file

@ -20,17 +20,22 @@ package org.oxycblt.auxio.image.stack
import java.io.InputStream import java.io.InputStream
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.auxio.image.extractor.Cover
import org.oxycblt.auxio.image.stack.cache.CoverCache import org.oxycblt.auxio.image.stack.cache.CoverCache
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.image.stack.extractor.CoverExtractor
interface CoverRetriever { interface CoverRetriever {
suspend fun retrieve(song: Song): InputStream? suspend fun retrieve(cover: Cover.Single): InputStream?
} }
class CoverRetrieverImpl class CoverRetrieverImpl
@Inject @Inject
constructor(private val coverCache: CoverCache, private val coverRetriever: CoverRetriever) : constructor(private val coverCache: CoverCache, private val coverExtractor: CoverExtractor) :
CoverRetriever { CoverRetriever {
override suspend fun retrieve(song: Song) = override suspend fun retrieve(cover: Cover.Single) =
coverCache.read(song) ?: coverRetriever.retrieve(song)?.also { coverCache.write(song, it) } coverCache.read(cover)
?: coverExtractor.extract(cover)?.also {
coverCache.write(cover, it)
it.reset()
}
} }

View file

@ -41,6 +41,8 @@ interface StackModule {
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
class StoredCoversDatabaseModule { class StoredCoversDatabaseModule {
@Provides fun storedCoversDao(database: StoredCoversDatabase) = database.storedCoversDao()
@Singleton @Singleton
@Provides @Provides
fun database(@ApplicationContext context: Context) = fun database(@ApplicationContext context: Context) =