musikr: flatten modules

This commit is contained in:
Alexander Capehart 2024-11-30 17:05:13 -07:00
parent 86a77bc19b
commit 523d3cdd30
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
54 changed files with 253 additions and 227 deletions

View file

@ -33,8 +33,8 @@ import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.music.info.Disc
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.info.ReleaseType
import org.oxycblt.auxio.musikr.explore.fs.MimeType
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.fs.MimeType
import org.oxycblt.auxio.musikr.fs.Path
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
import org.oxycblt.auxio.util.concatLocalized
import org.oxycblt.auxio.util.toUuidOrNull

View file

@ -29,8 +29,8 @@ import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.metadata.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.interpret.model.MutableLibrary
import org.oxycblt.auxio.musikr.model.Interpretation
import org.oxycblt.auxio.musikr.model.impl.MutableLibrary
import timber.log.Timber as L
/**

View file

@ -24,7 +24,7 @@ import androidx.core.content.edit
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import org.oxycblt.auxio.R
import org.oxycblt.auxio.musikr.explore.fs.DocumentPathFactory
import org.oxycblt.auxio.musikr.fs.DocumentPathFactory
import org.oxycblt.auxio.settings.Settings
import timber.log.Timber as L

View file

@ -23,10 +23,10 @@ import android.net.Uri
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import org.oxycblt.auxio.music.Playlist
import org.oxycblt.auxio.musikr.explore.fs.Components
import org.oxycblt.auxio.musikr.explore.fs.DocumentPathFactory
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.explore.fs.contentResolverSafe
import org.oxycblt.auxio.musikr.fs.Components
import org.oxycblt.auxio.musikr.fs.DocumentPathFactory
import org.oxycblt.auxio.musikr.fs.Path
import org.oxycblt.auxio.musikr.fs.contentResolverSafe
import timber.log.Timber as L
/**

View file

@ -28,11 +28,11 @@ 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.explore.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.explore.fs.Components
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.explore.fs.Volume
import org.oxycblt.auxio.musikr.explore.fs.VolumeManager
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.fs.Components
import org.oxycblt.auxio.musikr.fs.Path
import org.oxycblt.auxio.musikr.fs.Volume
import org.oxycblt.auxio.musikr.fs.VolumeManager
import org.oxycblt.auxio.util.unlikelyToBeNull
import timber.log.Timber as L

View file

@ -24,7 +24,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import org.oxycblt.auxio.databinding.ItemMusicLocationBinding
import org.oxycblt.auxio.list.recycler.DialogRecyclerView
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.fs.Path
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.inflater
import timber.log.Timber as L

View file

@ -36,7 +36,7 @@ import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.DialogMusicLocationsBinding
import org.oxycblt.auxio.music.MusicSettings
import org.oxycblt.auxio.musikr.explore.fs.DocumentPathFactory
import org.oxycblt.auxio.musikr.fs.DocumentPathFactory
import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment
import org.oxycblt.auxio.util.showToast
import timber.log.Timber as L

View file

@ -24,7 +24,7 @@ import android.media.MediaFormat
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.musikr.explore.fs.MimeType
import org.oxycblt.auxio.musikr.fs.MimeType
import timber.log.Timber as L
/**

View file

@ -18,8 +18,8 @@
package org.oxycblt.auxio.music.metadata
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped
/**
* Defines the user-specified parsing of multi-value tags. This should be used to parse any tags

View file

@ -27,7 +27,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import org.oxycblt.auxio.music.MusicRepository
import org.oxycblt.auxio.music.MusicSettings
import org.oxycblt.auxio.musikr.explore.fs.contentResolverSafe
import org.oxycblt.auxio.musikr.fs.contentResolverSafe
import timber.log.Timber as L
/**

View file

@ -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.Interpreter
import org.oxycblt.auxio.musikr.interpret.model.MutableLibrary
import org.oxycblt.auxio.musikr.model.Interpretation
import org.oxycblt.auxio.musikr.model.Modeler
import org.oxycblt.auxio.musikr.model.impl.MutableLibrary
interface Indexer {
suspend fun run(
@ -53,7 +53,7 @@ sealed interface IndexingProgress {
class IndexerImpl
@Inject
constructor(private val explorer: Explorer, private val interpreter: Interpreter) : Indexer {
constructor(private val explorer: Explorer, private val modeler: Modeler) : Indexer {
override suspend fun run(
uris: List<Uri>,
interpretation: Interpretation,
@ -68,7 +68,7 @@ constructor(private val explorer: Explorer, private val interpreter: Interpreter
.flowOn(Dispatchers.IO)
.buffer(Channel.UNLIMITED)
val playlistFiles = files.playlists.flowOn(Dispatchers.IO).buffer(Channel.UNLIMITED)
interpreter.interpret(audioFiles, playlistFiles, interpretation)
modeler.model(audioFiles, playlistFiles, interpretation)
}
private fun <T> Flow<T>.cap(start: suspend () -> Unit, end: suspend () -> Unit): Flow<T> =

View file

@ -34,11 +34,14 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.withIndex
import org.oxycblt.auxio.musikr.IndexingProgress
import org.oxycblt.auxio.musikr.explore.cache.CacheResult
import org.oxycblt.auxio.musikr.explore.cache.TagCache
import org.oxycblt.auxio.musikr.explore.extractor.TagExtractor
import org.oxycblt.auxio.musikr.explore.fs.DeviceFiles
import org.oxycblt.auxio.musikr.explore.playlists.StoredPlaylists
import org.oxycblt.auxio.musikr.fs.DeviceFile
import org.oxycblt.auxio.musikr.tag.cache.CacheResult
import org.oxycblt.auxio.musikr.tag.cache.TagCache
import org.oxycblt.auxio.musikr.tag.extractor.TagExtractor
import org.oxycblt.auxio.musikr.fs.DeviceFiles
import org.oxycblt.auxio.musikr.playlist.db.StoredPlaylists
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
import org.oxycblt.auxio.musikr.tag.AudioFile
import timber.log.Timber
interface Explorer {

View file

@ -1,81 +0,0 @@
/*
* Copyright (c) 2023 Auxio Project
* Files.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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore
import android.net.Uri
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.musikr.explore.fs.Path
data class DeviceFile(
val uri: Uri,
val mimeType: String,
val path: Path,
val size: Long,
val lastModified: Long
)
data class AudioFile(
val deviceFile: DeviceFile,
val durationMs: Long,
val replayGainTrackAdjustment: Float? = null,
val replayGainAlbumAdjustment: Float? = null,
val musicBrainzId: String? = null,
val name: String,
val sortName: String? = null,
val track: Int? = null,
val disc: Int? = null,
val subtitle: String? = null,
val date: Date? = null,
val albumMusicBrainzId: String? = null,
val albumName: String? = null,
val albumSortName: String? = null,
val releaseTypes: List<String> = listOf(),
val artistMusicBrainzIds: List<String> = listOf(),
val artistNames: List<String> = listOf(),
val artistSortNames: List<String> = listOf(),
val albumArtistMusicBrainzIds: List<String> = listOf(),
val albumArtistNames: List<String> = listOf(),
val albumArtistSortNames: List<String> = listOf(),
val genreNames: List<String> = listOf()
)
data class PlaylistFile(
val name: String,
val songPointers: List<SongPointer>,
val editor: PlaylistHandle
)
interface PlaylistHandle {
val uid: Music.UID
suspend fun rename(name: String)
suspend fun add(songs: List<Song>)
suspend fun rewrite(songs: List<Song>)
suspend fun delete()
}
sealed interface SongPointer {
data class UID(val uid: Music.UID) : SongPointer
// data class Path(val options: List<Path>) : SongPointer
}

View file

@ -0,0 +1,30 @@
/*
* Copyright (c) 2023 Auxio Project
* DeviceFile.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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.fs
import android.net.Uri
data class DeviceFile(
val uri: Uri,
val mimeType: String,
val path: Path,
val size: Long,
val lastModified: Long
)

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.content.ContentResolver
import android.content.Context
@ -31,7 +31,6 @@ import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flatMapMerge
import kotlinx.coroutines.flow.flattenMerge
import kotlinx.coroutines.flow.flow
import org.oxycblt.auxio.musikr.explore.DeviceFile
import timber.log.Timber
interface DeviceFiles {

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.content.ContentUris
import android.content.Context

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.content.Context
import android.media.MediaFormat

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.content.ContentResolver
import android.content.Context

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.database.Cursor
import android.os.Build

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.fs
package org.oxycblt.auxio.musikr.fs
import android.annotation.SuppressLint
import android.content.ContentResolver

View file

@ -0,0 +1,11 @@
package org.oxycblt.auxio.musikr.metadata
import android.media.MediaMetadataRetriever
import androidx.media3.common.Metadata
import org.oxycblt.auxio.musikr.fs.DeviceFile
data class AudioMetadata(
val file: DeviceFile,
val exoPlayerMetadata: Metadata,
val mediaMetadataRetriever: MediaMetadataRetriever
)

View file

@ -0,0 +1,8 @@
package org.oxycblt.auxio.musikr.metadata
import kotlinx.coroutines.flow.Flow
import org.oxycblt.auxio.musikr.fs.DeviceFile
interface MetadataExtractor {
fun extract(files: Flow<DeviceFile>): Flow<AudioMetadata>
}

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret
package org.oxycblt.auxio.musikr.model
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.metadata.Separators

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2024 Auxio Project
* PrepareModule.kt is part of Auxio.
* Copyright (c) 2023 Auxio Project
* InterpretModule.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 <https://www.gnu.org/licenses/>.
*/
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 ModelModule {
@Binds fun interpreter(interpreter: ModelerImpl): Modeler
}

