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 org.oxycblt.auxio.music.MusicRepository
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
/**

View file

@ -33,6 +33,7 @@ import org.oxycblt.auxio.playback.replaygain.ReplayGainAdjustment
import org.oxycblt.auxio.util.concatLocalized
import org.oxycblt.auxio.util.toUuidOrNull
import org.oxycblt.musikr.cover.Cover
import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.tag.Date
import org.oxycblt.musikr.tag.Disc

View file

@ -26,21 +26,13 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
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
@InstallIn(SingletonComponent::class)
class FsProvidesModule {
@Provides
fun contentResolver(@ApplicationContext context: Context): ContentResolver =
context.contentResolverSafe
}
@Module
@InstallIn(SingletonComponent::class)
interface FsBindsModule {
@Binds fun deviceFiles(deviceFilesImpl: DeviceFilesImpl): DeviceFiles
interface FsModule {
@Binds
fun musicLocationFactory(
musicLocationFactoryImpl: MusicLocationFactoryImpl

View file

@ -16,7 +16,7 @@
* 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.media.MediaFormat

View file

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

View file

@ -23,7 +23,7 @@ import android.media.MediaExtractor
import android.media.MediaFormat
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import org.oxycblt.musikr.MimeType
import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.Song
import timber.log.Timber as L
@ -119,6 +119,7 @@ constructor(@ApplicationContext private val context: Context) : AudioProperties.
return AudioProperties(
bitrate,
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.guava.await
import kotlinx.coroutines.withContext
import org.oxycblt.musikr.fs.DeviceFile
import org.oxycblt.musikr.fs.query.DeviceFile
interface MetadataExtractor {
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.flowOn
import kotlinx.coroutines.flow.mapNotNull
import org.oxycblt.musikr.fs.DeviceFile
import org.oxycblt.musikr.fs.DeviceFiles
import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.fs.query.DeviceFiles
import org.oxycblt.musikr.fs.MusicLocation
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.map
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.tag.cache.TagCache
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.Path
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 timber.log.Timber as L

View file

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

View file

@ -28,7 +28,7 @@ import androidx.room.Query
import androidx.room.RoomDatabase
import androidx.room.TypeConverter
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.parse.ParsedTags
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.playback.replaygain.ReplayGainAdjustment
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.fs.Path
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.playback.replaygain.ReplayGainAdjustment
import org.oxycblt.auxio.util.toUuidOrNull
import org.oxycblt.musikr.MimeType
import org.oxycblt.musikr.fs.DeviceFile
import org.oxycblt.musikr.fs.MimeType
import org.oxycblt.musikr.fs.query.DeviceFile
import org.oxycblt.musikr.tag.Disc
import org.oxycblt.musikr.tag.Interpretation
import org.oxycblt.musikr.tag.Name

View file

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