musikr: refactor fs

- Move MimeType back into fs
- Move DeviceFiles into a new query module
This commit is contained in:
Alexander Capehart 2024-12-09 08:55:48 -07:00
parent 501c79d23c
commit 0f8294bf43
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
19 changed files with 59 additions and 36 deletions

View file

@ -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.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.query.contentResolverSafe
import timber.log.Timber as L import timber.log.Timber as L
/** /**

View file

@ -33,6 +33,7 @@ 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
import org.oxycblt.musikr.cover.Cover import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.tag.Date import org.oxycblt.musikr.tag.Date
import org.oxycblt.musikr.tag.Disc import org.oxycblt.musikr.tag.Disc

View file

@ -26,21 +26,13 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.oxycblt.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.query.DeviceFiles
import org.oxycblt.musikr.fs.query.DeviceFilesImpl
import org.oxycblt.musikr.fs.query.contentResolverSafe
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
class FsProvidesModule { interface FsModule {
@Provides
fun contentResolver(@ApplicationContext context: Context): ContentResolver =
context.contentResolverSafe
}
@Module
@InstallIn(SingletonComponent::class)
interface FsBindsModule {
@Binds fun deviceFiles(deviceFilesImpl: DeviceFilesImpl): DeviceFiles
@Binds @Binds
fun musicLocationFactory( fun musicLocationFactory(
musicLocationFactoryImpl: MusicLocationFactoryImpl musicLocationFactoryImpl: MusicLocationFactoryImpl

View file

@ -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.musikr package org.oxycblt.musikr.fs
import android.content.Context import android.content.Context
import android.media.MediaFormat import android.media.MediaFormat

View file

@ -25,7 +25,7 @@ import android.provider.DocumentsContract
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.musikr.fs.path.DocumentPathFactory import org.oxycblt.musikr.fs.path.DocumentPathFactory
import org.oxycblt.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.query.contentResolverSafe
class MusicLocation internal constructor(val uri: Uri, val path: Path) { class MusicLocation internal constructor(val uri: Uri, val path: Path) {
override fun equals(other: Any?) = override fun equals(other: Any?) =

View file

@ -28,8 +28,8 @@ import javax.inject.Inject
import org.oxycblt.musikr.fs.Components import org.oxycblt.musikr.fs.Components
import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.fs.Volume import org.oxycblt.musikr.fs.Volume
import org.oxycblt.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.query.contentResolverSafe
import org.oxycblt.musikr.fs.util.useQuery import org.oxycblt.musikr.fs.query.useQuery
/** /**
* A factory for parsing the reverse-engineered format of the URIs obtained from document picker. * A factory for parsing the reverse-engineered format of the URIs obtained from document picker.

View file

@ -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.musikr.fs package org.oxycblt.musikr.fs.query
import android.content.ContentResolver import android.content.ContentResolver
import android.content.Context import android.content.Context
@ -31,8 +31,8 @@ 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.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.MusicLocation
import org.oxycblt.musikr.fs.util.useQuery import org.oxycblt.musikr.fs.Path
interface DeviceFiles { interface DeviceFiles {
fun explore(locations: Flow<MusicLocation>): Flow<DeviceFile> fun explore(locations: Flow<MusicLocation>): Flow<DeviceFile>
@ -68,7 +68,8 @@ class DeviceFilesImpl @Inject constructor(@ApplicationContext private val contex
): Flow<DeviceFile> = flow { ): Flow<DeviceFile> = flow {
contentResolver.useQuery( contentResolver.useQuery(
DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, treeDocumentId), DocumentsContract.buildChildDocumentsUriUsingTree(rootUri, treeDocumentId),
PROJECTION) { cursor -> PROJECTION
) { cursor ->
val childUriIndex = val childUriIndex =
cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_DOCUMENT_ID) cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_DOCUMENT_ID)
val displayNameIndex = val displayNameIndex =
@ -100,7 +101,8 @@ class DeviceFilesImpl @Inject constructor(@ApplicationContext private val contex
mimeType, mimeType,
newPath, newPath,
size, size,
lastModified)) lastModified)
)
} }
} }
emitAll(recursive.asFlow().flattenMerge()) emitAll(recursive.asFlow().flattenMerge())

View file

@ -0,0 +1,27 @@
package org.oxycblt.musikr.fs.query
import android.content.ContentResolver
import android.content.Context
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import org.oxycblt.musikr.fs.MusicLocation
import org.oxycblt.musikr.fs.MusicLocationFactoryImpl
@Module
@InstallIn(SingletonComponent::class)
class QueryProvidesModule {
@Provides
fun contentResolver(@ApplicationContext context: Context): ContentResolver =
context.contentResolverSafe
}
@Module
@InstallIn(SingletonComponent::class)
interface QueryBindsModule {
@Binds
fun deviceFiles(deviceFilesImpl: DeviceFilesImpl): DeviceFiles
}

View file

@ -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.musikr.fs.util package org.oxycblt.musikr.fs.query
import android.content.ContentResolver import android.content.ContentResolver
import android.content.Context import android.content.Context

View file

@ -23,7 +23,7 @@ import android.media.MediaExtractor
import android.media.MediaFormat 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.musikr.MimeType import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.Song import org.oxycblt.musikr.Song
import timber.log.Timber as L import timber.log.Timber as L
@ -119,6 +119,7 @@ constructor(@ApplicationContext private val context: Context) : AudioProperties.
return AudioProperties( return AudioProperties(
bitrate, bitrate,
sampleRate, sampleRate,
MimeType(fromExtension = song.mimeType.fromExtension, fromFormat = formatMimeType)) MimeType(fromExtension = song.mimeType.fromExtension, fromFormat = formatMimeType)
)
} }
} }

View file

@ -28,7 +28,7 @@ import javax.inject.Inject
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.guava.await import kotlinx.coroutines.guava.await
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
interface MetadataExtractor { interface MetadataExtractor {
suspend fun extract(file: DeviceFile): AudioMetadata suspend fun extract(file: DeviceFile): AudioMetadata

View file

@ -24,8 +24,8 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.mapNotNull
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.fs.DeviceFiles import org.oxycblt.musikr.fs.query.DeviceFiles
import org.oxycblt.musikr.fs.MusicLocation import org.oxycblt.musikr.fs.MusicLocation
import org.oxycblt.musikr.playlist.m3u.M3U import org.oxycblt.musikr.playlist.m3u.M3U

View file

@ -27,7 +27,7 @@ import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.metadata.MetadataExtractor import org.oxycblt.musikr.metadata.MetadataExtractor
import org.oxycblt.musikr.tag.cache.TagCache import org.oxycblt.musikr.tag.cache.TagCache
import org.oxycblt.musikr.tag.parse.ParsedTags import org.oxycblt.musikr.tag.parse.ParsedTags

View file

@ -26,7 +26,7 @@ import org.oxycblt.musikr.Playlist
import org.oxycblt.musikr.fs.Components import org.oxycblt.musikr.fs.Components
import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.fs.path.DocumentPathFactory import org.oxycblt.musikr.fs.path.DocumentPathFactory
import org.oxycblt.musikr.fs.util.contentResolverSafe import org.oxycblt.musikr.fs.query.contentResolverSafe
import org.oxycblt.musikr.playlist.m3u.M3U import org.oxycblt.musikr.playlist.m3u.M3U
import timber.log.Timber as L import timber.log.Timber as L

View file

@ -19,7 +19,7 @@
package org.oxycblt.musikr.tag.cache package org.oxycblt.musikr.tag.cache
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.tag.parse.ParsedTags import org.oxycblt.musikr.tag.parse.ParsedTags
interface TagCache { interface TagCache {

View file

@ -28,7 +28,7 @@ import androidx.room.Query
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import androidx.room.TypeConverter import androidx.room.TypeConverter
import androidx.room.TypeConverters import androidx.room.TypeConverters
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.tag.Date import org.oxycblt.musikr.tag.Date
import org.oxycblt.musikr.tag.parse.ParsedTags import org.oxycblt.musikr.tag.parse.ParsedTags
import org.oxycblt.musikr.tag.util.correctWhitespace import org.oxycblt.musikr.tag.util.correctWhitespace

View file

@ -23,7 +23,7 @@ import java.util.UUID
import org.oxycblt.auxio.music.MusicType import org.oxycblt.auxio.music.MusicType
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
import org.oxycblt.musikr.MimeType import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.Music import org.oxycblt.musikr.Music
import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.playlist.PlaylistHandle import org.oxycblt.musikr.playlist.PlaylistHandle

View file

@ -22,8 +22,8 @@ import javax.inject.Inject
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
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
import org.oxycblt.musikr.MimeType import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.tag.Disc import org.oxycblt.musikr.tag.Disc
import org.oxycblt.musikr.tag.Interpretation import org.oxycblt.musikr.tag.Interpretation
import org.oxycblt.musikr.tag.Name import org.oxycblt.musikr.tag.Name

View file

@ -19,7 +19,7 @@
package org.oxycblt.musikr.tag.parse package org.oxycblt.musikr.tag.parse
import javax.inject.Inject import javax.inject.Inject
import org.oxycblt.musikr.fs.DeviceFile import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.metadata.AudioMetadata import org.oxycblt.musikr.metadata.AudioMetadata
interface TagParser { interface TagParser {