From 8adda19d1a4952743505a2844c0bd224fd9bf51a Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 9 Dec 2024 16:06:25 -0700 Subject: [PATCH] musikr: add new storage config Allowed TagCache to be configured alongside a new StoredCovers (to be implemented later) --- .../oxycblt/auxio/music/MusicRepository.kt | 26 ++++++++++++++++--- .../main/java/org/oxycblt/musikr/Config.kt | 10 +++++++ .../main/java/org/oxycblt/musikr/Musikr.kt | 5 ++-- .../org/oxycblt/musikr/cover/StoredCovers.kt | 13 ++++++++++ .../oxycblt/musikr/pipeline/EvaluateStep.kt | 2 +- .../oxycblt/musikr/pipeline/ExtractStep.kt | 8 +++--- .../org/oxycblt/musikr/tag/Interpretation.kt | 23 ---------------- .../org/oxycblt/musikr/tag/cache/TagCache.kt | 9 ++++++- .../musikr/tag/interpret/TagInterpreter.kt | 2 +- 9 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/musikr/Config.kt create mode 100644 app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt delete mode 100644 app/src/main/java/org/oxycblt/musikr/tag/Interpretation.kt 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 df849322a..42abb56da 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -32,8 +32,13 @@ import org.oxycblt.musikr.Musikr import org.oxycblt.musikr.MutableLibrary import org.oxycblt.musikr.Playlist import org.oxycblt.musikr.Song -import org.oxycblt.musikr.tag.Interpretation +import org.oxycblt.musikr.Interpretation +import org.oxycblt.musikr.Storage +import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.cover.StoredCovers import org.oxycblt.musikr.tag.Name +import org.oxycblt.musikr.tag.cache.FullTagCache +import org.oxycblt.musikr.tag.cache.WriteOnlyTagCache import org.oxycblt.musikr.tag.interpret.Separators import timber.log.Timber as L @@ -203,7 +208,7 @@ interface MusicRepository { class MusicRepositoryImpl @Inject -constructor(private val musikr: Musikr, private val musicSettings: MusicSettings) : +constructor(private val musikr: Musikr, private val fullTagCache: FullTagCache, private val writeOnlyTagCache: WriteOnlyTagCache, private val musicSettings: MusicSettings) : MusicRepository { private val updateListeners = mutableListOf() private val indexingListeners = mutableListOf() @@ -349,8 +354,23 @@ constructor(private val musikr: Musikr, private val musicSettings: MusicSettings } val locations = musicSettings.musicLocations + val fakeCoverEditorTemporary = object : StoredCovers.Editor { + override suspend fun write(data: ByteArray): Cover.Single? { + TODO("Not yet implemented") + } + + override suspend fun apply() { + TODO("Not yet implemented") + } + } + + val storage = if (withCache) { + Storage(fullTagCache, fakeCoverEditorTemporary) + } else { + Storage(writeOnlyTagCache, fakeCoverEditorTemporary) + } val newLibrary = - musikr.run(locations, Interpretation(nameFactory, separators), ::emitIndexingProgress) + musikr.run(locations, storage, Interpretation(nameFactory, separators), ::emitIndexingProgress) emitIndexingCompletion(null) diff --git a/app/src/main/java/org/oxycblt/musikr/Config.kt b/app/src/main/java/org/oxycblt/musikr/Config.kt new file mode 100644 index 000000000..ee86daea6 --- /dev/null +++ b/app/src/main/java/org/oxycblt/musikr/Config.kt @@ -0,0 +1,10 @@ +package org.oxycblt.musikr + +import org.oxycblt.musikr.cover.StoredCovers +import org.oxycblt.musikr.tag.Name +import org.oxycblt.musikr.tag.cache.TagCache +import org.oxycblt.musikr.tag.interpret.Separators + +data class Storage(val tagCache: TagCache, val coverEditor: StoredCovers.Editor) + +data class Interpretation(val nameFactory: Name.Known.Factory, val separators: Separators) diff --git a/app/src/main/java/org/oxycblt/musikr/Musikr.kt b/app/src/main/java/org/oxycblt/musikr/Musikr.kt index 33ab5fd27..13f7c7b85 100644 --- a/app/src/main/java/org/oxycblt/musikr/Musikr.kt +++ b/app/src/main/java/org/oxycblt/musikr/Musikr.kt @@ -29,11 +29,11 @@ import org.oxycblt.musikr.fs.MusicLocation import org.oxycblt.musikr.pipeline.EvaluateStep import org.oxycblt.musikr.pipeline.ExploreStep import org.oxycblt.musikr.pipeline.ExtractStep -import org.oxycblt.musikr.tag.Interpretation interface Musikr { suspend fun run( locations: List, + storage: Storage, interpretation: Interpretation, onProgress: suspend (IndexingProgress) -> Unit = {} ): MutableLibrary @@ -59,6 +59,7 @@ constructor( ) : Musikr { override suspend fun run( locations: List, + storage: Storage, interpretation: Interpretation, onProgress: suspend (IndexingProgress) -> Unit ) = coroutineScope { @@ -72,7 +73,7 @@ constructor( .onEach { onProgress(IndexingProgress.Songs(extractedCount, ++exploredCount)) } val extracted = extractStep - .extract(explored) + .extract(storage, explored) .buffer(Channel.UNLIMITED) .onEach { onProgress(IndexingProgress.Songs(++extractedCount, exploredCount)) } .onCompletion { onProgress(IndexingProgress.Indeterminate) } diff --git a/app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt b/app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt new file mode 100644 index 000000000..773bd751d --- /dev/null +++ b/app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt @@ -0,0 +1,13 @@ +package org.oxycblt.musikr.cover + +import java.io.InputStream + +interface StoredCovers { + suspend fun read(cover: Cover.Single): InputStream? + + interface Editor { + suspend fun write(data: ByteArray): Cover.Single? + + suspend fun apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt b/app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt index 605c40d5a..2a0c26e28 100644 --- a/app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt +++ b/app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt @@ -29,7 +29,7 @@ import kotlinx.coroutines.flow.map import org.oxycblt.musikr.MutableLibrary import org.oxycblt.musikr.graph.MusicGraph import org.oxycblt.musikr.model.LibraryFactory -import org.oxycblt.musikr.tag.Interpretation +import org.oxycblt.musikr.Interpretation import org.oxycblt.musikr.tag.interpret.TagInterpreter interface EvaluateStep { diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt b/app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt index a4d43292f..60f20e1a8 100644 --- a/app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt +++ b/app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge +import org.oxycblt.musikr.Storage import org.oxycblt.musikr.fs.query.DeviceFile import org.oxycblt.musikr.metadata.MetadataExtractor import org.oxycblt.musikr.tag.cache.TagCache @@ -34,22 +35,21 @@ import org.oxycblt.musikr.tag.parse.ParsedTags import org.oxycblt.musikr.tag.parse.TagParser interface ExtractStep { - fun extract(nodes: Flow): Flow + fun extract(storage: Storage, nodes: Flow): Flow } class ExtractStepImpl @Inject constructor( - private val tagCache: TagCache, private val metadataExtractor: MetadataExtractor, private val tagParser: TagParser ) : ExtractStep { - override fun extract(nodes: Flow): Flow { + override fun extract(storage: Storage, nodes: Flow): Flow { val cacheResults = nodes .filterIsInstance() .map { - val tags = tagCache.read(it.file) + val tags = storage.tagCache.read(it.file) MaybeCachedSong(it.file, tags) } .flowOn(Dispatchers.IO) diff --git a/app/src/main/java/org/oxycblt/musikr/tag/Interpretation.kt b/app/src/main/java/org/oxycblt/musikr/tag/Interpretation.kt deleted file mode 100644 index 7387bebd3..000000000 --- a/app/src/main/java/org/oxycblt/musikr/tag/Interpretation.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2024 Auxio Project - * Interpretation.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.musikr.tag - -import org.oxycblt.musikr.tag.interpret.Separators - -data class Interpretation(val nameFactory: Name.Known.Factory, val separators: Separators) diff --git a/app/src/main/java/org/oxycblt/musikr/tag/cache/TagCache.kt b/app/src/main/java/org/oxycblt/musikr/tag/cache/TagCache.kt index fba4b7733..665b75c4f 100644 --- a/app/src/main/java/org/oxycblt/musikr/tag/cache/TagCache.kt +++ b/app/src/main/java/org/oxycblt/musikr/tag/cache/TagCache.kt @@ -28,10 +28,17 @@ interface TagCache { suspend fun write(file: DeviceFile, tags: ParsedTags) } -class TagCacheImpl @Inject constructor(private val tagDao: TagDao) : TagCache { +class FullTagCache @Inject constructor(private val tagDao: TagDao) : TagCache { override suspend fun read(file: DeviceFile) = tagDao.selectTags(file.uri.toString(), file.lastModified)?.intoParsedTags() override suspend fun write(file: DeviceFile, tags: ParsedTags) = tagDao.updateTags(CachedTags.fromParsedTags(file, tags)) } + +class WriteOnlyTagCache @Inject constructor(private val tagDao: TagDao) : TagCache { + override suspend fun read(file: DeviceFile) = null + + override suspend fun write(file: DeviceFile, tags: ParsedTags) = + tagDao.updateTags(CachedTags.fromParsedTags(file, tags)) +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt b/app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt index 834d77d31..12c910f2d 100644 --- a/app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt +++ b/app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt @@ -25,7 +25,7 @@ import org.oxycblt.auxio.util.toUuidOrNull import org.oxycblt.musikr.fs.MimeType import org.oxycblt.musikr.fs.query.DeviceFile import org.oxycblt.musikr.tag.Disc -import org.oxycblt.musikr.tag.Interpretation +import org.oxycblt.musikr.Interpretation import org.oxycblt.musikr.tag.Name import org.oxycblt.musikr.tag.ReleaseType import org.oxycblt.musikr.tag.parse.ParsedTags