diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt index 604f9f0e8..307341268 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailGenerator.kt @@ -32,8 +32,8 @@ import org.oxycblt.auxio.music.MusicRepository import org.oxycblt.auxio.music.MusicType import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.Disc -import org.oxycblt.auxio.musikr.model.ReleaseType +import org.oxycblt.auxio.musikr.tag.Disc +import org.oxycblt.auxio.musikr.tag.ReleaseType import timber.log.Timber as L interface DetailGenerator { diff --git a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt index 4b1b2e52a..6d0eee90e 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt @@ -34,7 +34,7 @@ import org.oxycblt.auxio.detail.list.SongPropertyAdapter import org.oxycblt.auxio.list.adapter.UpdateInstructions import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.Name +import org.oxycblt.auxio.musikr.tag.Name import org.oxycblt.auxio.musikr.metadata.AudioProperties import org.oxycblt.auxio.music.resolveNames import org.oxycblt.auxio.playback.formatDurationMs diff --git a/app/src/main/java/org/oxycblt/auxio/detail/list/AlbumDetailListAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/list/AlbumDetailListAdapter.kt index 15fe99c4a..15588707c 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/list/AlbumDetailListAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/list/AlbumDetailListAdapter.kt @@ -37,8 +37,8 @@ import org.oxycblt.auxio.list.adapter.SelectionIndicatorAdapter import org.oxycblt.auxio.list.adapter.SimpleDiffCallback import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.Disc -import org.oxycblt.auxio.musikr.model.resolveNumber +import org.oxycblt.auxio.musikr.tag.Disc +import org.oxycblt.auxio.musikr.tag.resolveNumber import org.oxycblt.auxio.playback.formatDurationMs import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.getAttrColorCompat diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index d30de6dc6..80cf5a223 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -29,10 +29,10 @@ import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import org.oxycblt.auxio.musikr.cover.Cover import org.oxycblt.auxio.list.Item -import org.oxycblt.auxio.musikr.model.Date -import org.oxycblt.auxio.musikr.model.Disc -import org.oxycblt.auxio.musikr.model.Name -import org.oxycblt.auxio.musikr.model.ReleaseType +import org.oxycblt.auxio.musikr.tag.Date +import org.oxycblt.auxio.musikr.tag.Disc +import org.oxycblt.auxio.musikr.tag.Name +import org.oxycblt.auxio.musikr.tag.ReleaseType import org.oxycblt.auxio.musikr.fs.MimeType import org.oxycblt.auxio.musikr.fs.Path import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment 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 c2eda40d2..86de79bdf 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -25,12 +25,12 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.withContext import kotlinx.coroutines.yield import org.oxycblt.auxio.music.MusicRepository.IndexingWorker -import org.oxycblt.auxio.musikr.model.Name -import org.oxycblt.auxio.musikr.interpret.Separators +import org.oxycblt.auxio.musikr.tag.Name +import org.oxycblt.auxio.musikr.tag.interpret.Separators import org.oxycblt.auxio.musikr.Indexer import org.oxycblt.auxio.musikr.IndexingProgress -import org.oxycblt.auxio.musikr.interpret.Interpretation -import org.oxycblt.auxio.musikr.model.MutableLibrary +import org.oxycblt.auxio.musikr.tag.Interpretation +import org.oxycblt.auxio.musikr.model.impl.MutableLibrary import timber.log.Timber as L /** diff --git a/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt b/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt index 1ac566a68..2bf58ca53 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt @@ -29,7 +29,7 @@ import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.DialogSeparatorsBinding import org.oxycblt.auxio.music.MusicSettings -import org.oxycblt.auxio.musikr.interpret.Separators +import org.oxycblt.auxio.musikr.tag.interpret.Separators import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment import timber.log.Timber as L diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt b/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt index d5eb9ff43..8989af40e 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/MusicBrowser.kt @@ -35,7 +35,7 @@ import org.oxycblt.auxio.music.MusicRepository import org.oxycblt.auxio.music.MusicType import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.resolveNumber +import org.oxycblt.auxio.musikr.tag.resolveNumber import org.oxycblt.auxio.search.SearchEngine class MusicBrowser diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/Indexer.kt b/app/src/main/java/org/oxycblt/auxio/musikr/Indexer.kt index edd4884b4..67b3ec0d9 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/Indexer.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/Indexer.kt @@ -28,9 +28,9 @@ import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import org.oxycblt.auxio.musikr.explore.Explorer -import org.oxycblt.auxio.musikr.interpret.Interpretation -import org.oxycblt.auxio.musikr.interpret.Modeler -import org.oxycblt.auxio.musikr.model.MutableLibrary +import org.oxycblt.auxio.musikr.tag.Interpretation +import org.oxycblt.auxio.musikr.model.Modeler +import org.oxycblt.auxio.musikr.model.impl.MutableLibrary interface Indexer { suspend fun run( diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/cover/Cover.kt b/app/src/main/java/org/oxycblt/auxio/musikr/cover/Cover.kt index 706bd5c67..0cb6bdb19 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/cover/Cover.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/cover/Cover.kt @@ -24,15 +24,10 @@ import org.oxycblt.auxio.music.Song sealed interface Cover { val key: String - class Single(song: Song) : Cover { - override val key = "${song.uid}@${song.lastModified}" - val uid = song.uid - val uri = song.uri - val lastModified = song.lastModified - } + data class Single(override val key: String) : Cover class Multi(val all: List) : Cover { - override val key = "multi@${all.map { it.key }.hashCode()}" + override val key = "multi@${all.hashCode()}" } companion object { @@ -40,15 +35,16 @@ sealed interface Cover { fun nil() = Multi(listOf()) - fun single(song: Song) = Single(song) + fun single(key: String) = Single(key) fun multi(songs: Collection) = order(songs).run { Multi(this) } private fun order(songs: Collection) = FALLBACK_SORT.songs(songs) - .groupBy { it.album } + .map { it.cover } + .groupBy { it.key } .entries .sortedByDescending { it.value.size } - .map { it.value.first().cover } + .map { it.value.first() } } } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Interpretation.kt b/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Interpretation.kt deleted file mode 100644 index 2ac0d487e..000000000 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/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.auxio.musikr.interpret - -import org.oxycblt.auxio.musikr.model.Name - -data class Interpretation(val nameFactory: Name.Known.Factory, val separators: Separators) diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/AudioMetadata.kt b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/AudioMetadata.kt index 6ebb0af57..86a7b041f 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/AudioMetadata.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/AudioMetadata.kt @@ -1,11 +1,12 @@ package org.oxycblt.auxio.musikr.metadata import android.media.MediaMetadataRetriever +import androidx.media3.common.Format import androidx.media3.common.Metadata import org.oxycblt.auxio.musikr.fs.DeviceFile data class AudioMetadata( val file: DeviceFile, - val exoPlayerMetadata: Metadata, + val exoPlayerFormat: Format, val mediaMetadataRetriever: MediaMetadataRetriever ) diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataExtractor.kt b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataExtractor.kt index 994e42421..12b9fc34f 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataExtractor.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataExtractor.kt @@ -1,8 +1,53 @@ package org.oxycblt.auxio.musikr.metadata +import android.content.Context +import android.media.MediaMetadataRetriever +import androidx.media3.common.MediaItem +import androidx.media3.exoplayer.MetadataRetriever +import androidx.media3.exoplayer.source.MediaSource +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.guava.await +import kotlinx.coroutines.withContext import org.oxycblt.auxio.musikr.fs.DeviceFile +import javax.inject.Inject interface MetadataExtractor { fun extract(files: Flow): Flow +} + +class MetadataExtractorImpl @Inject constructor( + @ApplicationContext private val context: Context, + private val mediaSourceFactory: MediaSource.Factory +) : MetadataExtractor { + override fun extract(files: Flow) = files.mapNotNull { + val exoPlayerMetadataFuture = MetadataRetriever.retrieveMetadata( + mediaSourceFactory, + MediaItem.fromUri(it.uri) + ) + val mediaMetadataRetriever = MediaMetadataRetriever().apply { + withContext(Dispatchers.IO) { + setDataSource(context, it.uri) + } + } + val trackGroupArray = exoPlayerMetadataFuture.await() + if (trackGroupArray.isEmpty) { + return@mapNotNull null + } + val trackGroup = trackGroupArray.get(0) + if (trackGroup.length == 0) { + return@mapNotNull null + } + val format = trackGroup.getFormat(0) + AudioMetadata( + it, + format, + mediaMetadataRetriever + ) + } } \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataModule.kt b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataModule.kt index 19d4b2007..6f2da9433 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataModule.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/MetadataModule.kt @@ -28,4 +28,7 @@ import dagger.hilt.components.SingletonComponent interface MetadataModule { @Binds fun audioPropertiesFactory(interpreter: AudioPropertiesFactoryImpl): AudioProperties.Factory + + @Binds + fun metadataExtractor(extractor: MetadataExtractorImpl): MetadataExtractor } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagExtractor.kt b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/ReusableMetadataRetriever.kt similarity index 51% rename from app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagExtractor.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/metadata/ReusableMetadataRetriever.kt index 60823034b..3c5891ab1 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagExtractor.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/metadata/ReusableMetadataRetriever.kt @@ -1,25 +1,5 @@ -/* - * Copyright (c) 2023 Auxio Project - * TagExtractor.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.auxio.musikr.tag.extractor +package org.oxycblt.auxio.musikr.metadata -import android.content.Context -import android.media.MediaMetadataRetriever import android.net.Uri import android.os.Handler import android.os.HandlerThread @@ -38,101 +18,9 @@ import androidx.media3.exoplayer.upstream.Allocator import androidx.media3.exoplayer.upstream.DefaultAllocator import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.SettableFuture -import dagger.hilt.android.qualifiers.ApplicationContext +import timber.log.Timber +import java.util.concurrent.Future import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.guava.asDeferred -import org.oxycblt.auxio.musikr.tag.AudioFile -import org.oxycblt.auxio.musikr.fs.DeviceFile -import timber.log.Timber as L - -interface TagExtractor { - fun extract(deviceFiles: Flow): Flow -} - -class TagExtractorImpl -@Inject -constructor( - @ApplicationContext private val context: Context, - private val mediaSourceFactory: MediaSource.Factory, -) : TagExtractor { - override fun extract(deviceFiles: Flow) = flow { - val retriever = ChunkedMetadataRetriever(mediaSourceFactory) - deviceFiles.collect { deviceFile -> - // val exoPlayerMetadataFuture = - // MetadataRetriever.retrieveMetadata( - // mediaSourceFactory, MediaItem.fromUri(deviceFile.uri)) - val exoPlayerMetadataFuture = retriever.retrieve(deviceFile.uri) - val mediaMetadataRetriever = MediaMetadataRetriever() - mediaMetadataRetriever.setDataSource(context, deviceFile.uri) - val exoPlayerMetadata = exoPlayerMetadataFuture.asDeferred().await() - val result = extractTags(deviceFile, exoPlayerMetadata, mediaMetadataRetriever) - mediaMetadataRetriever.close() - emit(result) - } - retriever.release() - } - - private fun extractTags( - input: DeviceFile, - output: TrackGroupArray, - retriever: MediaMetadataRetriever - ): AudioFile { - if (output.isEmpty) return defaultAudioFile(input, retriever) - val track = output.get(0) - if (track.length == 0) return defaultAudioFile(input, retriever) - val format = track.getFormat(0) - val metadata = format.metadata ?: return defaultAudioFile(input, retriever) - val textTags = TextTags(metadata) - return AudioFile( - deviceFile = input, - durationMs = - need( - retriever - .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) - ?.toLong(), - "duration"), - replayGainTrackAdjustment = textTags.replayGainTrackAdjustment(), - replayGainAlbumAdjustment = textTags.replayGainAlbumAdjustment(), - musicBrainzId = textTags.musicBrainzId(), - name = need(textTags.name() ?: input.path.name, "name"), - sortName = textTags.sortName(), - track = textTags.track(), - disc = textTags.disc(), - subtitle = textTags.subtitle(), - date = textTags.date(), - albumMusicBrainzId = textTags.albumMusicBrainzId(), - albumName = textTags.albumName(), - albumSortName = textTags.albumSortName(), - releaseTypes = textTags.releaseTypes() ?: listOf(), - artistMusicBrainzIds = textTags.artistMusicBrainzIds() ?: listOf(), - artistNames = textTags.artistNames() ?: listOf(), - artistSortNames = textTags.artistSortNames() ?: listOf(), - albumArtistMusicBrainzIds = textTags.albumArtistMusicBrainzIds() ?: listOf(), - albumArtistNames = textTags.albumArtistNames() ?: listOf(), - albumArtistSortNames = textTags.albumArtistSortNames() ?: listOf(), - genreNames = textTags.genreNames() ?: listOf()) - } - - private fun defaultAudioFile( - deviceFile: DeviceFile, - metadataRetriever: MediaMetadataRetriever - ) = - AudioFile( - deviceFile, - name = need(deviceFile.path.name, "name"), - durationMs = - need( - metadataRetriever - .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) - ?.toLong(), - "duration"), - ) - - private fun need(a: T, called: String) = - requireNotNull(a) { "Invalid tag, missing $called" } -} private const val MESSAGE_PREPARE = 0 private const val MESSAGE_CONTINUE_LOADING = 1 @@ -140,19 +28,24 @@ private const val MESSAGE_CHECK_FAILURE = 2 private const val MESSAGE_RELEASE = 3 private const val CHECK_INTERVAL_MS = 100 -/** - * Patched version of Media3's MetadataRetriever that extracts metadata from several tracks at once - * on one thread. This is generally more efficient than stacking several threads at once. - * - * @author Media3 Team, Alexander Capehart (OxygenCobalt) - */ -private class ChunkedMetadataRetriever(private val mediaSourceFactory: MediaSource.Factory) : - Handler.Callback { +// TODO: Rewrite and re-integrate + +interface MetadataRetrieverExt { + fun retrieveMetadata(mediaItem: MediaItem): Future + fun retrieve() + + interface Factory { + fun create(): MetadataRetrieverExt + } +} + +class ReusableMetadataRetrieverImpl @Inject constructor(private val mediaSourceFactory: MediaSource.Factory) : + MetadataRetrieverExt, Handler.Callback { private val mediaSourceThread = HandlerThread("Auxio:ChunkedMetadataRetriever:${hashCode()}") private val mediaSourceHandler: HandlerWrapper private var job: MetadataJob? = null - private data class JobParams(val uri: Uri, val future: SettableFuture) + private data class JobParams(val mediaItem: MediaItem, val future: SettableFuture) private class JobData( val params: JobParams, @@ -167,15 +60,15 @@ private class ChunkedMetadataRetriever(private val mediaSourceFactory: MediaSour mediaSourceHandler = Clock.DEFAULT.createHandler(mediaSourceThread.looper, this) } - fun retrieve(uri: Uri): ListenableFuture { + override fun retrieveMetadata(mediaItem: MediaItem): Future { val job = job check(job == null || job.data.params.future.isDone) { "Already working on something: $job" } val future = SettableFuture.create() - mediaSourceHandler.obtainMessage(MESSAGE_PREPARE, JobParams(uri, future)).sendToTarget() + mediaSourceHandler.obtainMessage(MESSAGE_PREPARE, JobParams(mediaItem, future)).sendToTarget() return future } - fun release() { + override fun retrieve() { mediaSourceHandler.removeCallbacksAndMessages(null) mediaSourceThread.quit() } @@ -186,7 +79,7 @@ private class ChunkedMetadataRetriever(private val mediaSourceFactory: MediaSour val params = msg.obj as JobParams val mediaSource = - mediaSourceFactory.createMediaSource(MediaItem.fromUri(params.uri)) + mediaSourceFactory.createMediaSource(params.mediaItem) val data = JobData(params, mediaSource, null) val mediaSourceCaller = MediaSourceCaller(data) mediaSource.prepareSource( @@ -217,8 +110,8 @@ private class ChunkedMetadataRetriever(private val mediaSourceFactory: MediaSour mediaPeriod.maybeThrowPrepareError() } } catch (e: Exception) { - L.e("Failed to extract MediaSource") - L.e(e.stackTraceToString()) + Timber.e("Failed to extract MediaSource") + Timber.e(e.stackTraceToString()) mediaPeriod?.let(mediaSource::releasePeriod) mediaSource.releaseSource(mediaSourceCaller) job.data.params.future.setException(e) diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PrepareModule.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/ModelModule.kt similarity index 80% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PrepareModule.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/ModelModule.kt index 85447d9a2..9fd2f9ef0 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PrepareModule.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/ModelModule.kt @@ -1,6 +1,6 @@ /* - * Copyright (c) 2024 Auxio Project - * PrepareModule.kt is part of Auxio. + * Copyright (c) 2023 Auxio Project + * ModelModule.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 @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.prepare +package org.oxycblt.auxio.musikr.model import dagger.Binds import dagger.Module @@ -25,6 +25,6 @@ import dagger.hilt.components.SingletonComponent @Module @InstallIn(SingletonComponent::class) -interface PrepareModule { - @Binds fun prepare(factory: PreparerImpl): Preparer +interface InterpretModule { + @Binds fun interpreter(interpreter: ModelerImpl): Modeler } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Interpreter.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/Modeler.kt similarity index 80% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/Interpreter.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/Modeler.kt index e0ff6d91e..54e599821 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Interpreter.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/Modeler.kt @@ -1,6 +1,6 @@ /* * Copyright (c) 2024 Auxio Project - * Interpreter.kt is part of Auxio. + * Modeler.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 @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret +package org.oxycblt.auxio.musikr.model import javax.inject.Inject import kotlinx.coroutines.Dispatchers @@ -30,19 +30,20 @@ import kotlinx.coroutines.flow.toList import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.musikr.tag.AudioFile import org.oxycblt.auxio.musikr.playlist.PlaylistFile -import org.oxycblt.auxio.musikr.interpret.link.AlbumLinker -import org.oxycblt.auxio.musikr.interpret.link.ArtistLinker -import org.oxycblt.auxio.musikr.interpret.link.GenreLinker -import org.oxycblt.auxio.musikr.interpret.link.Linked -import org.oxycblt.auxio.musikr.interpret.link.LinkedSong -import org.oxycblt.auxio.musikr.model.AlbumImpl -import org.oxycblt.auxio.musikr.model.ArtistImpl -import org.oxycblt.auxio.musikr.model.GenreImpl -import org.oxycblt.auxio.musikr.model.LibraryImpl -import org.oxycblt.auxio.musikr.model.MutableLibrary -import org.oxycblt.auxio.musikr.model.SongImpl -import org.oxycblt.auxio.musikr.interpret.prepare.PreSong -import org.oxycblt.auxio.musikr.interpret.prepare.Preparer +import org.oxycblt.auxio.musikr.model.graph.AlbumLinker +import org.oxycblt.auxio.musikr.model.graph.ArtistLinker +import org.oxycblt.auxio.musikr.model.graph.GenreLinker +import org.oxycblt.auxio.musikr.model.graph.Linked +import org.oxycblt.auxio.musikr.model.graph.LinkedSong +import org.oxycblt.auxio.musikr.model.impl.AlbumImpl +import org.oxycblt.auxio.musikr.model.impl.ArtistImpl +import org.oxycblt.auxio.musikr.model.impl.GenreImpl +import org.oxycblt.auxio.musikr.model.impl.LibraryImpl +import org.oxycblt.auxio.musikr.model.impl.MutableLibrary +import org.oxycblt.auxio.musikr.model.impl.SongImpl +import org.oxycblt.auxio.musikr.tag.Interpretation +import org.oxycblt.auxio.musikr.tag.interpret.PreSong +import org.oxycblt.auxio.musikr.tag.interpret.TagInterpreter import timber.log.Timber as L interface Modeler { @@ -53,14 +54,14 @@ interface Modeler { ): MutableLibrary } -class ModelerImpl @Inject constructor(private val preparer: Preparer) : Modeler { +class ModelerImpl @Inject constructor(private val tagInterpreter: TagInterpreter) : Modeler { override suspend fun model( audioFiles: Flow, playlistFiles: Flow, interpretation: Interpretation ): MutableLibrary { val preSongs = - preparer + tagInterpreter .interpret(audioFiles, interpretation) .flowOn(Dispatchers.Main) .buffer(Channel.UNLIMITED) diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/AlbumLinker.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/AlbumLinker.kt similarity index 95% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/AlbumLinker.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/AlbumLinker.kt index f8c7da6a7..64b5d87aa 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/AlbumLinker.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/AlbumLinker.kt @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph import java.util.UUID import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import org.oxycblt.auxio.musikr.model.AlbumImpl -import org.oxycblt.auxio.musikr.model.SongImpl +import org.oxycblt.auxio.musikr.model.impl.AlbumImpl +import org.oxycblt.auxio.musikr.model.impl.SongImpl class AlbumLinker { private val tree = mutableMapOf>() diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/ArtistLinker.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/ArtistLinker.kt similarity index 93% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/ArtistLinker.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/ArtistLinker.kt index a09737ca3..3f8972bec 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/ArtistLinker.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/ArtistLinker.kt @@ -16,17 +16,17 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph import java.util.UUID import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import org.oxycblt.auxio.music.Music -import org.oxycblt.auxio.musikr.model.AlbumImpl -import org.oxycblt.auxio.musikr.model.ArtistImpl -import org.oxycblt.auxio.musikr.model.SongImpl -import org.oxycblt.auxio.musikr.interpret.prepare.PreAlbum -import org.oxycblt.auxio.musikr.interpret.prepare.PreArtist +import org.oxycblt.auxio.musikr.model.impl.AlbumImpl +import org.oxycblt.auxio.musikr.model.impl.ArtistImpl +import org.oxycblt.auxio.musikr.model.impl.SongImpl +import org.oxycblt.auxio.musikr.tag.interpret.PreAlbum +import org.oxycblt.auxio.musikr.tag.interpret.PreArtist class ArtistLinker { private val tree = mutableMapOf>() diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/Contribution.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/Contribution.kt similarity index 95% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/Contribution.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/Contribution.kt index 541785b87..b7f3bf0b3 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/Contribution.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/Contribution.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph class Contribution { private val map = mutableMapOf() diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/GenreLinker.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/GenreLinker.kt similarity index 90% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/GenreLinker.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/GenreLinker.kt index 04939302f..8e58ae916 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/GenreLinker.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/GenreLinker.kt @@ -16,14 +16,14 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import org.oxycblt.auxio.musikr.model.GenreImpl -import org.oxycblt.auxio.musikr.model.SongImpl -import org.oxycblt.auxio.musikr.interpret.prepare.PreGenre -import org.oxycblt.auxio.musikr.interpret.prepare.PreSong +import org.oxycblt.auxio.musikr.model.impl.GenreImpl +import org.oxycblt.auxio.musikr.model.impl.SongImpl +import org.oxycblt.auxio.musikr.tag.interpret.PreGenre +import org.oxycblt.auxio.musikr.tag.interpret.PreSong class GenreLinker { private val tree = mutableMapOf() diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/LinkedMusic.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/LinkedMusic.kt similarity index 71% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/LinkedMusic.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/LinkedMusic.kt index 4e16984e2..4bbc360c1 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/LinkedMusic.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/LinkedMusic.kt @@ -16,16 +16,16 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph -import org.oxycblt.auxio.musikr.model.AlbumImpl -import org.oxycblt.auxio.musikr.model.ArtistImpl -import org.oxycblt.auxio.musikr.model.GenreImpl -import org.oxycblt.auxio.musikr.model.PlaylistImpl -import org.oxycblt.auxio.musikr.model.SongImpl -import org.oxycblt.auxio.musikr.interpret.prepare.PreAlbum -import org.oxycblt.auxio.musikr.interpret.prepare.PrePlaylist -import org.oxycblt.auxio.musikr.interpret.prepare.PreSong +import org.oxycblt.auxio.musikr.model.impl.AlbumImpl +import org.oxycblt.auxio.musikr.model.impl.ArtistImpl +import org.oxycblt.auxio.musikr.model.impl.GenreImpl +import org.oxycblt.auxio.musikr.model.impl.PlaylistImpl +import org.oxycblt.auxio.musikr.model.impl.SongImpl +import org.oxycblt.auxio.musikr.tag.interpret.PreAlbum +import org.oxycblt.auxio.musikr.tag.interpret.PrePlaylist +import org.oxycblt.auxio.musikr.tag.interpret.PreSong interface LinkedSong { val preSong: PreSong diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/PlaylistLinker.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/PlaylistLinker.kt similarity index 91% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/PlaylistLinker.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/graph/PlaylistLinker.kt index 23d94c46c..77fc73341 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/link/PlaylistLinker.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/graph/PlaylistLinker.kt @@ -16,12 +16,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.link +package org.oxycblt.auxio.musikr.model.graph import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import org.oxycblt.auxio.musikr.playlist.PlaylistFile -import org.oxycblt.auxio.musikr.model.PlaylistImpl +import org.oxycblt.auxio.musikr.model.impl.PlaylistImpl class PlaylistLinker { fun register( diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/DeviceMusicImpl.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/DeviceMusicImpl.kt similarity index 96% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/DeviceMusicImpl.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/impl/DeviceMusicImpl.kt index 9dc28c5c4..ae7f5a2f7 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/DeviceMusicImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/DeviceMusicImpl.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.model.impl import kotlin.math.min import org.oxycblt.auxio.musikr.cover.Cover @@ -27,10 +27,11 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.MusicType import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.interpret.link.LinkedAlbum -import org.oxycblt.auxio.musikr.interpret.link.LinkedSong -import org.oxycblt.auxio.musikr.interpret.prepare.PreArtist -import org.oxycblt.auxio.musikr.interpret.prepare.PreGenre +import org.oxycblt.auxio.musikr.model.graph.LinkedAlbum +import org.oxycblt.auxio.musikr.model.graph.LinkedSong +import org.oxycblt.auxio.musikr.tag.Date +import org.oxycblt.auxio.musikr.tag.interpret.PreArtist +import org.oxycblt.auxio.musikr.tag.interpret.PreGenre import org.oxycblt.auxio.util.update /** diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/Library.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/Library.kt similarity index 98% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/Library.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/impl/Library.kt index de6f7a7ef..37ca090f2 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/Library.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/Library.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.model.impl import org.oxycblt.auxio.music.Library import org.oxycblt.auxio.music.Music diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/PlaylistImpl.kt b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/PlaylistImpl.kt similarity index 91% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/PlaylistImpl.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/model/impl/PlaylistImpl.kt index 0a69eebee..486f58de5 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/PlaylistImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/model/impl/PlaylistImpl.kt @@ -16,11 +16,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.model.impl import org.oxycblt.auxio.musikr.cover.Cover import org.oxycblt.auxio.music.Playlist -import org.oxycblt.auxio.musikr.interpret.link.LinkedPlaylist +import org.oxycblt.auxio.musikr.model.graph.LinkedPlaylist +import org.oxycblt.auxio.musikr.tag.Name class PlaylistImpl(linkedPlaylist: LinkedPlaylist) : Playlist { private val prePlaylist = linkedPlaylist.prePlaylist diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/playlist/m3u/M3U.kt b/app/src/main/java/org/oxycblt/auxio/musikr/playlist/m3u/M3U.kt index d282ff227..4d2e28248 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/playlist/m3u/M3U.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/playlist/m3u/M3U.kt @@ -28,7 +28,7 @@ import java.io.OutputStream import javax.inject.Inject import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.resolveNames -import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace +import org.oxycblt.auxio.musikr.tag.util.correctWhitespace import org.oxycblt.auxio.musikr.fs.Components import org.oxycblt.auxio.musikr.fs.Path import org.oxycblt.auxio.musikr.fs.Volume diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt index 6fc38c0ac..731d2f068 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt @@ -1,6 +1,5 @@ package org.oxycblt.auxio.musikr.tag -import org.oxycblt.auxio.musikr.model.Date import org.oxycblt.auxio.musikr.fs.DeviceFile data class AudioFile( diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/Date.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Date.kt similarity index 99% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/Date.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/Date.kt index bfb107b0d..0ab7b4dda 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/Date.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Date.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.tag import android.content.Context import java.text.ParseException diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/Disc.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Disc.kt similarity index 97% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/Disc.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/Disc.kt index be137e994..eb0add922 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/Disc.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Disc.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.tag import android.content.Context import org.oxycblt.auxio.R diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/Interpretation.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Interpretation.kt new file mode 100644 index 000000000..46f2be400 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Interpretation.kt @@ -0,0 +1,5 @@ +package org.oxycblt.auxio.musikr.tag + +import org.oxycblt.auxio.musikr.tag.interpret.Separators + +data class Interpretation(val nameFactory: Name.Known.Factory, val separators: Separators) \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/Name.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Name.kt similarity index 99% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/Name.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/Name.kt index f8087af0e..ae54103cb 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/Name.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/Name.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.tag import android.content.Context import androidx.annotation.StringRes diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/model/ReleaseType.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/ReleaseType.kt similarity index 98% rename from app/src/main/java/org/oxycblt/auxio/musikr/model/ReleaseType.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/ReleaseType.kt index f40ae966b..f7ef3cf5e 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/model/ReleaseType.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/ReleaseType.kt @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.model +package org.oxycblt.auxio.musikr.tag import org.oxycblt.auxio.R -import org.oxycblt.auxio.musikr.model.ReleaseType.Album +import org.oxycblt.auxio.musikr.tag.ReleaseType.Album /** * The type of release an [Album] is considered. This includes EPs, Singles, Compilations, etc. diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagCache.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagCache.kt index 720dc317e..041bf637a 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagCache.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagCache.kt @@ -49,5 +49,5 @@ class TagCacheImpl @Inject constructor(private val tagDao: TagDao) : TagCache { } override fun write(rawSongs: Flow) = - rawSongs.onEach { file -> tagDao.updateTags(Tags.fromAudioFile(file)) } + rawSongs.onEach { file -> tagDao.updateTags(CachedTags.fromAudioFile(file)) } } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagDatabase.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagDatabase.kt index 54d7d848e..c3e279c7d 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagDatabase.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/cache/TagDatabase.kt @@ -28,28 +28,28 @@ import androidx.room.Query import androidx.room.RoomDatabase import androidx.room.TypeConverter import androidx.room.TypeConverters -import org.oxycblt.auxio.musikr.model.Date +import org.oxycblt.auxio.musikr.tag.Date import org.oxycblt.auxio.musikr.tag.AudioFile import org.oxycblt.auxio.musikr.fs.DeviceFile -import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace -import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped +import org.oxycblt.auxio.musikr.tag.util.correctWhitespace +import org.oxycblt.auxio.musikr.tag.util.splitEscaped -@Database(entities = [Tags::class], version = 50, exportSchema = false) +@Database(entities = [CachedTags::class], version = 50, exportSchema = false) abstract class TagDatabase : RoomDatabase() { abstract fun cachedSongsDao(): TagDao } @Dao interface TagDao { - @Query("SELECT * FROM Tags WHERE uri = :uri AND dateModified = :dateModified") - suspend fun selectTags(uri: String, dateModified: Long): Tags? + @Query("SELECT * FROM CachedTags WHERE uri = :uri AND dateModified = :dateModified") + suspend fun selectTags(uri: String, dateModified: Long): CachedTags? - @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun updateTags(tags: Tags) + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun updateTags(cachedTags: CachedTags) } @Entity -@TypeConverters(Tags.Converters::class) -data class Tags( +@TypeConverters(CachedTags.Converters::class) +data class CachedTags( /** * The Uri of the [AudioFile]'s audio file, obtained from SAF. This should ideally be a black * box only used for comparison. @@ -140,7 +140,7 @@ data class Tags( companion object { fun fromAudioFile(audioFile: AudioFile) = - Tags( + CachedTags( uri = audioFile.deviceFile.uri.toString(), dateModified = audioFile.deviceFile.lastModified, musicBrainzId = audioFile.musicBrainzId, diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/ExtractorModule.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/ExtractorModule.kt deleted file mode 100644 index dd3f630c0..000000000 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/ExtractorModule.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2024 Auxio Project - * ExtractorModule.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.auxio.musikr.tag.extractor - -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent - -@Module -@InstallIn(SingletonComponent::class) -interface MetadataModule { - @Binds fun tagExtractor(impl: TagExtractorImpl): TagExtractor -} diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/InterpretModule.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/InterpretModule.kt similarity index 81% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/InterpretModule.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/InterpretModule.kt index 1cefa900c..de71e3ba8 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/InterpretModule.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/InterpretModule.kt @@ -1,6 +1,6 @@ /* - * Copyright (c) 2023 Auxio Project - * InterpretModule.kt is part of Auxio. + * Copyright (c) 2024 Auxio Project + * ModelModule.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 @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret +package org.oxycblt.auxio.musikr.tag.interpret import dagger.Binds import dagger.Module @@ -26,5 +26,5 @@ import dagger.hilt.components.SingletonComponent @Module @InstallIn(SingletonComponent::class) interface InterpretModule { - @Binds fun interpreter(interpreter: ModelerImpl): Modeler + @Binds fun tagInterpreter(factory: TagInterpreterImpl): TagInterpreter } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PreMusic.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/PreMusic.kt similarity index 92% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PreMusic.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/PreMusic.kt index 86e602324..2a25ea888 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/PreMusic.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/PreMusic.kt @@ -16,16 +16,16 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.prepare +package org.oxycblt.auxio.musikr.tag.interpret import android.net.Uri import java.util.UUID import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.MusicType -import org.oxycblt.auxio.musikr.model.Date -import org.oxycblt.auxio.musikr.model.Disc -import org.oxycblt.auxio.musikr.model.Name -import org.oxycblt.auxio.musikr.model.ReleaseType +import org.oxycblt.auxio.musikr.tag.Date +import org.oxycblt.auxio.musikr.tag.Disc +import org.oxycblt.auxio.musikr.tag.Name +import org.oxycblt.auxio.musikr.tag.ReleaseType import org.oxycblt.auxio.musikr.playlist.PlaylistHandle import org.oxycblt.auxio.musikr.fs.MimeType import org.oxycblt.auxio.musikr.fs.Path diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Separators.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/Separators.kt similarity index 93% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/Separators.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/Separators.kt index 5c16dbd29..74ceccd55 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/Separators.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/Separators.kt @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret +package org.oxycblt.auxio.musikr.tag.interpret -import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace -import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped +import org.oxycblt.auxio.musikr.tag.util.correctWhitespace +import org.oxycblt.auxio.musikr.tag.util.splitEscaped /** * Defines the user-specified parsing of multi-value tags. This should be used to parse any tags diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/Preparer.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/TagInterpreter.kt similarity index 93% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/Preparer.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/TagInterpreter.kt index e4b52711b..ef814a7ea 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/Preparer.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/interpret/TagInterpreter.kt @@ -1,6 +1,6 @@ /* * Copyright (c) 2024 Auxio Project - * Preparer.kt is part of Auxio. + * TagInterpreter.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 @@ -16,26 +16,27 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.prepare +package org.oxycblt.auxio.musikr.tag.interpret import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import org.oxycblt.auxio.R -import org.oxycblt.auxio.musikr.model.Disc -import org.oxycblt.auxio.musikr.model.Name -import org.oxycblt.auxio.musikr.model.ReleaseType +import org.oxycblt.auxio.musikr.tag.Disc +import org.oxycblt.auxio.musikr.tag.Name +import org.oxycblt.auxio.musikr.tag.ReleaseType import org.oxycblt.auxio.musikr.tag.AudioFile import org.oxycblt.auxio.musikr.fs.MimeType -import org.oxycblt.auxio.musikr.interpret.Interpretation +import org.oxycblt.auxio.musikr.tag.Interpretation +import org.oxycblt.auxio.musikr.tag.util.parseId3GenreNames import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment import org.oxycblt.auxio.util.toUuidOrNull -interface Preparer { +interface TagInterpreter { fun interpret(audioFiles: Flow, interpretation: Interpretation): Flow } -class PreparerImpl @Inject constructor() : Preparer { +class TagInterpreterImpl @Inject constructor() : TagInterpreter { override fun interpret(audioFiles: Flow, interpretation: Interpretation) = audioFiles.map { audioFile -> val individualPreArtists = diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/ParsedTags.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/ParsedTags.kt new file mode 100644 index 000000000..93e59e628 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/ParsedTags.kt @@ -0,0 +1,8 @@ +package org.oxycblt.auxio.musikr.tag.parse + +import org.oxycblt.auxio.musikr.fs.DeviceFile + +data class ParsedTags( + val deviceFile: DeviceFile, + +) \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagFields.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagFields.kt similarity index 97% rename from app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagFields.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagFields.kt index 55960bc26..5c92e7f9e 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagFields.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagFields.kt @@ -16,10 +16,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.tag.extractor +package org.oxycblt.auxio.musikr.tag.parse import androidx.core.text.isDigitsOnly -import org.oxycblt.auxio.musikr.model.Date +import org.oxycblt.auxio.musikr.tag.Date +import org.oxycblt.auxio.musikr.tag.util.parseId3v2PositionField +import org.oxycblt.auxio.musikr.tag.util.parseVorbisPositionField import org.oxycblt.auxio.util.nonZeroOrNull // Song @@ -234,9 +236,6 @@ private fun List.parseR128Adjustment() = private fun List.parseReplayGainAdjustment() = first().replace(REPLAYGAIN_ADJUSTMENT_FILTER_REGEX, "").toFloatOrNull()?.nonZeroOrNull() -val COMPILATION_ALBUM_ARTISTS = listOf("Various Artists") -val COMPILATION_RELEASE_TYPES = listOf("compilation") - /** * Matches non-float information from ReplayGain adjustments. Derived from vanilla music: * https://github.com/vanilla-music/vanilla diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagParser.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagParser.kt new file mode 100644 index 000000000..ab75aa52b --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TagParser.kt @@ -0,0 +1,4 @@ +package org.oxycblt.auxio.musikr.tag.parse + +interface TagParser { +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TextTags.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TextTags.kt similarity index 97% rename from app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TextTags.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TextTags.kt index e626655ff..32d5e0915 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TextTags.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/parse/TextTags.kt @@ -16,12 +16,13 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.tag.extractor +package org.oxycblt.auxio.musikr.tag.parse import androidx.media3.common.Metadata import androidx.media3.extractor.metadata.id3.InternalFrame import androidx.media3.extractor.metadata.id3.TextInformationFrame import androidx.media3.extractor.metadata.vorbis.VorbisComment +import org.oxycblt.auxio.musikr.tag.util.correctWhitespace /** * Processing wrapper for [Metadata] that allows organized access to text-based audio tags. diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/ID3Genre.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/ID3.kt similarity index 99% rename from app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/ID3Genre.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/util/ID3.kt index d456f6838..57ba58253 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/interpret/prepare/ID3Genre.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/ID3.kt @@ -1,6 +1,6 @@ /* * Copyright (c) 2024 Auxio Project - * ID3Genre.kt is part of Auxio. + * ID3.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 @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.interpret.prepare +package org.oxycblt.auxio.musikr.tag.util /// --- ID3v2 PARSING --- diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagUtil.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Transform.kt similarity index 56% rename from app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagUtil.kt rename to app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Transform.kt index 170627bd4..f954723d5 100644 --- a/app/src/main/java/org/oxycblt/auxio/musikr/tag/extractor/TagUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Transform.kt @@ -1,6 +1,6 @@ /* * Copyright (c) 2022 Auxio Project - * TagUtil.kt is part of Auxio. + * Transform.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 @@ -16,17 +16,12 @@ * along with this program. If not, see . */ -package org.oxycblt.auxio.musikr.tag.extractor - -import org.oxycblt.auxio.util.positiveOrNull +package org.oxycblt.auxio.musikr.tag.util /// --- GENERIC PARSING --- // TODO: Remove the escaping checks, it's too expensive to do this for every single tag. -// TODO: I want to eventually be able to move a lot of this into TagWorker once I no longer have -// to deal with the cross-module dependencies of MediaStoreExtractor. - /** * Split a [String] by the given selector, automatically handling escaped characters that satisfy * the selector. @@ -86,49 +81,3 @@ fun String.correctWhitespace() = trim().ifBlank { null } * @return A list of non-blank strings with trailing whitespace removed. */ fun List.correctWhitespace() = mapNotNull { it.correctWhitespace() } - -/** - * Parse an ID3v2-style position + total [String] field. These fields consist of a number and an - * (optional) total value delimited by a /. - * - * @return The position value extracted from the string field, or null if: - * - The position could not be parsed - * - The position was zeroed AND the total value was not present/zeroed - * - * @see transformPositionField - */ -fun String.parseId3v2PositionField() = - split('/', limit = 2).let { - transformPositionField(it[0].toIntOrNull(), it.getOrNull(1)?.toIntOrNull()) - } - -/** - * Parse a vorbis-style position + total field. These fields consist of two fields for the position - * and total numbers. - * - * @param pos The position value, or null if not present. - * @param total The total value, if not present. - * @return The position value extracted from the field, or null if: - * - The position could not be parsed - * - The position was zeroed AND the total value was not present/zeroed - * - * @see transformPositionField - */ -fun parseVorbisPositionField(pos: String?, total: String?) = - transformPositionField(pos?.toIntOrNull(), total?.toIntOrNull()) - -/** - * Transform a raw position + total field into a position a way that tolerates placeholder values. - * - * @param pos The position value, or null if not present. - * @param total The total value, if not present. - * @return The position value extracted from the field, or null if: - * - The position could not be parsed - * - The position was zeroed AND the total value was not present/zeroed - */ -fun transformPositionField(pos: Int?, total: Int?) = - if (pos != null && (pos > 0 || (total?.positiveOrNull() != null))) { - pos - } else { - null - } diff --git a/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Vorbis.kt b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Vorbis.kt new file mode 100644 index 000000000..6b6ab395b --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/musikr/tag/util/Vorbis.kt @@ -0,0 +1,50 @@ +package org.oxycblt.auxio.musikr.tag.util + +import org.oxycblt.auxio.util.positiveOrNull + + +/** + * Parse an ID3v2-style position + total [String] field. These fields consist of a number and an + * (optional) total value delimited by a /. + * + * @return The position value extracted from the string field, or null if: + * - The position could not be parsed + * - The position was zeroed AND the total value was not present/zeroed + * + * @see transformPositionField + */ +fun String.parseId3v2PositionField() = + split('/', limit = 2).let { + transformPositionField(it[0].toIntOrNull(), it.getOrNull(1)?.toIntOrNull()) + } + +/** + * Parse a vorbis-style position + total field. These fields consist of two fields for the position + * and total numbers. + * + * @param pos The position value, or null if not present. + * @param total The total value, if not present. + * @return The position value extracted from the field, or null if: + * - The position could not be parsed + * - The position was zeroed AND the total value was not present/zeroed + * + * @see transformPositionField + */ +fun parseVorbisPositionField(pos: String?, total: String?) = + transformPositionField(pos?.toIntOrNull(), total?.toIntOrNull()) + +/** + * Transform a raw position + total field into a position a way that tolerates placeholder values. + * + * @param pos The position value, or null if not present. + * @param total The total value, if not present. + * @return The position value extracted from the field, or null if: + * - The position could not be parsed + * - The position was zeroed AND the total value was not present/zeroed + */ +fun transformPositionField(pos: Int?, total: Int?) = + if (pos != null && (pos > 0 || (total?.positiveOrNull() != null))) { + pos + } else { + null + } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionInterface.kt b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionInterface.kt index 9f91a213e..cd5c96d75 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionInterface.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/service/MediaSessionInterface.kt @@ -38,7 +38,7 @@ import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicRepository import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.Name +import org.oxycblt.auxio.musikr.tag.Name import org.oxycblt.auxio.music.service.MediaSessionUID import org.oxycblt.auxio.music.service.MusicBrowser import org.oxycblt.auxio.playback.state.PlaybackCommand diff --git a/app/src/main/java/org/oxycblt/auxio/search/SearchEngine.kt b/app/src/main/java/org/oxycblt/auxio/search/SearchEngine.kt index 9a5a67e03..fe0b85d3a 100644 --- a/app/src/main/java/org/oxycblt/auxio/search/SearchEngine.kt +++ b/app/src/main/java/org/oxycblt/auxio/search/SearchEngine.kt @@ -28,7 +28,7 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Playlist import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.musikr.model.Name +import org.oxycblt.auxio.musikr.tag.Name import timber.log.Timber as L /** diff --git a/app/src/main/java/org/oxycblt/auxio/util/LangUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/LangUtil.kt index 9f87531fc..5b02d02ab 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/LangUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/LangUtil.kt @@ -22,7 +22,7 @@ import java.security.MessageDigest import java.util.UUID import kotlin.reflect.KClass import org.oxycblt.auxio.BuildConfig -import org.oxycblt.auxio.musikr.model.Date +import org.oxycblt.auxio.musikr.tag.Date /** * Sanitizes a value that is unlikely to be null. On debug builds, this aliases to [requireNotNull], diff --git a/app/src/test/java/org/oxycblt/auxio/music/info/DateTest.kt b/app/src/test/java/org/oxycblt/auxio/music/info/DateTest.kt index 43848e598..756752198 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/info/DateTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/info/DateTest.kt @@ -21,7 +21,7 @@ package org.oxycblt.auxio.music.info import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test -import org.oxycblt.auxio.musikr.model.Date +import org.oxycblt.auxio.musikr.tag.Date class DateTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/info/DiscTest.kt b/app/src/test/java/org/oxycblt/auxio/music/info/DiscTest.kt index 3c80b9022..2e39be891 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/info/DiscTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/info/DiscTest.kt @@ -20,7 +20,7 @@ package org.oxycblt.auxio.music.info import org.junit.Assert.assertEquals import org.junit.Test -import org.oxycblt.auxio.musikr.model.Disc +import org.oxycblt.auxio.musikr.tag.Disc class DiscTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/info/NameTest.kt b/app/src/test/java/org/oxycblt/auxio/music/info/NameTest.kt index 59c07c36f..252c65b67 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/info/NameTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/info/NameTest.kt @@ -21,8 +21,8 @@ package org.oxycblt.auxio.music.info import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Test -import org.oxycblt.auxio.musikr.model.Name -import org.oxycblt.auxio.musikr.model.SortToken +import org.oxycblt.auxio.musikr.tag.Name +import org.oxycblt.auxio.musikr.tag.SortToken class NameTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/info/ReleaseTypeTest.kt b/app/src/test/java/org/oxycblt/auxio/music/info/ReleaseTypeTest.kt index 1cc3a3769..f3165be05 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/info/ReleaseTypeTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/info/ReleaseTypeTest.kt @@ -20,7 +20,7 @@ package org.oxycblt.auxio.music.info import org.junit.Assert.assertEquals import org.junit.Test -import org.oxycblt.auxio.musikr.model.ReleaseType +import org.oxycblt.auxio.musikr.tag.ReleaseType class ReleaseTypeTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/metadata/SeparatorsTest.kt b/app/src/test/java/org/oxycblt/auxio/music/metadata/SeparatorsTest.kt index fc06da1c7..4f14b6d38 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/metadata/SeparatorsTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/metadata/SeparatorsTest.kt @@ -20,7 +20,7 @@ package org.oxycblt.auxio.music.metadata import org.junit.Assert.assertEquals import org.junit.Test -import org.oxycblt.auxio.musikr.interpret.Separators +import org.oxycblt.auxio.musikr.tag.interpret.Separators class SeparatorsTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/metadata/TagUtilTest.kt b/app/src/test/java/org/oxycblt/auxio/music/metadata/TagUtilTest.kt index a8291ab8c..6b0064244 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/metadata/TagUtilTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/metadata/TagUtilTest.kt @@ -20,11 +20,11 @@ package org.oxycblt.auxio.music.metadata import org.junit.Assert.assertEquals import org.junit.Test -import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace -import org.oxycblt.auxio.musikr.tag.extractor.parseId3v2PositionField -import org.oxycblt.auxio.musikr.tag.extractor.parseVorbisPositionField -import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped -import org.oxycblt.auxio.musikr.interpret.prepare.parseId3GenreNames +import org.oxycblt.auxio.musikr.tag.util.correctWhitespace +import org.oxycblt.auxio.musikr.tag.util.parseId3v2PositionField +import org.oxycblt.auxio.musikr.tag.util.parseVorbisPositionField +import org.oxycblt.auxio.musikr.tag.util.splitEscaped +import org.oxycblt.auxio.musikr.tag.util.parseId3GenreNames class TagUtilTest { @Test diff --git a/app/src/test/java/org/oxycblt/auxio/music/metadata/TextTagsTest.kt b/app/src/test/java/org/oxycblt/auxio/music/metadata/TextCachedTagsTest.kt similarity index 98% rename from app/src/test/java/org/oxycblt/auxio/music/metadata/TextTagsTest.kt rename to app/src/test/java/org/oxycblt/auxio/music/metadata/TextCachedTagsTest.kt index b0af8bf81..77be4c294 100644 --- a/app/src/test/java/org/oxycblt/auxio/music/metadata/TextTagsTest.kt +++ b/app/src/test/java/org/oxycblt/auxio/music/metadata/TextCachedTagsTest.kt @@ -27,9 +27,9 @@ import androidx.media3.extractor.metadata.vorbis.VorbisComment import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test -import org.oxycblt.auxio.musikr.tag.extractor.TextTags +import org.oxycblt.auxio.musikr.tag.parse.TextTags -class TextTagsTest { +class TextCachedTagsTest { @Test fun textTags_vorbis() { val textTags = TextTags(VORBIS_METADATA)