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.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
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
@ -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> =
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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/>.
|
||||
*/
|
||||
|
||||
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 {
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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/>.
|
||||
*/
|
||||
|
||||
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
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
||||
/**
|
|
@ -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
|
|
@ -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
|
|
@ -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 ---
|
||||
|
|
@ -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
|
||||
}
|
|
@ -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(
|
|
@ -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
|
||||
|
|
@ -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>>()
|
|
@ -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>>()
|
|
@ -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>()
|
|
@ -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>()
|
|
@ -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
|
|
@ -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(
|
|
@ -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/>.
|
||||
*/
|
||||
|
||||
package org.oxycblt.auxio.musikr.explore.playlists
|
||||
package org.oxycblt.auxio.musikr.playlist.db
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Database
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
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/>.
|
||||
*/
|
||||
|
||||
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
|
|
@ -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
|
|
@ -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() {
|
|
@ -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
|
|
@ -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 {
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue