From 6feee93438df32687caf8d24a9720d509e80eab6 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 3 Mar 2025 19:59:11 -0700 Subject: [PATCH] musikr: streamline package structure --- .../org/oxycblt/auxio/image/CoverProvider.kt | 2 +- .../java/org/oxycblt/auxio/image/CoverView.kt | 2 +- .../image/coil/CoverCollectionFetcher.kt | 2 +- .../oxycblt/auxio/image/coil/CoverFetcher.kt | 2 +- .../org/oxycblt/auxio/image/coil/Keyers.kt | 4 +- .../oxycblt/auxio/image/covers/CoverModule.kt | 2 +- .../oxycblt/auxio/image/covers/CoverSilo.kt | 2 +- .../oxycblt/auxio/image/covers/NullCovers.kt | 6 +-- .../auxio/image/covers/SettingCovers.kt | 21 ++++----- .../auxio/image/covers/SiloedCovers.kt | 39 ++++++++-------- .../main/java/org/oxycblt/musikr/Config.kt | 4 +- .../src/main/java/org/oxycblt/musikr/Music.kt | 4 +- .../musikr/{cover => covers}/Covers.kt | 2 +- .../FolderCovers.kt => covers/fs/FSCovers.kt} | 15 ++++--- .../{cover => covers/internal}/CoverFormat.kt | 20 +-------- .../internal}/CoverIdentifier.kt | 2 +- .../{cover => covers/internal}/CoverParams.kt | 2 +- .../internal/InternalCovers.kt} | 22 ++++++---- .../musikr/fs/app/{AppFiles.kt => AppFS.kt} | 8 ++-- .../fs/device/{DeviceFiles.kt => DeviceFS.kt} | 27 ++++++++++-- .../oxycblt/musikr/fs/device/DeviceFile.kt | 44 ------------------- .../org/oxycblt/musikr/model/AlbumImpl.kt | 2 +- .../org/oxycblt/musikr/model/ArtistImpl.kt | 2 +- .../org/oxycblt/musikr/model/GenreImpl.kt | 2 +- .../org/oxycblt/musikr/model/PlaylistImpl.kt | 2 +- .../oxycblt/musikr/pipeline/ExploreStep.kt | 14 +++--- .../oxycblt/musikr/pipeline/ExtractStep.kt | 6 +-- .../oxycblt/musikr/pipeline/PipelineItem.kt | 4 +- .../oxycblt/musikr/tag/interpret/PreMusic.kt | 2 +- 29 files changed, 118 insertions(+), 148 deletions(-) rename musikr/src/main/java/org/oxycblt/musikr/{cover => covers}/Covers.kt (99%) rename musikr/src/main/java/org/oxycblt/musikr/{cover/FolderCovers.kt => covers/fs/FSCovers.kt} (90%) rename musikr/src/main/java/org/oxycblt/musikr/{cover => covers/internal}/CoverFormat.kt (71%) rename musikr/src/main/java/org/oxycblt/musikr/{cover => covers/internal}/CoverIdentifier.kt (96%) rename musikr/src/main/java/org/oxycblt/musikr/{cover => covers/internal}/CoverParams.kt (96%) rename musikr/src/main/java/org/oxycblt/musikr/{cover/FileCovers.kt => covers/internal/InternalCovers.kt} (75%) rename musikr/src/main/java/org/oxycblt/musikr/fs/app/{AppFiles.kt => AppFS.kt} (95%) rename musikr/src/main/java/org/oxycblt/musikr/fs/device/{DeviceFiles.kt => DeviceFS.kt} (89%) delete mode 100644 musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFile.kt diff --git a/app/src/main/java/org/oxycblt/auxio/image/CoverProvider.kt b/app/src/main/java/org/oxycblt/auxio/image/CoverProvider.kt index 5c5bd78d3..160267804 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/CoverProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/CoverProvider.kt @@ -28,7 +28,7 @@ import android.os.ParcelFileDescriptor import kotlinx.coroutines.runBlocking import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.image.covers.SettingCovers -import org.oxycblt.musikr.cover.CoverResult +import org.oxycblt.musikr.covers.CoverResult class CoverProvider() : ContentProvider() { override fun onCreate(): Boolean = true diff --git a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt index 03f731618..bab90cbe6 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/CoverView.kt @@ -64,7 +64,7 @@ import org.oxycblt.musikr.Artist import org.oxycblt.musikr.Genre import org.oxycblt.musikr.Playlist import org.oxycblt.musikr.Song -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection /** * Auxio's extension of [ImageView] that enables cover art loading and playing indicator and diff --git a/app/src/main/java/org/oxycblt/auxio/image/coil/CoverCollectionFetcher.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/CoverCollectionFetcher.kt index 147721fbb..a6bc9475d 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/coil/CoverCollectionFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/coil/CoverCollectionFetcher.kt @@ -46,7 +46,7 @@ import kotlinx.coroutines.withContext import okio.FileSystem import okio.buffer import okio.source -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection class CoverCollectionFetcher private constructor( diff --git a/app/src/main/java/org/oxycblt/auxio/image/coil/CoverFetcher.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/CoverFetcher.kt index 29bbb430b..4c0ed0c5c 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/coil/CoverFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/coil/CoverFetcher.kt @@ -40,7 +40,7 @@ import javax.inject.Inject import okio.FileSystem import okio.buffer import okio.source -import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.covers.Cover class CoverFetcher private constructor(private val context: Context, private val cover: Cover) : Fetcher { diff --git a/app/src/main/java/org/oxycblt/auxio/image/coil/Keyers.kt b/app/src/main/java/org/oxycblt/auxio/image/coil/Keyers.kt index 614b1bdf1..cd90be0f8 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/coil/Keyers.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/coil/Keyers.kt @@ -21,8 +21,8 @@ package org.oxycblt.auxio.image.coil import coil3.key.Keyer import coil3.request.Options import javax.inject.Inject -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverCollection class CoverKeyer @Inject constructor() : Keyer { override fun key(data: Cover, options: Options) = "${data.id}&${options.size}" diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/CoverModule.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/CoverModule.kt index 48f5d1052..67ed6b406 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/CoverModule.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/CoverModule.kt @@ -23,7 +23,7 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import org.oxycblt.musikr.cover.CoverIdentifier +import org.oxycblt.musikr.covers.internal.CoverIdentifier @Module @InstallIn(SingletonComponent::class) diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/CoverSilo.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/CoverSilo.kt index 9bd93874d..06456f190 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/CoverSilo.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/CoverSilo.kt @@ -19,7 +19,7 @@ package org.oxycblt.auxio.image.covers import java.util.UUID -import org.oxycblt.musikr.cover.CoverParams +import org.oxycblt.musikr.covers.internal.CoverParams data class CoverSilo(val revision: UUID, val params: CoverParams?) { override fun toString() = diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/NullCovers.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/NullCovers.kt index cffa626d1..079ed5f6c 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/NullCovers.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/NullCovers.kt @@ -19,9 +19,9 @@ package org.oxycblt.auxio.image.covers import android.content.Context -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverResult -import org.oxycblt.musikr.cover.MutableCovers +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.MutableCovers import org.oxycblt.musikr.fs.device.DeviceFile import org.oxycblt.musikr.metadata.Metadata diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt index e00cfdc2f..1deaae968 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/SettingCovers.kt @@ -23,21 +23,21 @@ import java.util.UUID import javax.inject.Inject import org.oxycblt.auxio.image.CoverMode import org.oxycblt.auxio.image.ImageSettings -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverIdentifier -import org.oxycblt.musikr.cover.CoverParams -import org.oxycblt.musikr.cover.Covers -import org.oxycblt.musikr.cover.FileCover -import org.oxycblt.musikr.cover.FolderCovers -import org.oxycblt.musikr.cover.MutableCovers -import org.oxycblt.musikr.cover.MutableFolderCovers +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.internal.CoverIdentifier +import org.oxycblt.musikr.covers.internal.CoverParams +import org.oxycblt.musikr.covers.Covers +import org.oxycblt.musikr.covers.internal.FileCover +import org.oxycblt.musikr.covers.fs.FSCovers +import org.oxycblt.musikr.covers.MutableCovers +import org.oxycblt.musikr.covers.fs.MutableFSCovers interface SettingCovers { suspend fun mutate(context: Context, revision: UUID): MutableCovers companion object { fun immutable(context: Context): Covers = - Covers.chain(BaseSiloedCovers(context), FolderCovers(context)) + Covers.chain(BaseSiloedCovers(context), FSCovers(context)) } } @@ -57,5 +57,6 @@ constructor(private val imageSettings: ImageSettings, private val identifier: Co private suspend fun siloedCovers(context: Context, revision: UUID, with: CoverParams?) = MutableCovers.chain( MutableSiloedCovers.from(context, CoverSilo(revision, with), identifier), - MutableFolderCovers(context)) + MutableFSCovers(context) + ) } diff --git a/app/src/main/java/org/oxycblt/auxio/image/covers/SiloedCovers.kt b/app/src/main/java/org/oxycblt/auxio/image/covers/SiloedCovers.kt index 856239698..08a89f7da 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/covers/SiloedCovers.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/covers/SiloedCovers.kt @@ -22,16 +22,16 @@ import android.content.Context import java.io.File import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverFormat -import org.oxycblt.musikr.cover.CoverIdentifier -import org.oxycblt.musikr.cover.CoverResult -import org.oxycblt.musikr.cover.Covers -import org.oxycblt.musikr.cover.FileCover -import org.oxycblt.musikr.cover.FileCovers -import org.oxycblt.musikr.cover.MutableCovers -import org.oxycblt.musikr.cover.MutableFileCovers -import org.oxycblt.musikr.fs.app.AppFiles +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.internal.CoverFormat +import org.oxycblt.musikr.covers.internal.CoverIdentifier +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.Covers +import org.oxycblt.musikr.covers.internal.FileCover +import org.oxycblt.musikr.covers.internal.InternalCovers +import org.oxycblt.musikr.covers.MutableCovers +import org.oxycblt.musikr.covers.internal.MutableInternalCovers +import org.oxycblt.musikr.fs.app.AppFS import org.oxycblt.musikr.fs.device.DeviceFile import org.oxycblt.musikr.metadata.Metadata @@ -39,20 +39,20 @@ class BaseSiloedCovers(private val context: Context) : Covers { override suspend fun obtain(id: String): CoverResult { val siloedId = SiloedCoverId.parse(id) ?: return CoverResult.Miss() val core = SiloCore.from(context, siloedId.silo) - val fileCovers = FileCovers(core.files, core.format) - return when (val result = fileCovers.obtain(siloedId.id)) { + val internalCovers = InternalCovers(core.files, core.format) + return when (val result = internalCovers.obtain(siloedId.id)) { is CoverResult.Hit -> CoverResult.Hit(SiloedCover(siloedId.silo, result.cover)) is CoverResult.Miss -> CoverResult.Miss() } } } -open class SiloedCovers(private val silo: CoverSilo, private val fileCovers: FileCovers) : +open class SiloedCovers(private val silo: CoverSilo, private val internalCovers: InternalCovers) : Covers { override suspend fun obtain(id: String): CoverResult { val coverId = SiloedCoverId.parse(id) ?: return CoverResult.Miss() if (silo != coverId.silo) return CoverResult.Miss() - return when (val result = fileCovers.obtain(coverId.id)) { + return when (val result = internalCovers.obtain(coverId.id)) { is CoverResult.Hit -> CoverResult.Hit(SiloedCover(silo, result.cover)) is CoverResult.Miss -> CoverResult.Miss() } @@ -61,7 +61,7 @@ open class SiloedCovers(private val silo: CoverSilo, private val fileCovers: Fil companion object { suspend fun from(context: Context, silo: CoverSilo): SiloedCovers { val core = SiloCore.from(context, silo) - return SiloedCovers(silo, FileCovers(core.files, core.format)) + return SiloedCovers(silo, InternalCovers(core.files, core.format)) } } } @@ -70,7 +70,7 @@ class MutableSiloedCovers private constructor( private val rootDir: File, private val silo: CoverSilo, - private val fileCovers: MutableFileCovers + private val fileCovers: MutableInternalCovers ) : SiloedCovers(silo, fileCovers), MutableCovers { override suspend fun create(file: DeviceFile, metadata: Metadata): CoverResult = when (val result = fileCovers.create(file, metadata)) { @@ -96,7 +96,8 @@ private constructor( ): MutableSiloedCovers { val core = SiloCore.from(context, silo) return MutableSiloedCovers( - core.rootDir, silo, MutableFileCovers(core.files, core.format, coverIdentifier)) + core.rootDir, silo, MutableInternalCovers(core.files, core.format, coverIdentifier) + ) } } } @@ -120,7 +121,7 @@ data class SiloedCoverId(val silo: CoverSilo, val id: String) { } } -private data class SiloCore(val rootDir: File, val files: AppFiles, val format: CoverFormat) { +private data class SiloCore(val rootDir: File, val files: AppFS, val format: CoverFormat) { companion object { suspend fun from(context: Context, silo: CoverSilo): SiloCore { val rootDir: File @@ -129,7 +130,7 @@ private data class SiloCore(val rootDir: File, val files: AppFiles, val format: rootDir = context.coversDir() revisionDir = rootDir.resolve(silo.toString()).apply { mkdirs() } } - val files = AppFiles.at(revisionDir) + val files = AppFS.at(revisionDir) val format = silo.params?.let(CoverFormat::jpeg) ?: CoverFormat.asIs() return SiloCore(rootDir, files, format) } diff --git a/musikr/src/main/java/org/oxycblt/musikr/Config.kt b/musikr/src/main/java/org/oxycblt/musikr/Config.kt index 3d699f2d0..df51be932 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/Config.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/Config.kt @@ -19,8 +19,8 @@ package org.oxycblt.musikr import org.oxycblt.musikr.cache.MutableCache -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.MutableCovers +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.MutableCovers import org.oxycblt.musikr.playlist.db.StoredPlaylists import org.oxycblt.musikr.tag.interpret.Naming import org.oxycblt.musikr.tag.interpret.Separators diff --git a/musikr/src/main/java/org/oxycblt/musikr/Music.kt b/musikr/src/main/java/org/oxycblt/musikr/Music.kt index 5ae85f2d2..507103898 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/Music.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/Music.kt @@ -25,8 +25,8 @@ import java.security.MessageDigest import java.util.UUID import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverCollection import org.oxycblt.musikr.fs.Format import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.tag.Date diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/Covers.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/Covers.kt similarity index 99% rename from musikr/src/main/java/org/oxycblt/musikr/cover/Covers.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/Covers.kt index 902bce5c5..b1e266673 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/Covers.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/Covers.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers import java.io.InputStream import org.oxycblt.musikr.fs.device.DeviceFile diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/FolderCovers.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/fs/FSCovers.kt similarity index 90% rename from musikr/src/main/java/org/oxycblt/musikr/cover/FolderCovers.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/fs/FSCovers.kt index ad5383482..229b5b673 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/FolderCovers.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/fs/FSCovers.kt @@ -1,6 +1,6 @@ /* * Copyright (c) 2025 Auxio Project - * FolderCovers.kt is part of Auxio. + * FSCovers.kt is part of Auxio. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers.fs import android.content.Context import android.net.Uri @@ -26,11 +26,16 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.withContext +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.Covers +import org.oxycblt.musikr.covers.MutableCovers +import org.oxycblt.musikr.covers.internal.FileCover import org.oxycblt.musikr.fs.device.DeviceDirectory import org.oxycblt.musikr.fs.device.DeviceFile import org.oxycblt.musikr.metadata.Metadata -open class FolderCovers(private val context: Context) : Covers { +open class FSCovers(private val context: Context) : Covers { override suspend fun obtain(id: String): CoverResult { // Parse the ID to get the directory URI if (!id.startsWith("folder:")) { @@ -60,8 +65,8 @@ open class FolderCovers(private val context: Context) : Covers { } } -class MutableFolderCovers(private val context: Context) : - FolderCovers(context), MutableCovers { +class MutableFSCovers(private val context: Context) : + FSCovers(context), MutableCovers { override suspend fun create(file: DeviceFile, metadata: Metadata): CoverResult { val parent = file.parent val coverFile = findCoverInDirectory(parent) ?: return CoverResult.Miss() diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverFormat.kt similarity index 71% rename from musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverFormat.kt index 16af47506..292f8ff3e 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverFormat.kt @@ -1,22 +1,4 @@ -/* - * Copyright (c) 2024 Auxio Project - * CoverFormat.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers.internal import android.graphics.Bitmap import android.graphics.BitmapFactory diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverIdentifier.kt similarity index 96% rename from musikr/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverIdentifier.kt index ef0917e05..a187d0d9e 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverIdentifier.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers.internal import java.security.MessageDigest diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverParams.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverParams.kt similarity index 96% rename from musikr/src/main/java/org/oxycblt/musikr/cover/CoverParams.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverParams.kt index 1b26dc63f..c7bc9a98e 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/CoverParams.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/CoverParams.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers.internal class CoverParams private constructor(val resolution: Int, val quality: Int) { override fun hashCode() = 31 * resolution + quality diff --git a/musikr/src/main/java/org/oxycblt/musikr/cover/FileCovers.kt b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/InternalCovers.kt similarity index 75% rename from musikr/src/main/java/org/oxycblt/musikr/cover/FileCovers.kt rename to musikr/src/main/java/org/oxycblt/musikr/covers/internal/InternalCovers.kt index aadafad1d..9d641a1d3 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/cover/FileCovers.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/covers/internal/InternalCovers.kt @@ -16,18 +16,22 @@ * along with this program. If not, see . */ -package org.oxycblt.musikr.cover +package org.oxycblt.musikr.covers.internal import android.os.ParcelFileDescriptor +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.Covers +import org.oxycblt.musikr.covers.MutableCovers import org.oxycblt.musikr.fs.app.AppFile -import org.oxycblt.musikr.fs.app.AppFiles +import org.oxycblt.musikr.fs.app.AppFS import org.oxycblt.musikr.fs.device.DeviceFile import org.oxycblt.musikr.metadata.Metadata -open class FileCovers(private val appFiles: AppFiles, private val coverFormat: CoverFormat) : +open class InternalCovers(private val appFS: AppFS, private val coverFormat: CoverFormat) : Covers { override suspend fun obtain(id: String): CoverResult { - val file = appFiles.find(getFileName(id)) + val file = appFS.find(getFileName(id)) return if (file != null) { CoverResult.Hit(FileCoverImpl(id, file)) } else { @@ -38,21 +42,21 @@ open class FileCovers(private val appFiles: AppFiles, private val coverFormat: C protected fun getFileName(id: String) = "$id.${coverFormat.extension}" } -class MutableFileCovers( - private val appFiles: AppFiles, +class MutableInternalCovers( + private val appFS: AppFS, private val coverFormat: CoverFormat, private val coverIdentifier: CoverIdentifier -) : FileCovers(appFiles, coverFormat), MutableCovers { +) : InternalCovers(appFS, coverFormat), MutableCovers { override suspend fun create(file: DeviceFile, metadata: Metadata): CoverResult { val data = metadata.cover ?: return CoverResult.Miss() val id = coverIdentifier.identify(data) - val coverFile = appFiles.write(getFileName(id)) { coverFormat.transcodeInto(data, it) } + val coverFile = appFS.write(getFileName(id)) { coverFormat.transcodeInto(data, it) } return CoverResult.Hit(FileCoverImpl(id, coverFile)) } override suspend fun cleanup(excluding: Collection) { val used = excluding.mapTo(mutableSetOf()) { getFileName(it.id) } - appFiles.deleteWhere { it !in used } + appFS.deleteWhere { it !in used } } } diff --git a/musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFiles.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFS.kt similarity index 95% rename from musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFiles.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFS.kt index 9c8f2a407..77de81796 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFiles.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/fs/app/AppFS.kt @@ -28,7 +28,7 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext -interface AppFiles { +interface AppFS { suspend fun find(name: String): AppFile? suspend fun write(name: String, block: suspend (OutputStream) -> Unit): AppFile @@ -36,9 +36,9 @@ interface AppFiles { suspend fun deleteWhere(block: (String) -> Boolean) companion object { - suspend fun at(dir: File): AppFiles { + suspend fun at(dir: File): AppFS { withContext(Dispatchers.IO) { check(dir.exists() && dir.isDirectory) } - return AppFilesImpl(dir) + return AppFSImpl(dir) } } } @@ -49,7 +49,7 @@ interface AppFile { suspend fun open(): InputStream? } -private class AppFilesImpl(private val dir: File) : AppFiles { +private class AppFSImpl(private val dir: File) : AppFS { private val fileMutexes = mutableMapOf() private val mapMutex = Mutex() diff --git a/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFiles.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFS.kt similarity index 89% rename from musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFiles.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFS.kt index 2ba57558d..99a9bd8f3 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFiles.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFS.kt @@ -30,16 +30,37 @@ import kotlinx.coroutines.flow.flow import org.oxycblt.musikr.fs.MusicLocation import org.oxycblt.musikr.fs.Path -internal interface DeviceFiles { +internal interface DeviceFS { fun explore(locations: Flow, ignoreHidden: Boolean = true): Flow companion object { - fun from(context: Context): DeviceFiles = DeviceFilesImpl(context.contentResolverSafe) + fun from(context: Context): DeviceFS = DeviceFSImpl(context.contentResolverSafe) } } +sealed interface DeviceNode { + val uri: Uri + val path: Path +} + +data class DeviceDirectory( + override val uri: Uri, + override val path: Path, + val parent: DeviceDirectory?, + var children: Flow +) : DeviceNode + +data class DeviceFile( + override val uri: Uri, + override val path: Path, + val modifiedMs: Long, + val mimeType: String, + val size: Long, + val parent: DeviceDirectory +) : DeviceNode + @OptIn(ExperimentalCoroutinesApi::class) -private class DeviceFilesImpl(private val contentResolver: ContentResolver) : DeviceFiles { +private class DeviceFSImpl(private val contentResolver: ContentResolver) : DeviceFS { override fun explore(locations: Flow, ignoreHidden: Boolean): Flow = locations.flatMapMerge { location -> // Create a root directory for each location diff --git a/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFile.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFile.kt deleted file mode 100644 index 6590491a6..000000000 --- a/musikr/src/main/java/org/oxycblt/musikr/fs/device/DeviceFile.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2024 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 . - */ - -package org.oxycblt.musikr.fs.device - -import android.net.Uri -import kotlinx.coroutines.flow.Flow -import org.oxycblt.musikr.fs.Path - -sealed interface DeviceNode { - val uri: Uri - val path: Path -} - -data class DeviceDirectory( - override val uri: Uri, - override val path: Path, - val parent: DeviceDirectory?, - var children: Flow -) : DeviceNode - -data class DeviceFile( - override val uri: Uri, - override val path: Path, - val modifiedMs: Long, - val mimeType: String, - val size: Long, - val parent: DeviceDirectory -) : DeviceNode diff --git a/musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt index 6031569b8..c4225d9f4 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt @@ -22,7 +22,7 @@ import org.oxycblt.musikr.Album import org.oxycblt.musikr.Artist import org.oxycblt.musikr.Music import org.oxycblt.musikr.Song -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection import org.oxycblt.musikr.tag.Date import org.oxycblt.musikr.tag.interpret.PreAlbum import org.oxycblt.musikr.util.update diff --git a/musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt index e05740401..e2820a0bb 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt @@ -23,7 +23,7 @@ import org.oxycblt.musikr.Artist import org.oxycblt.musikr.Genre import org.oxycblt.musikr.Music import org.oxycblt.musikr.Song -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection import org.oxycblt.musikr.tag.interpret.PreArtist import org.oxycblt.musikr.util.update diff --git a/musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt index 0805f284b..18d7858d3 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt @@ -22,7 +22,7 @@ import org.oxycblt.musikr.Artist import org.oxycblt.musikr.Genre import org.oxycblt.musikr.Music import org.oxycblt.musikr.Song -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection import org.oxycblt.musikr.tag.interpret.PreGenre import org.oxycblt.musikr.util.update diff --git a/musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt index a92197df5..1837f9967 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt @@ -20,7 +20,7 @@ package org.oxycblt.musikr.model import org.oxycblt.musikr.Playlist import org.oxycblt.musikr.Song -import org.oxycblt.musikr.cover.CoverCollection +import org.oxycblt.musikr.covers.CoverCollection import org.oxycblt.musikr.playlist.interpret.PrePlaylistInfo import org.oxycblt.musikr.tag.Name diff --git a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt index 5a27017a6..7866a6d6f 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt @@ -33,13 +33,13 @@ import kotlinx.coroutines.flow.merge import org.oxycblt.musikr.Storage import org.oxycblt.musikr.cache.Cache import org.oxycblt.musikr.cache.CacheResult -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverResult -import org.oxycblt.musikr.cover.Covers +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.Covers import org.oxycblt.musikr.fs.MusicLocation import org.oxycblt.musikr.fs.device.DeviceDirectory import org.oxycblt.musikr.fs.device.DeviceFile -import org.oxycblt.musikr.fs.device.DeviceFiles +import org.oxycblt.musikr.fs.device.DeviceFS import org.oxycblt.musikr.fs.device.DeviceNode import org.oxycblt.musikr.playlist.db.StoredPlaylists import org.oxycblt.musikr.playlist.m3u.M3U @@ -50,12 +50,12 @@ internal interface ExploreStep { companion object { fun from(context: Context, storage: Storage): ExploreStep = ExploreStepImpl( - DeviceFiles.from(context), storage.cache, storage.covers, storage.storedPlaylists) + DeviceFS.from(context), storage.cache, storage.covers, storage.storedPlaylists) } } private class ExploreStepImpl( - private val deviceFiles: DeviceFiles, + private val deviceFS: DeviceFS, private val cache: Cache, private val covers: Covers, private val storedPlaylists: StoredPlaylists @@ -64,7 +64,7 @@ private class ExploreStepImpl( override fun explore(locations: List): Flow { val addingMs = System.currentTimeMillis() return merge( - deviceFiles + deviceFS .explore(locations.asFlow()) .flattenFilter { it.mimeType.startsWith("audio/") || it.mimeType == M3U.MIME_TYPE } .distribute(8) diff --git a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt index 3d8cc9407..c6d347577 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt @@ -26,9 +26,9 @@ import kotlinx.coroutines.flow.onCompletion import org.oxycblt.musikr.Storage import org.oxycblt.musikr.cache.CachedSong import org.oxycblt.musikr.cache.MutableCache -import org.oxycblt.musikr.cover.Cover -import org.oxycblt.musikr.cover.CoverResult -import org.oxycblt.musikr.cover.MutableCovers +import org.oxycblt.musikr.covers.Cover +import org.oxycblt.musikr.covers.CoverResult +import org.oxycblt.musikr.covers.MutableCovers import org.oxycblt.musikr.metadata.MetadataExtractor import org.oxycblt.musikr.tag.parse.TagParser diff --git a/musikr/src/main/java/org/oxycblt/musikr/pipeline/PipelineItem.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/PipelineItem.kt index bd4ef2753..20cf30221 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/pipeline/PipelineItem.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/pipeline/PipelineItem.kt @@ -18,7 +18,7 @@ package org.oxycblt.musikr.pipeline -import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.covers.Cover import org.oxycblt.musikr.fs.device.DeviceFile import org.oxycblt.musikr.metadata.Properties import org.oxycblt.musikr.playlist.PlaylistFile @@ -44,7 +44,7 @@ internal sealed interface Extracted : PipelineItem { sealed interface Invalid : Extracted } -data object InvalidSong : Extracted.Invalid +internal data object InvalidSong : Extracted.Invalid internal data class RawPlaylist(val file: PlaylistFile) : Explored.Known, Extracted.Valid diff --git a/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt index 3c744d51e..62f6f3689 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt @@ -21,7 +21,7 @@ package org.oxycblt.musikr.tag.interpret import android.net.Uri import java.util.UUID import org.oxycblt.musikr.Music -import org.oxycblt.musikr.cover.Cover +import org.oxycblt.musikr.covers.Cover import org.oxycblt.musikr.fs.Format import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.tag.Date