musikr: fix build issues

This commit is contained in:
Alexander Capehart 2025-03-01 21:22:21 -07:00
parent ce5f0fa2c9
commit a78b213537
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
8 changed files with 25 additions and 19 deletions

View file

@ -32,8 +32,7 @@ import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.image.covers.SettingCovers import org.oxycblt.auxio.image.covers.SettingCovers
import org.oxycblt.musikr.cover.CoverResult import org.oxycblt.musikr.cover.CoverResult
@AndroidEntryPoint class CoverProvider() :
class CoverProvider @Inject constructor(private val settingCovers: SettingCovers) :
ContentProvider() { ContentProvider() {
override fun onCreate(): Boolean = true override fun onCreate(): Boolean = true
@ -43,7 +42,7 @@ class CoverProvider @Inject constructor(private val settingCovers: SettingCovers
} }
val id = uri.lastPathSegment ?: return null val id = uri.lastPathSegment ?: return null
return runBlocking { return runBlocking {
when (val result = settingCovers.immutable(requireNotNull(context)).obtain(id)) { when (val result = SettingCovers.immutable(requireNotNull(context)).obtain(id)) {
is CoverResult.Hit -> result.cover.fd() is CoverResult.Hit -> result.cover.fd()
else -> null else -> null
} }

View file

@ -31,18 +31,18 @@ import org.oxycblt.musikr.cover.FileCover
import org.oxycblt.musikr.cover.MutableCovers import org.oxycblt.musikr.cover.MutableCovers
interface SettingCovers { interface SettingCovers {
suspend fun immutable(context: Context): Covers<out FileCover>
suspend fun mutate(context: Context, revision: UUID): MutableCovers<out Cover> suspend fun mutate(context: Context, revision: UUID): MutableCovers<out Cover>
companion object {
fun immutable(context: Context): Covers<out FileCover> =
CompatCovers(context, BaseSiloedCovers(context))
}
} }
class SettingCoversImpl class SettingCoversImpl
@Inject @Inject
constructor(private val imageSettings: ImageSettings, private val identifier: CoverIdentifier) : constructor(private val imageSettings: ImageSettings, private val identifier: CoverIdentifier) :
SettingCovers { SettingCovers {
override suspend fun immutable(context: Context): Covers<out FileCover> =
CompatCovers(context, BaseSiloedCovers(context))
override suspend fun mutate(context: Context, revision: UUID): MutableCovers<out Cover> = override suspend fun mutate(context: Context, revision: UUID): MutableCovers<out Cover> =
when (imageSettings.coverMode) { when (imageSettings.coverMode) {
CoverMode.OFF -> NullCovers(context) CoverMode.OFF -> NullCovers(context)
@ -54,4 +54,5 @@ constructor(private val imageSettings: ImageSettings, private val identifier: Co
private suspend fun siloedCovers(context: Context, revision: UUID, with: CoverParams) = private suspend fun siloedCovers(context: Context, revision: UUID, with: CoverParams) =
MutableCompatCovers( MutableCompatCovers(
context, MutableSiloedCovers.from(context, CoverSilo(revision, with), identifier)) context, MutableSiloedCovers.from(context, CoverSilo(revision, with), identifier))
} }

View file

@ -19,6 +19,7 @@
package org.oxycblt.musikr package org.oxycblt.musikr
import org.oxycblt.musikr.cache.Cache import org.oxycblt.musikr.cache.Cache
import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.cover.MutableCovers import org.oxycblt.musikr.cover.MutableCovers
import org.oxycblt.musikr.playlist.db.StoredPlaylists import org.oxycblt.musikr.playlist.db.StoredPlaylists
import org.oxycblt.musikr.tag.interpret.Naming import org.oxycblt.musikr.tag.interpret.Naming
@ -37,7 +38,7 @@ data class Storage(
* with the cache for best performance. This will be used during music loading and when * with the cache for best performance. This will be used during music loading and when
* retrieving cover information from the library. * retrieving cover information from the library.
*/ */
val storedCovers: MutableCovers, val storedCovers: MutableCovers<out Cover>,
/** /**
* A repository of user-created playlists that should also be loaded into the library. This will * A repository of user-created playlists that should also be loaded into the library. This will

View file

@ -18,12 +18,14 @@
package org.oxycblt.musikr.cache package org.oxycblt.musikr.cache
import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.cover.Covers import org.oxycblt.musikr.cover.Covers
import org.oxycblt.musikr.cover.FileCover
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.DeviceFile
import org.oxycblt.musikr.pipeline.RawSong import org.oxycblt.musikr.pipeline.RawSong
abstract class Cache { abstract class Cache {
internal abstract suspend fun read(file: DeviceFile, covers: Covers): CacheResult internal abstract suspend fun read(file: DeviceFile, covers: Covers<out Cover>): CacheResult
internal abstract suspend fun write(song: RawSong) internal abstract suspend fun write(song: RawSong)

View file

@ -31,6 +31,7 @@ import androidx.room.RoomDatabase
import androidx.room.Transaction import androidx.room.Transaction
import androidx.room.TypeConverter import androidx.room.TypeConverter
import androidx.room.TypeConverters import androidx.room.TypeConverters
import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.cover.CoverResult import org.oxycblt.musikr.cover.CoverResult
import org.oxycblt.musikr.cover.Covers import org.oxycblt.musikr.cover.Covers
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.DeviceFile
@ -118,13 +119,13 @@ internal data class CachedSong(
val replayGainAlbumAdjustment: Float?, val replayGainAlbumAdjustment: Float?,
val coverId: String?, val coverId: String?,
) { ) {
suspend fun intoRawSong(file: DeviceFile, covers: Covers): RawSong? { suspend fun intoRawSong(file: DeviceFile, covers: Covers<out Cover>): RawSong? {
val cover = val cover =
when (val result = coverId?.let { covers.obtain(it) }) { when (val result = coverId?.let { covers.obtain(it) }) {
// We found the cover. // We found the cover.
is CoverResult.Hit -> result.cover is CoverResult.Hit<out Cover> -> result.cover
// We actually didn't find the cover, can't safely convert. // We actually didn't find the cover, can't safely convert.
is CoverResult.Miss -> return null is CoverResult.Miss<out Cover> -> return null
// No cover in the first place, can ignore. // No cover in the first place, can ignore.
null -> null null -> null
} }

View file

@ -19,7 +19,9 @@
package org.oxycblt.musikr.cache package org.oxycblt.musikr.cache
import android.content.Context import android.content.Context
import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.cover.Covers import org.oxycblt.musikr.cover.Covers
import org.oxycblt.musikr.cover.FileCover
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.DeviceFile
import org.oxycblt.musikr.pipeline.RawSong import org.oxycblt.musikr.pipeline.RawSong
@ -53,7 +55,7 @@ private abstract class BaseStoredCache(protected val writeDao: CacheWriteDao) :
private class VisibleStoredCache(private val visibleDao: VisibleCacheDao, writeDao: CacheWriteDao) : private class VisibleStoredCache(private val visibleDao: VisibleCacheDao, writeDao: CacheWriteDao) :
BaseStoredCache(writeDao) { BaseStoredCache(writeDao) {
override suspend fun read(file: DeviceFile, covers: Covers): CacheResult { override suspend fun read(file: DeviceFile, covers: Covers<out Cover>): CacheResult {
val song = visibleDao.selectSong(file.uri.toString()) ?: return CacheResult.Miss(file, null) val song = visibleDao.selectSong(file.uri.toString()) ?: return CacheResult.Miss(file, null)
if (song.modifiedMs != file.modifiedMs) { if (song.modifiedMs != file.modifiedMs) {
// We *found* this file earlier, but it's out of date. // We *found* this file earlier, but it's out of date.
@ -77,7 +79,7 @@ private class InvisibleStoredCache(
private val invisibleCacheDao: InvisibleCacheDao, private val invisibleCacheDao: InvisibleCacheDao,
writeDao: CacheWriteDao writeDao: CacheWriteDao
) : BaseStoredCache(writeDao) { ) : BaseStoredCache(writeDao) {
override suspend fun read(file: DeviceFile, covers: Covers) = override suspend fun read(file: DeviceFile, covers: Covers<out Cover>) =
CacheResult.Miss(file, invisibleCacheDao.selectAddedMs(file.uri.toString())) CacheResult.Miss(file, invisibleCacheDao.selectAddedMs(file.uri.toString()))
class Factory(private val cacheDatabase: CacheDatabase) : Cache.Factory() { class Factory(private val cacheDatabase: CacheDatabase) : Cache.Factory() {

View file

@ -25,7 +25,7 @@ import org.oxycblt.musikr.fs.app.AppFiles
import org.oxycblt.musikr.metadata.Metadata import org.oxycblt.musikr.metadata.Metadata
open class FileCovers(private val appFiles: AppFiles, private val coverFormat: CoverFormat) : open class FileCovers(private val appFiles: AppFiles, private val coverFormat: CoverFormat) :
Covers { Covers<FileCover> {
override suspend fun obtain(id: String): CoverResult<FileCover> { override suspend fun obtain(id: String): CoverResult<FileCover> {
val file = appFiles.find(getFileName(id)) val file = appFiles.find(getFileName(id))
return if (file != null) { return if (file != null) {
@ -42,7 +42,7 @@ class MutableFileCovers(
private val appFiles: AppFiles, private val appFiles: AppFiles,
private val coverFormat: CoverFormat, private val coverFormat: CoverFormat,
private val coverIdentifier: CoverIdentifier private val coverIdentifier: CoverIdentifier
) : FileCovers(appFiles, coverFormat), MutableCovers { ) : FileCovers(appFiles, coverFormat), MutableCovers<FileCover> {
override suspend fun create(file: DeviceFile, metadata: Metadata): CoverResult<FileCover> { override suspend fun create(file: DeviceFile, metadata: Metadata): CoverResult<FileCover> {
val data = metadata.cover ?: return CoverResult.Miss() val data = metadata.cover ?: return CoverResult.Miss()
val id = coverIdentifier.identify(data) val id = coverIdentifier.identify(data)

View file

@ -63,7 +63,7 @@ private class ExtractStepImpl(
private val metadataExtractor: MetadataExtractor, private val metadataExtractor: MetadataExtractor,
private val tagParser: TagParser, private val tagParser: TagParser,
private val cacheFactory: Cache.Factory, private val cacheFactory: Cache.Factory,
private val covers: MutableCovers private val covers: MutableCovers<out Cover>
) : ExtractStep { ) : ExtractStep {
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
override fun extract(nodes: Flow<ExploreNode>): Flow<ExtractedMusic> { override fun extract(nodes: Flow<ExploreNode>): Flow<ExtractedMusic> {
@ -126,7 +126,7 @@ private class ExtractStepImpl(
val cover = val cover =
when (val result = when (val result =
covers.create(f, extractedMetadata)) { covers.create(f, extractedMetadata)) {
is CoverResult.Hit -> result.cover is CoverResult.Hit<Cover> -> result.cover
else -> null else -> null
} }
val rawSong = val rawSong =