Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 5131a690 authored by Sebastiano Barezzi's avatar Sebastiano Barezzi
Browse files

Twelve: MediaDataStore: Add audios method



Co-authored-by: default avatarInhishonor <inhishonor@protonmail.com>
Change-Id: I8a842894ba5d999234bdb22e028daa7d55883ca2
parent 851f87de
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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,
+9 −0
Original line number Diff line number Diff line
@@ -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,
+11 −0
Original line number Diff line number Diff line
@@ -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.
     *
+30 −0
Original line number Diff line number Diff line
@@ -278,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,
+18 −0
Original line number Diff line number Diff line
@@ -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