Loading app/src/main/java/org/lineageos/twelve/datasources/FileDataSource.kt +5 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ class FileDataSource( sortingRule: SortingRule, ) = flowOf(Result.Error<List<Artist>, _>(Error.NOT_IMPLEMENTED)) override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = flowOf(Result.Error<List<Audio>, _>(Error.NOT_IMPLEMENTED)) override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading app/src/main/java/org/lineageos/twelve/datasources/JellyfinDataSource.kt +9 −0 Original line number Diff line number Diff line Loading @@ -371,6 +371,15 @@ class JellyfinDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.mapWithInstanceOf(providerIdentifier) { client.getAudios(sortingRule).map { queryResult -> queryResult.items.map { it.toMediaItemAudio() } } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading app/src/main/java/org/lineageos/twelve/datasources/MediaDataSource.kt +11 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,17 @@ interface MediaDataSource { sortingRule: SortingRule, ): Flow<MediaRequestStatus<List<Artist>>> /** * Get all the audios. * * @param providerIdentifier The [ProviderIdentifier] of the provider * @param sortingRule The [SortingRule] to use */ fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ): Flow<MediaRequestStatus<List<Audio>>> /** * Get all the genres. All genres must have at least one audio associated with them. * Loading app/src/main/java/org/lineageos/twelve/datasources/MediaStoreDataSource.kt +33 −7 Original line number Diff line number Diff line Loading @@ -57,8 +57,6 @@ import org.lineageos.twelve.query.like import org.lineageos.twelve.query.neq import org.lineageos.twelve.query.query import org.lineageos.twelve.repositories.ProvidersRepository import java.time.LocalDateTime import kotlin.random.Random /** * [MediaStore.Audio] backed data source. Loading Loading @@ -175,8 +173,6 @@ class MediaStoreDataSource( artists(providerIdentifier, SortingRule(SortingStrategy.NAME)), genres(providerIdentifier, SortingRule(SortingStrategy.NAME)), ) { mostPlayed, albums, artists, genres -> val now = LocalDateTime.now() Result.Success( listOf( mostPlayed.map { Loading @@ -194,7 +190,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_albums ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, artists.map { Loading @@ -203,7 +199,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_artists ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, genres.map { Loading @@ -212,7 +208,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_genres ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, ).mapNotNull { Loading Loading @@ -282,6 +278,36 @@ class MediaStoreDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.flatMapWithInstanceOf(providerIdentifier) { contentResolver.queryFlow( audiosUri, audiosProjection, bundleOf( ContentResolver.QUERY_ARG_SORT_COLUMNS to listOfNotNull( when (sortingRule.strategy) { SortingStrategy.ARTIST_NAME -> MediaStore.Audio.AudioColumns.ARTIST SortingStrategy.CREATION_DATE -> MediaStore.Audio.AudioColumns.YEAR SortingStrategy.NAME -> MediaStore.Audio.AudioColumns.TITLE else -> null }?.let { column -> when (sortingRule.reverse) { true -> "$column DESC" false -> column } }, MediaStore.Audio.AudioColumns.TITLE.takeIf { sortingRule.strategy != SortingStrategy.NAME }, ).toTypedArray(), ) ).mapEachRowToAudio().mapLatest { Result.Success(it) } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading app/src/main/java/org/lineageos/twelve/datasources/SubsonicDataSource.kt +18 −0 Original line number Diff line number Diff line Loading @@ -412,6 +412,24 @@ class SubsonicDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.mapWithInstanceOf(providerIdentifier) { subsonicClient.getRandomSongs(size = 500).map { randomSongs -> randomSongs.song.maybeSortedBy( sortingRule.reverse, when (sortingRule.strategy) { SortingStrategy.ARTIST_NAME -> { child -> child.artist } SortingStrategy.CREATION_DATE -> { child -> child.year } SortingStrategy.NAME -> { child -> child.title } SortingStrategy.PLAY_COUNT -> { child -> child.playCount } else -> null } ).map { it.toMediaItem() } } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule Loading Loading
app/src/main/java/org/lineageos/twelve/datasources/FileDataSource.kt +5 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ class FileDataSource( sortingRule: SortingRule, ) = flowOf(Result.Error<List<Artist>, _>(Error.NOT_IMPLEMENTED)) override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = flowOf(Result.Error<List<Audio>, _>(Error.NOT_IMPLEMENTED)) override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading
app/src/main/java/org/lineageos/twelve/datasources/JellyfinDataSource.kt +9 −0 Original line number Diff line number Diff line Loading @@ -371,6 +371,15 @@ class JellyfinDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.mapWithInstanceOf(providerIdentifier) { client.getAudios(sortingRule).map { queryResult -> queryResult.items.map { it.toMediaItemAudio() } } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading
app/src/main/java/org/lineageos/twelve/datasources/MediaDataSource.kt +11 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,17 @@ interface MediaDataSource { sortingRule: SortingRule, ): Flow<MediaRequestStatus<List<Artist>>> /** * Get all the audios. * * @param providerIdentifier The [ProviderIdentifier] of the provider * @param sortingRule The [SortingRule] to use */ fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ): Flow<MediaRequestStatus<List<Audio>>> /** * Get all the genres. All genres must have at least one audio associated with them. * Loading
app/src/main/java/org/lineageos/twelve/datasources/MediaStoreDataSource.kt +33 −7 Original line number Diff line number Diff line Loading @@ -57,8 +57,6 @@ import org.lineageos.twelve.query.like import org.lineageos.twelve.query.neq import org.lineageos.twelve.query.query import org.lineageos.twelve.repositories.ProvidersRepository import java.time.LocalDateTime import kotlin.random.Random /** * [MediaStore.Audio] backed data source. Loading Loading @@ -175,8 +173,6 @@ class MediaStoreDataSource( artists(providerIdentifier, SortingRule(SortingStrategy.NAME)), genres(providerIdentifier, SortingRule(SortingStrategy.NAME)), ) { mostPlayed, albums, artists, genres -> val now = LocalDateTime.now() Result.Success( listOf( mostPlayed.map { Loading @@ -194,7 +190,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_albums ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, artists.map { Loading @@ -203,7 +199,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_artists ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, genres.map { Loading @@ -212,7 +208,7 @@ class MediaStoreDataSource( LocalizedString.StringResIdLocalizedString( R.string.activity_random_genres ), it.shuffled(Random(now.dayOfYear)), it.shuffled(), ) }, ).mapNotNull { Loading Loading @@ -282,6 +278,36 @@ class MediaStoreDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.flatMapWithInstanceOf(providerIdentifier) { contentResolver.queryFlow( audiosUri, audiosProjection, bundleOf( ContentResolver.QUERY_ARG_SORT_COLUMNS to listOfNotNull( when (sortingRule.strategy) { SortingStrategy.ARTIST_NAME -> MediaStore.Audio.AudioColumns.ARTIST SortingStrategy.CREATION_DATE -> MediaStore.Audio.AudioColumns.YEAR SortingStrategy.NAME -> MediaStore.Audio.AudioColumns.TITLE else -> null }?.let { column -> when (sortingRule.reverse) { true -> "$column DESC" false -> column } }, MediaStore.Audio.AudioColumns.TITLE.takeIf { sortingRule.strategy != SortingStrategy.NAME }, ).toTypedArray(), ) ).mapEachRowToAudio().mapLatest { Result.Success(it) } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, Loading
app/src/main/java/org/lineageos/twelve/datasources/SubsonicDataSource.kt +18 −0 Original line number Diff line number Diff line Loading @@ -412,6 +412,24 @@ class SubsonicDataSource( } } override fun audios( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule, ) = providersManager.mapWithInstanceOf(providerIdentifier) { subsonicClient.getRandomSongs(size = 500).map { randomSongs -> randomSongs.song.maybeSortedBy( sortingRule.reverse, when (sortingRule.strategy) { SortingStrategy.ARTIST_NAME -> { child -> child.artist } SortingStrategy.CREATION_DATE -> { child -> child.year } SortingStrategy.NAME -> { child -> child.title } SortingStrategy.PLAY_COUNT -> { child -> child.playCount } else -> null } ).map { it.toMediaItem() } } } override fun genres( providerIdentifier: ProviderIdentifier, sortingRule: SortingRule Loading