View file

@ -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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret
package org.oxycblt.auxio.musikr.model
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
@ -28,40 +28,40 @@ import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.toList
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.musikr.explore.AudioFile
import org.oxycblt.auxio.musikr.explore.PlaylistFile
import org.oxycblt.auxio.musikr.interpret.linker.AlbumLinker
import org.oxycblt.auxio.musikr.interpret.linker.ArtistLinker
import org.oxycblt.auxio.musikr.interpret.linker.GenreLinker
import org.oxycblt.auxio.musikr.interpret.linker.Linked
import org.oxycblt.auxio.musikr.interpret.linker.LinkedSong
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
import org.oxycblt.auxio.musikr.interpret.model.LibraryImpl
import org.oxycblt.auxio.musikr.interpret.model.MutableLibrary
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
import org.oxycblt.auxio.musikr.interpret.prepare.PreSong
import org.oxycblt.auxio.musikr.interpret.prepare.Preparer
import org.oxycblt.auxio.musikr.tag.AudioFile
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
import org.oxycblt.auxio.musikr.model.link.AlbumLinker
import org.oxycblt.auxio.musikr.model.link.ArtistLinker
import org.oxycblt.auxio.musikr.model.link.GenreLinker
import org.oxycblt.auxio.musikr.model.link.Linked
import org.oxycblt.auxio.musikr.model.link.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.model.interpret.PreSong
import org.oxycblt.auxio.musikr.model.interpret.Interpreter
import timber.log.Timber as L
interface Interpreter {
suspend fun interpret(
interface Modeler {
suspend fun model(
audioFiles: Flow<AudioFile>,
playlistFiles: Flow<PlaylistFile>,
interpretation: Interpretation
): MutableLibrary
}
class InterpreterImpl @Inject constructor(private val preparer: Preparer) : Interpreter {
override suspend fun interpret(
class ModelerImpl @Inject constructor(private val interpreter: Interpreter) : Modeler {
override suspend fun model(
audioFiles: Flow<AudioFile>,
playlistFiles: Flow<PlaylistFile>,
interpretation: Interpretation
): MutableLibrary {
val preSongs =
preparer
.prepare(audioFiles, interpretation)
interpreter
.interpret(audioFiles, interpretation)
.flowOn(Dispatchers.Main)
.buffer(Channel.UNLIMITED)

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.model
package org.oxycblt.auxio.musikr.model.impl
import kotlin.math.min
import org.oxycblt.auxio.image.Cover
@ -28,10 +28,10 @@ import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicType
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.musikr.interpret.linker.LinkedAlbum
import org.oxycblt.auxio.musikr.interpret.linker.LinkedSong
import org.oxycblt.auxio.musikr.interpret.prepare.PreArtist
import org.oxycblt.auxio.musikr.interpret.prepare.PreGenre
import org.oxycblt.auxio.musikr.model.link.LinkedAlbum
import org.oxycblt.auxio.musikr.model.link.LinkedSong
import org.oxycblt.auxio.musikr.model.interpret.PreArtist
import org.oxycblt.auxio.musikr.model.interpret.PreGenre
import org.oxycblt.auxio.util.update
/**

View file

@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.model
package org.oxycblt.auxio.musikr.model.impl
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.Playlist
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.fs.Path
interface MutableLibrary : Library {
suspend fun createPlaylist(name: String, songs: List<Song>): MutableLibrary

View file

@ -16,12 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.model
package org.oxycblt.auxio.musikr.model.impl
import org.oxycblt.auxio.image.Cover
import org.oxycblt.auxio.music.Playlist
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.musikr.interpret.linker.LinkedPlaylist
import org.oxycblt.auxio.musikr.model.link.LinkedPlaylist
class PlaylistImpl(linkedPlaylist: LinkedPlaylist) : Playlist {
private val prePlaylist = linkedPlaylist.prePlaylist

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.prepare
package org.oxycblt.auxio.musikr.model.interpret
/// --- ID3v2 PARSING ---

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2023 Auxio Project
* InterpretModule.kt is part of Auxio.
* Copyright (c) 2024 Auxio Project
* PrepareModule.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 <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret
package org.oxycblt.auxio.musikr.model.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: InterpreterImpl): Interpreter
@Binds fun prepare(factory: InterpreterImpl): Interpreter
}

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.prepare
package org.oxycblt.auxio.musikr.model.interpret
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
@ -25,18 +25,18 @@ import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.info.Disc
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.info.ReleaseType
import org.oxycblt.auxio.musikr.explore.AudioFile
import org.oxycblt.auxio.musikr.explore.fs.MimeType
import org.oxycblt.auxio.musikr.interpret.Interpretation
import org.oxycblt.auxio.musikr.tag.AudioFile
import org.oxycblt.auxio.musikr.fs.MimeType
import org.oxycblt.auxio.musikr.model.Interpretation
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
import org.oxycblt.auxio.util.toUuidOrNull
interface Preparer {
fun prepare(audioFiles: Flow<AudioFile>, interpretation: Interpretation): Flow<PreSong>
interface Interpreter {
fun interpret(audioFiles: Flow<AudioFile>, interpretation: Interpretation): Flow<PreSong>
}
class PreparerImpl @Inject constructor() : Preparer {
override fun prepare(audioFiles: Flow<AudioFile>, interpretation: Interpretation) =
class InterpreterImpl @Inject constructor() : Interpreter {
override fun interpret(audioFiles: Flow<AudioFile>, interpretation: Interpretation) =
audioFiles.map { audioFile ->
val individualPreArtists =
makePreArtists(

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.prepare
package org.oxycblt.auxio.musikr.model.interpret
import android.net.Uri
import java.util.UUID
@ -26,9 +26,9 @@ import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.music.info.Disc
import org.oxycblt.auxio.music.info.Name
import org.oxycblt.auxio.music.info.ReleaseType
import org.oxycblt.auxio.musikr.explore.PlaylistHandle
import org.oxycblt.auxio.musikr.explore.fs.MimeType
import org.oxycblt.auxio.musikr.explore.fs.Path
import org.oxycblt.auxio.musikr.playlist.PlaylistHandle
import org.oxycblt.auxio.musikr.fs.MimeType
import org.oxycblt.auxio.musikr.fs.Path
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
import org.oxycblt.auxio.util.update

View file

@ -16,13 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
import java.util.UUID
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
import org.oxycblt.auxio.musikr.model.impl.AlbumImpl
import org.oxycblt.auxio.musikr.model.impl.SongImpl
class AlbumLinker {
private val tree = mutableMapOf<String?, MutableMap<UUID?, AlbumLink>>()

View file

@ -16,17 +16,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
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.interpret.model.AlbumImpl
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
import org.oxycblt.auxio.musikr.interpret.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.model.interpret.PreAlbum
import org.oxycblt.auxio.musikr.model.interpret.PreArtist
class ArtistLinker {
private val tree = mutableMapOf<String?, MutableMap<UUID?, ArtistLink>>()

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
class Contribution<T> {
private val map = mutableMapOf<T, Int>()

View file

@ -16,14 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
import org.oxycblt.auxio.musikr.interpret.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.model.interpret.PreGenre
import org.oxycblt.auxio.musikr.model.interpret.PreSong
class GenreLinker {
private val tree = mutableMapOf<String?, GenreLink>()

View file

@ -16,16 +16,16 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
import org.oxycblt.auxio.musikr.interpret.model.PlaylistImpl
import org.oxycblt.auxio.musikr.interpret.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.model.interpret.PreAlbum
import org.oxycblt.auxio.musikr.model.interpret.PrePlaylist
import org.oxycblt.auxio.musikr.model.interpret.PreSong
interface LinkedSong {
val preSong: PreSong

View file

@ -16,12 +16,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.interpret.linker
package org.oxycblt.auxio.musikr.model.link
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import org.oxycblt.auxio.musikr.explore.PlaylistFile
import org.oxycblt.auxio.musikr.interpret.model.PlaylistImpl
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
import org.oxycblt.auxio.musikr.model.impl.PlaylistImpl
class PlaylistLinker {
fun register(

View file

@ -0,0 +1,27 @@
package org.oxycblt.auxio.musikr.playlist
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.Song
data class PlaylistFile(
val name: String,
val songPointers: List<SongPointer>,
val editor: PlaylistHandle
)
sealed interface SongPointer {
data class UID(val uid: Music.UID) : SongPointer
// data class Path(val options: List<Path>) : SongPointer
}
interface PlaylistHandle {
val uid: Music.UID
suspend fun rename(name: String)
suspend fun add(songs: List<Song>)
suspend fun rewrite(songs: List<Song>)
suspend fun delete()
}

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.playlists
package org.oxycblt.auxio.musikr.playlist.db
import androidx.room.Dao
import androidx.room.Database

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.playlists
package org.oxycblt.auxio.musikr.playlist.db
import androidx.room.ColumnInfo
import androidx.room.Embedded

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.playlists
package org.oxycblt.auxio.musikr.playlist.db
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
@ -24,7 +24,7 @@ import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import org.oxycblt.auxio.musikr.explore.PlaylistFile
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
interface StoredPlaylists {
fun read(): Flow<PlaylistFile>

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.playlists
package org.oxycblt.auxio.musikr.playlist.db
import android.content.Context
import androidx.room.Room

View file

@ -0,0 +1,29 @@
package org.oxycblt.auxio.musikr.tag
import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.musikr.fs.DeviceFile
data class AudioFile(
val deviceFile: DeviceFile,
val durationMs: Long,
val replayGainTrackAdjustment: Float? = null,
val replayGainAlbumAdjustment: Float? = null,
val musicBrainzId: String? = null,
val name: String,
val sortName: String? = null,
val track: Int? = null,
val disc: Int? = null,
val subtitle: String? = null,
val date: Date? = null,
val albumMusicBrainzId: String? = null,
val albumName: String? = null,
val albumSortName: String? = null,
val releaseTypes: List<String> = listOf(),
val artistMusicBrainzIds: List<String> = listOf(),
val artistNames: List<String> = listOf(),
val artistSortNames: List<String> = listOf(),
val albumArtistMusicBrainzIds: List<String> = listOf(),
val albumArtistNames: List<String> = listOf(),
val albumArtistSortNames: List<String> = listOf(),
val genreNames: List<String> = listOf()
)

View file

@ -16,14 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.cache
package org.oxycblt.auxio.musikr.tag.cache
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import org.oxycblt.auxio.musikr.explore.AudioFile
import org.oxycblt.auxio.musikr.explore.DeviceFile
import org.oxycblt.auxio.musikr.tag.AudioFile
import org.oxycblt.auxio.musikr.fs.DeviceFile
sealed interface CacheResult {
data class Hit(val audioFile: AudioFile) : CacheResult

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.cache
package org.oxycblt.auxio.musikr.tag.cache
import android.content.Context
import androidx.room.Room

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.cache
package org.oxycblt.auxio.musikr.tag.cache
import androidx.room.Dao
import androidx.room.Database
@ -29,10 +29,10 @@ import androidx.room.RoomDatabase
import androidx.room.TypeConverter
import androidx.room.TypeConverters
import org.oxycblt.auxio.music.info.Date
import org.oxycblt.auxio.musikr.explore.AudioFile
import org.oxycblt.auxio.musikr.explore.DeviceFile
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
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
@Database(entities = [Tags::class], version = 50, exportSchema = false)
abstract class TagDatabase : RoomDatabase() {

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.extractor
package org.oxycblt.auxio.musikr.tag.extractor
import dagger.Binds
import dagger.Module

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.extractor
package org.oxycblt.auxio.musikr.tag.extractor
import android.content.Context
import android.media.MediaMetadataRetriever
@ -43,8 +43,8 @@ import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.guava.asDeferred
import org.oxycblt.auxio.musikr.explore.AudioFile
import org.oxycblt.auxio.musikr.explore.DeviceFile
import org.oxycblt.auxio.musikr.tag.AudioFile
import org.oxycblt.auxio.musikr.fs.DeviceFile
import timber.log.Timber as L
interface TagExtractor {

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.extractor
package org.oxycblt.auxio.musikr.tag.extractor
import androidx.core.text.isDigitsOnly
import org.oxycblt.auxio.music.info.Date

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.extractor
package org.oxycblt.auxio.musikr.tag.extractor
import org.oxycblt.auxio.util.positiveOrNull

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.musikr.explore.extractor
package org.oxycblt.auxio.musikr.tag.extractor
import androidx.media3.common.Metadata
import androidx.media3.extractor.metadata.id3.InternalFrame

View file

@ -20,11 +20,11 @@ package org.oxycblt.auxio.music.metadata
import org.junit.Assert.assertEquals
import org.junit.Test
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
import org.oxycblt.auxio.musikr.explore.extractor.parseId3v2PositionField
import org.oxycblt.auxio.musikr.explore.extractor.parseVorbisPositionField
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
import org.oxycblt.auxio.musikr.interpret.prepare.parseId3GenreNames
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.model.interpret.parseId3GenreNames
class TagUtilTest {
@Test

View file

@ -27,7 +27,7 @@ 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.explore.extractor.TextTags
import org.oxycblt.auxio.musikr.tag.extractor.TextTags
class TextTagsTest {
@Test