musikr: flatten modules
This commit is contained in:
parent
86a77bc19b
commit
523d3cdd30
54 changed files with 253 additions and 227 deletions
|
@ -33,8 +33,8 @@ import org.oxycblt.auxio.music.info.Date
|
||||||
import org.oxycblt.auxio.music.info.Disc
|
import org.oxycblt.auxio.music.info.Disc
|
||||||
import org.oxycblt.auxio.music.info.Name
|
import org.oxycblt.auxio.music.info.Name
|
||||||
import org.oxycblt.auxio.music.info.ReleaseType
|
import org.oxycblt.auxio.music.info.ReleaseType
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.MimeType
|
import org.oxycblt.auxio.musikr.fs.MimeType
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Path
|
import org.oxycblt.auxio.musikr.fs.Path
|
||||||
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
||||||
import org.oxycblt.auxio.util.concatLocalized
|
import org.oxycblt.auxio.util.concatLocalized
|
||||||
import org.oxycblt.auxio.util.toUuidOrNull
|
import org.oxycblt.auxio.util.toUuidOrNull
|
||||||
|
|
|
@ -29,8 +29,8 @@ import org.oxycblt.auxio.music.info.Name
|
||||||
import org.oxycblt.auxio.music.metadata.Separators
|
import org.oxycblt.auxio.music.metadata.Separators
|
||||||
import org.oxycblt.auxio.musikr.Indexer
|
import org.oxycblt.auxio.musikr.Indexer
|
||||||
import org.oxycblt.auxio.musikr.IndexingProgress
|
import org.oxycblt.auxio.musikr.IndexingProgress
|
||||||
import org.oxycblt.auxio.musikr.interpret.Interpretation
|
import org.oxycblt.auxio.musikr.model.Interpretation
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.MutableLibrary
|
import org.oxycblt.auxio.musikr.model.impl.MutableLibrary
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,7 +24,7 @@ import androidx.core.content.edit
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.R
|
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 org.oxycblt.auxio.settings.Settings
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,10 @@ import android.net.Uri
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.music.Playlist
|
import org.oxycblt.auxio.music.Playlist
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Components
|
import org.oxycblt.auxio.musikr.fs.Components
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.DocumentPathFactory
|
import org.oxycblt.auxio.musikr.fs.DocumentPathFactory
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Path
|
import org.oxycblt.auxio.musikr.fs.Path
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.contentResolverSafe
|
import org.oxycblt.auxio.musikr.fs.contentResolverSafe
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,11 +28,11 @@ import java.io.OutputStream
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.music.Playlist
|
import org.oxycblt.auxio.music.Playlist
|
||||||
import org.oxycblt.auxio.music.resolveNames
|
import org.oxycblt.auxio.music.resolveNames
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
|
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Components
|
import org.oxycblt.auxio.musikr.fs.Components
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Path
|
import org.oxycblt.auxio.musikr.fs.Path
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Volume
|
import org.oxycblt.auxio.musikr.fs.Volume
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.VolumeManager
|
import org.oxycblt.auxio.musikr.fs.VolumeManager
|
||||||
import org.oxycblt.auxio.util.unlikelyToBeNull
|
import org.oxycblt.auxio.util.unlikelyToBeNull
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.oxycblt.auxio.databinding.ItemMusicLocationBinding
|
import org.oxycblt.auxio.databinding.ItemMusicLocationBinding
|
||||||
import org.oxycblt.auxio.list.recycler.DialogRecyclerView
|
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.context
|
||||||
import org.oxycblt.auxio.util.inflater
|
import org.oxycblt.auxio.util.inflater
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
|
@ -36,7 +36,7 @@ import org.oxycblt.auxio.BuildConfig
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.databinding.DialogMusicLocationsBinding
|
import org.oxycblt.auxio.databinding.DialogMusicLocationsBinding
|
||||||
import org.oxycblt.auxio.music.MusicSettings
|
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.ui.ViewBindingMaterialDialogFragment
|
||||||
import org.oxycblt.auxio.util.showToast
|
import org.oxycblt.auxio.util.showToast
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
|
@ -24,7 +24,7 @@ import android.media.MediaFormat
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.music.Song
|
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
|
import timber.log.Timber as L
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
package org.oxycblt.auxio.music.metadata
|
package org.oxycblt.auxio.music.metadata
|
||||||
|
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
|
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
|
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
|
* Defines the user-specified parsing of multi-value tags. This should be used to parse any tags
|
||||||
|
|
|
@ -27,7 +27,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import org.oxycblt.auxio.music.MusicRepository
|
import org.oxycblt.auxio.music.MusicRepository
|
||||||
import org.oxycblt.auxio.music.MusicSettings
|
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
|
import timber.log.Timber as L
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,9 +28,9 @@ import kotlinx.coroutines.flow.buffer
|
||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.flowOn
|
||||||
import org.oxycblt.auxio.musikr.explore.Explorer
|
import org.oxycblt.auxio.musikr.explore.Explorer
|
||||||
import org.oxycblt.auxio.musikr.interpret.Interpretation
|
import org.oxycblt.auxio.musikr.model.Interpretation
|
||||||
import org.oxycblt.auxio.musikr.interpret.Interpreter
|
import org.oxycblt.auxio.musikr.model.Modeler
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.MutableLibrary
|
import org.oxycblt.auxio.musikr.model.impl.MutableLibrary
|
||||||
|
|
||||||
interface Indexer {
|
interface Indexer {
|
||||||
suspend fun run(
|
suspend fun run(
|
||||||
|
@ -53,7 +53,7 @@ sealed interface IndexingProgress {
|
||||||
|
|
||||||
class IndexerImpl
|
class IndexerImpl
|
||||||
@Inject
|
@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(
|
override suspend fun run(
|
||||||
uris: List<Uri>,
|
uris: List<Uri>,
|
||||||
interpretation: Interpretation,
|
interpretation: Interpretation,
|
||||||
|
@ -68,7 +68,7 @@ constructor(private val explorer: Explorer, private val interpreter: Interpreter
|
||||||
.flowOn(Dispatchers.IO)
|
.flowOn(Dispatchers.IO)
|
||||||
.buffer(Channel.UNLIMITED)
|
.buffer(Channel.UNLIMITED)
|
||||||
val playlistFiles = files.playlists.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> =
|
private fun <T> Flow<T>.cap(start: suspend () -> Unit, end: suspend () -> Unit): Flow<T> =
|
||||||
|
|
|
@ -34,11 +34,14 @@ import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.flow.receiveAsFlow
|
import kotlinx.coroutines.flow.receiveAsFlow
|
||||||
import kotlinx.coroutines.flow.withIndex
|
import kotlinx.coroutines.flow.withIndex
|
||||||
import org.oxycblt.auxio.musikr.IndexingProgress
|
import org.oxycblt.auxio.musikr.IndexingProgress
|
||||||
import org.oxycblt.auxio.musikr.explore.cache.CacheResult
|
import org.oxycblt.auxio.musikr.fs.DeviceFile
|
||||||
import org.oxycblt.auxio.musikr.explore.cache.TagCache
|
import org.oxycblt.auxio.musikr.tag.cache.CacheResult
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.TagExtractor
|
import org.oxycblt.auxio.musikr.tag.cache.TagCache
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.DeviceFiles
|
import org.oxycblt.auxio.musikr.tag.extractor.TagExtractor
|
||||||
import org.oxycblt.auxio.musikr.explore.playlists.StoredPlaylists
|
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
|
import timber.log.Timber
|
||||||
|
|
||||||
interface Explorer {
|
interface Explorer {
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
30
app/src/main/java/org/oxycblt/auxio/musikr/fs/DeviceFile.kt
Normal file
30
app/src/main/java/org/oxycblt/auxio/musikr/fs/DeviceFile.kt
Normal 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
|
||||||
|
)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.ContentResolver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
@ -31,7 +31,6 @@ import kotlinx.coroutines.flow.emitAll
|
||||||
import kotlinx.coroutines.flow.flatMapMerge
|
import kotlinx.coroutines.flow.flatMapMerge
|
||||||
import kotlinx.coroutines.flow.flattenMerge
|
import kotlinx.coroutines.flow.flattenMerge
|
||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import org.oxycblt.auxio.musikr.explore.DeviceFile
|
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
interface DeviceFiles {
|
interface DeviceFiles {
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.ContentUris
|
||||||
import android.content.Context
|
import android.content.Context
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.content.Context
|
||||||
import android.media.MediaFormat
|
import android.media.MediaFormat
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.ContentResolver
|
||||||
import android.content.Context
|
import android.content.Context
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.database.Cursor
|
||||||
import android.os.Build
|
import android.os.Build
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.annotation.SuppressLint
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
|
@ -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
|
||||||
|
)
|
|
@ -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>
|
||||||
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.info.Name
|
||||||
import org.oxycblt.auxio.music.metadata.Separators
|
import org.oxycblt.auxio.music.metadata.Separators
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2024 Auxio Project
|
* Copyright (c) 2023 Auxio Project
|
||||||
* PrepareModule.kt is part of Auxio.
|
* InterpretModule.kt is part of Auxio.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* 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/>.
|
* 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.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
|
@ -25,6 +25,6 @@ import dagger.hilt.components.SingletonComponent
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
interface PrepareModule {
|
interface ModelModule {
|
||||||
@Binds fun prepare(factory: PreparerImpl): Preparer
|
@Binds fun interpreter(interpreter: ModelerImpl): Modeler
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2024 Auxio Project
|
* 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
|
* 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
|
* 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/>.
|
* 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 javax.inject.Inject
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -28,40 +28,40 @@ import kotlinx.coroutines.flow.flowOn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.toList
|
import kotlinx.coroutines.flow.toList
|
||||||
import org.oxycblt.auxio.music.Music
|
import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.musikr.explore.AudioFile
|
import org.oxycblt.auxio.musikr.tag.AudioFile
|
||||||
import org.oxycblt.auxio.musikr.explore.PlaylistFile
|
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.AlbumLinker
|
import org.oxycblt.auxio.musikr.model.link.AlbumLinker
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.ArtistLinker
|
import org.oxycblt.auxio.musikr.model.link.ArtistLinker
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.GenreLinker
|
import org.oxycblt.auxio.musikr.model.link.GenreLinker
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.Linked
|
import org.oxycblt.auxio.musikr.model.link.Linked
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.LinkedSong
|
import org.oxycblt.auxio.musikr.model.link.LinkedSong
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
|
import org.oxycblt.auxio.musikr.model.impl.AlbumImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
|
import org.oxycblt.auxio.musikr.model.impl.ArtistImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
|
import org.oxycblt.auxio.musikr.model.impl.GenreImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.LibraryImpl
|
import org.oxycblt.auxio.musikr.model.impl.LibraryImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.MutableLibrary
|
import org.oxycblt.auxio.musikr.model.impl.MutableLibrary
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
|
import org.oxycblt.auxio.musikr.model.impl.SongImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreSong
|
import org.oxycblt.auxio.musikr.model.interpret.PreSong
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.Preparer
|
import org.oxycblt.auxio.musikr.model.interpret.Interpreter
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
interface Interpreter {
|
interface Modeler {
|
||||||
suspend fun interpret(
|
suspend fun model(
|
||||||
audioFiles: Flow<AudioFile>,
|
audioFiles: Flow<AudioFile>,
|
||||||
playlistFiles: Flow<PlaylistFile>,
|
playlistFiles: Flow<PlaylistFile>,
|
||||||
interpretation: Interpretation
|
interpretation: Interpretation
|
||||||
): MutableLibrary
|
): MutableLibrary
|
||||||
}
|
}
|
||||||
|
|
||||||
class InterpreterImpl @Inject constructor(private val preparer: Preparer) : Interpreter {
|
class ModelerImpl @Inject constructor(private val interpreter: Interpreter) : Modeler {
|
||||||
override suspend fun interpret(
|
override suspend fun model(
|
||||||
audioFiles: Flow<AudioFile>,
|
audioFiles: Flow<AudioFile>,
|
||||||
playlistFiles: Flow<PlaylistFile>,
|
playlistFiles: Flow<PlaylistFile>,
|
||||||
interpretation: Interpretation
|
interpretation: Interpretation
|
||||||
): MutableLibrary {
|
): MutableLibrary {
|
||||||
val preSongs =
|
val preSongs =
|
||||||
preparer
|
interpreter
|
||||||
.prepare(audioFiles, interpretation)
|
.interpret(audioFiles, interpretation)
|
||||||
.flowOn(Dispatchers.Main)
|
.flowOn(Dispatchers.Main)
|
||||||
.buffer(Channel.UNLIMITED)
|
.buffer(Channel.UNLIMITED)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 kotlin.math.min
|
||||||
import org.oxycblt.auxio.image.Cover
|
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.MusicType
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.music.info.Date
|
import org.oxycblt.auxio.music.info.Date
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.LinkedAlbum
|
import org.oxycblt.auxio.musikr.model.link.LinkedAlbum
|
||||||
import org.oxycblt.auxio.musikr.interpret.linker.LinkedSong
|
import org.oxycblt.auxio.musikr.model.link.LinkedSong
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreArtist
|
import org.oxycblt.auxio.musikr.model.interpret.PreArtist
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreGenre
|
import org.oxycblt.auxio.musikr.model.interpret.PreGenre
|
||||||
import org.oxycblt.auxio.util.update
|
import org.oxycblt.auxio.util.update
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -16,13 +16,13 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Library
|
||||||
import org.oxycblt.auxio.music.Music
|
import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.music.Playlist
|
import org.oxycblt.auxio.music.Playlist
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Path
|
import org.oxycblt.auxio.musikr.fs.Path
|
||||||
|
|
||||||
interface MutableLibrary : Library {
|
interface MutableLibrary : Library {
|
||||||
suspend fun createPlaylist(name: String, songs: List<Song>): MutableLibrary
|
suspend fun createPlaylist(name: String, songs: List<Song>): MutableLibrary
|
|
@ -16,12 +16,12 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.image.Cover
|
||||||
import org.oxycblt.auxio.music.Playlist
|
import org.oxycblt.auxio.music.Playlist
|
||||||
import org.oxycblt.auxio.music.info.Name
|
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 {
|
class PlaylistImpl(linkedPlaylist: LinkedPlaylist) : Playlist {
|
||||||
private val prePlaylist = linkedPlaylist.prePlaylist
|
private val prePlaylist = linkedPlaylist.prePlaylist
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 ---
|
/// --- ID3v2 PARSING ---
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023 Auxio Project
|
* Copyright (c) 2024 Auxio Project
|
||||||
* InterpretModule.kt is part of Auxio.
|
* PrepareModule.kt is part of Auxio.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* 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/>.
|
* 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.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
|
@ -26,5 +26,5 @@ import dagger.hilt.components.SingletonComponent
|
||||||
@Module
|
@Module
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
interface InterpretModule {
|
interface InterpretModule {
|
||||||
@Binds fun interpreter(interpreter: InterpreterImpl): Interpreter
|
@Binds fun prepare(factory: InterpreterImpl): Interpreter
|
||||||
}
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.Flow
|
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.Disc
|
||||||
import org.oxycblt.auxio.music.info.Name
|
import org.oxycblt.auxio.music.info.Name
|
||||||
import org.oxycblt.auxio.music.info.ReleaseType
|
import org.oxycblt.auxio.music.info.ReleaseType
|
||||||
import org.oxycblt.auxio.musikr.explore.AudioFile
|
import org.oxycblt.auxio.musikr.tag.AudioFile
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.MimeType
|
import org.oxycblt.auxio.musikr.fs.MimeType
|
||||||
import org.oxycblt.auxio.musikr.interpret.Interpretation
|
import org.oxycblt.auxio.musikr.model.Interpretation
|
||||||
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
||||||
import org.oxycblt.auxio.util.toUuidOrNull
|
import org.oxycblt.auxio.util.toUuidOrNull
|
||||||
|
|
||||||
interface Preparer {
|
interface Interpreter {
|
||||||
fun prepare(audioFiles: Flow<AudioFile>, interpretation: Interpretation): Flow<PreSong>
|
fun interpret(audioFiles: Flow<AudioFile>, interpretation: Interpretation): Flow<PreSong>
|
||||||
}
|
}
|
||||||
|
|
||||||
class PreparerImpl @Inject constructor() : Preparer {
|
class InterpreterImpl @Inject constructor() : Interpreter {
|
||||||
override fun prepare(audioFiles: Flow<AudioFile>, interpretation: Interpretation) =
|
override fun interpret(audioFiles: Flow<AudioFile>, interpretation: Interpretation) =
|
||||||
audioFiles.map { audioFile ->
|
audioFiles.map { audioFile ->
|
||||||
val individualPreArtists =
|
val individualPreArtists =
|
||||||
makePreArtists(
|
makePreArtists(
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 android.net.Uri
|
||||||
import java.util.UUID
|
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.Disc
|
||||||
import org.oxycblt.auxio.music.info.Name
|
import org.oxycblt.auxio.music.info.Name
|
||||||
import org.oxycblt.auxio.music.info.ReleaseType
|
import org.oxycblt.auxio.music.info.ReleaseType
|
||||||
import org.oxycblt.auxio.musikr.explore.PlaylistHandle
|
import org.oxycblt.auxio.musikr.playlist.PlaylistHandle
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.MimeType
|
import org.oxycblt.auxio.musikr.fs.MimeType
|
||||||
import org.oxycblt.auxio.musikr.explore.fs.Path
|
import org.oxycblt.auxio.musikr.fs.Path
|
||||||
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
|
||||||
import org.oxycblt.auxio.util.update
|
import org.oxycblt.auxio.util.update
|
||||||
|
|
|
@ -16,13 +16,13 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 java.util.UUID
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
|
import org.oxycblt.auxio.musikr.model.impl.AlbumImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
|
import org.oxycblt.auxio.musikr.model.impl.SongImpl
|
||||||
|
|
||||||
class AlbumLinker {
|
class AlbumLinker {
|
||||||
private val tree = mutableMapOf<String?, MutableMap<UUID?, AlbumLink>>()
|
private val tree = mutableMapOf<String?, MutableMap<UUID?, AlbumLink>>()
|
|
@ -16,17 +16,17 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 java.util.UUID
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.oxycblt.auxio.music.Music
|
import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.AlbumImpl
|
import org.oxycblt.auxio.musikr.model.impl.AlbumImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
|
import org.oxycblt.auxio.musikr.model.impl.ArtistImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
|
import org.oxycblt.auxio.musikr.model.impl.SongImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreAlbum
|
import org.oxycblt.auxio.musikr.model.interpret.PreAlbum
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreArtist
|
import org.oxycblt.auxio.musikr.model.interpret.PreArtist
|
||||||
|
|
||||||
class ArtistLinker {
|
class ArtistLinker {
|
||||||
private val tree = mutableMapOf<String?, MutableMap<UUID?, ArtistLink>>()
|
private val tree = mutableMapOf<String?, MutableMap<UUID?, ArtistLink>>()
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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> {
|
class Contribution<T> {
|
||||||
private val map = mutableMapOf<T, Int>()
|
private val map = mutableMapOf<T, Int>()
|
|
@ -16,14 +16,14 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
|
import org.oxycblt.auxio.musikr.model.impl.GenreImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
|
import org.oxycblt.auxio.musikr.model.impl.SongImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreGenre
|
import org.oxycblt.auxio.musikr.model.interpret.PreGenre
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreSong
|
import org.oxycblt.auxio.musikr.model.interpret.PreSong
|
||||||
|
|
||||||
class GenreLinker {
|
class GenreLinker {
|
||||||
private val tree = mutableMapOf<String?, GenreLink>()
|
private val tree = mutableMapOf<String?, GenreLink>()
|
|
@ -16,16 +16,16 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.model.impl.AlbumImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.ArtistImpl
|
import org.oxycblt.auxio.musikr.model.impl.ArtistImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.GenreImpl
|
import org.oxycblt.auxio.musikr.model.impl.GenreImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.PlaylistImpl
|
import org.oxycblt.auxio.musikr.model.impl.PlaylistImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.SongImpl
|
import org.oxycblt.auxio.musikr.model.impl.SongImpl
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreAlbum
|
import org.oxycblt.auxio.musikr.model.interpret.PreAlbum
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PrePlaylist
|
import org.oxycblt.auxio.musikr.model.interpret.PrePlaylist
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.PreSong
|
import org.oxycblt.auxio.musikr.model.interpret.PreSong
|
||||||
|
|
||||||
interface LinkedSong {
|
interface LinkedSong {
|
||||||
val preSong: PreSong
|
val preSong: PreSong
|
|
@ -16,12 +16,12 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Flow
|
||||||
import kotlinx.coroutines.flow.emptyFlow
|
import kotlinx.coroutines.flow.emptyFlow
|
||||||
import org.oxycblt.auxio.musikr.explore.PlaylistFile
|
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
|
||||||
import org.oxycblt.auxio.musikr.interpret.model.PlaylistImpl
|
import org.oxycblt.auxio.musikr.model.impl.PlaylistImpl
|
||||||
|
|
||||||
class PlaylistLinker {
|
class PlaylistLinker {
|
||||||
fun register(
|
fun register(
|
|
@ -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()
|
||||||
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Dao
|
||||||
import androidx.room.Database
|
import androidx.room.Database
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.ColumnInfo
|
||||||
import androidx.room.Embedded
|
import androidx.room.Embedded
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
@ -24,7 +24,7 @@ import kotlinx.coroutines.flow.asFlow
|
||||||
import kotlinx.coroutines.flow.emitAll
|
import kotlinx.coroutines.flow.emitAll
|
||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.oxycblt.auxio.musikr.explore.PlaylistFile
|
import org.oxycblt.auxio.musikr.playlist.PlaylistFile
|
||||||
|
|
||||||
interface StoredPlaylists {
|
interface StoredPlaylists {
|
||||||
fun read(): Flow<PlaylistFile>
|
fun read(): Flow<PlaylistFile>
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 android.content.Context
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
29
app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt
Normal file
29
app/src/main/java/org/oxycblt/auxio/musikr/tag/AudioFile.kt
Normal 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()
|
||||||
|
)
|
|
@ -16,14 +16,14 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import org.oxycblt.auxio.musikr.explore.AudioFile
|
import org.oxycblt.auxio.musikr.tag.AudioFile
|
||||||
import org.oxycblt.auxio.musikr.explore.DeviceFile
|
import org.oxycblt.auxio.musikr.fs.DeviceFile
|
||||||
|
|
||||||
sealed interface CacheResult {
|
sealed interface CacheResult {
|
||||||
data class Hit(val audioFile: AudioFile) : CacheResult
|
data class Hit(val audioFile: AudioFile) : CacheResult
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 android.content.Context
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Dao
|
||||||
import androidx.room.Database
|
import androidx.room.Database
|
||||||
|
@ -29,10 +29,10 @@ import androidx.room.RoomDatabase
|
||||||
import androidx.room.TypeConverter
|
import androidx.room.TypeConverter
|
||||||
import androidx.room.TypeConverters
|
import androidx.room.TypeConverters
|
||||||
import org.oxycblt.auxio.music.info.Date
|
import org.oxycblt.auxio.music.info.Date
|
||||||
import org.oxycblt.auxio.musikr.explore.AudioFile
|
import org.oxycblt.auxio.musikr.tag.AudioFile
|
||||||
import org.oxycblt.auxio.musikr.explore.DeviceFile
|
import org.oxycblt.auxio.musikr.fs.DeviceFile
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
|
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
|
import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped
|
||||||
|
|
||||||
@Database(entities = [Tags::class], version = 50, exportSchema = false)
|
@Database(entities = [Tags::class], version = 50, exportSchema = false)
|
||||||
abstract class TagDatabase : RoomDatabase() {
|
abstract class TagDatabase : RoomDatabase() {
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.content.Context
|
||||||
import android.media.MediaMetadataRetriever
|
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.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.guava.asDeferred
|
import kotlinx.coroutines.guava.asDeferred
|
||||||
import org.oxycblt.auxio.musikr.explore.AudioFile
|
import org.oxycblt.auxio.musikr.tag.AudioFile
|
||||||
import org.oxycblt.auxio.musikr.explore.DeviceFile
|
import org.oxycblt.auxio.musikr.fs.DeviceFile
|
||||||
import timber.log.Timber as L
|
import timber.log.Timber as L
|
||||||
|
|
||||||
interface TagExtractor {
|
interface TagExtractor {
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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 androidx.core.text.isDigitsOnly
|
||||||
import org.oxycblt.auxio.music.info.Date
|
import org.oxycblt.auxio.music.info.Date
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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
|
import org.oxycblt.auxio.util.positiveOrNull
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* 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.common.Metadata
|
||||||
import androidx.media3.extractor.metadata.id3.InternalFrame
|
import androidx.media3.extractor.metadata.id3.InternalFrame
|
|
@ -20,11 +20,11 @@ package org.oxycblt.auxio.music.metadata
|
||||||
|
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.correctWhitespace
|
import org.oxycblt.auxio.musikr.tag.extractor.correctWhitespace
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.parseId3v2PositionField
|
import org.oxycblt.auxio.musikr.tag.extractor.parseId3v2PositionField
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.parseVorbisPositionField
|
import org.oxycblt.auxio.musikr.tag.extractor.parseVorbisPositionField
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.splitEscaped
|
import org.oxycblt.auxio.musikr.tag.extractor.splitEscaped
|
||||||
import org.oxycblt.auxio.musikr.interpret.prepare.parseId3GenreNames
|
import org.oxycblt.auxio.musikr.model.interpret.parseId3GenreNames
|
||||||
|
|
||||||
class TagUtilTest {
|
class TagUtilTest {
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -27,7 +27,7 @@ import androidx.media3.extractor.metadata.vorbis.VorbisComment
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.oxycblt.auxio.musikr.explore.extractor.TextTags
|
import org.oxycblt.auxio.musikr.tag.extractor.TextTags
|
||||||
|
|
||||||
class TextTagsTest {
|
class TextTagsTest {
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in a new issue