diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt index 1172a2e81..0b0a8dc3c 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + package org.oxycblt.auxio.music import android.content.Context @@ -40,6 +40,7 @@ import org.oxycblt.musikr.Playlist import org.oxycblt.musikr.Song import org.oxycblt.musikr.Storage import org.oxycblt.musikr.cache.StoredCache +import org.oxycblt.musikr.cover.CoverIdentifier import org.oxycblt.musikr.cover.CoverParams import org.oxycblt.musikr.playlist.db.StoredPlaylists import org.oxycblt.musikr.tag.interpret.Naming @@ -244,11 +245,15 @@ constructor( ) : MusicRepository { private val updateListeners = mutableListOf() private val indexingListeners = mutableListOf() - @Volatile private var indexingWorker: MusicRepository.IndexingWorker? = null + @Volatile + private var indexingWorker: MusicRepository.IndexingWorker? = null - @Volatile override var library: MutableLibrary? = null - @Volatile private var previousCompletedState: IndexingState.Completed? = null - @Volatile private var currentIndexingState: IndexingState? = null + @Volatile + override var library: MutableLibrary? = null + @Volatile + private var previousCompletedState: IndexingState.Completed? = null + @Volatile + private var currentIndexingState: IndexingState? = null override val indexingState: IndexingState? get() = currentIndexingState ?: previousCompletedState @@ -388,7 +393,11 @@ constructor( val currentRevision = musicSettings.revision val newRevision = currentRevision?.takeIf { withCache } ?: UUID.randomUUID() val cache = if (withCache) storedCache.visible() else storedCache.invisible() - val covers = SiloedCovers.at(context, CoverSilo(newRevision, CoverParams.of(750, 80))) + val covers = SiloedCovers.from( + context, + CoverSilo(newRevision, CoverParams.of(750, 80)), + CoverIdentifier.md5() + ) val storage = Storage(cache, covers, storedPlaylists) val interpretation = Interpretation(nameFactory, separators) @@ -414,9 +423,9 @@ constructor( // TODO: Remove this once you start work on kindred. deviceLibraryChanged = this.library?.songs != newLibrary.songs || - this.library?.albums != newLibrary.albums || - this.library?.artists != newLibrary.artists || - this.library?.genres != newLibrary.genres + this.library?.albums != newLibrary.albums || + this.library?.artists != newLibrary.artists || + this.library?.genres != newLibrary.genres userLibraryChanged = this.library?.playlists != newLibrary.playlists if (!deviceLibraryChanged && !userLibraryChanged) { L.d("Library has not changed, skipping update") diff --git a/app/src/main/java/org/oxycblt/auxio/music/covers/CoverUtil.kt b/app/src/main/java/org/oxycblt/auxio/music/covers/CoverUtil.kt new file mode 100644 index 000000000..2eaf76942 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/music/covers/CoverUtil.kt @@ -0,0 +1,9 @@ +package org.oxycblt.auxio.music.covers + +import android.content.Context +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +suspend fun Context.coversDir() = withContext(Dispatchers.IO) { + filesDir.resolve("covers").apply { mkdirs() } +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/music/covers/NullCovers.kt b/app/src/main/java/org/oxycblt/auxio/music/covers/NullCovers.kt new file mode 100644 index 000000000..38306694a --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/music/covers/NullCovers.kt @@ -0,0 +1,24 @@ +package org.oxycblt.auxio.music.covers + +import android.content.Context +import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.cover.CoverIdentifier +import org.oxycblt.musikr.cover.Covers +import org.oxycblt.musikr.cover.MutableCovers +import org.oxycblt.musikr.cover.ObtainResult +import java.io.InputStream + +class NullCovers(private val context: Context, private val identifier: CoverIdentifier) : MutableCovers { + override suspend fun obtain(id: String) = ObtainResult.Hit(NullCover(id)) + + override suspend fun write(data: ByteArray): Cover = + NullCover(identifier.identify(data)) + + override suspend fun cleanup(excluding: Collection) { + context.coversDir().listFiles()?.forEach { it.deleteRecursively() } + } +} + +private class NullCover(override val id: String) : Cover { + override suspend fun open() = null +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/music/covers/SiloedCovers.kt b/app/src/main/java/org/oxycblt/auxio/music/covers/SiloedCovers.kt index 9fffb07e3..141638721 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/covers/SiloedCovers.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/covers/SiloedCovers.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.withContext import org.oxycblt.musikr.cover.Cover import org.oxycblt.musikr.cover.CoverFiles import org.oxycblt.musikr.cover.CoverFormat +import org.oxycblt.musikr.cover.CoverIdentifier import org.oxycblt.musikr.cover.Covers import org.oxycblt.musikr.cover.MutableCovers import org.oxycblt.musikr.cover.ObtainResult @@ -56,16 +57,16 @@ class SiloedCovers( } companion object { - suspend fun at(context: Context, silo: CoverSilo): SiloedCovers { + suspend fun from(context: Context, silo: CoverSilo, identifier: CoverIdentifier): SiloedCovers { val rootDir: File val revisionDir: File withContext(Dispatchers.IO) { - rootDir = context.filesDir.resolve("covers").apply { mkdirs() } + rootDir = context.coversDir() revisionDir = rootDir.resolve(silo.toString()).apply { mkdirs() } } val files = CoverFiles.at(revisionDir) val format = CoverFormat.jpeg(silo.params) - return SiloedCovers(rootDir, silo, Covers.from(files, format)) + return SiloedCovers(rootDir, silo, Covers.from(files, format, identifier)) } } }