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

Commit 6d3df90a authored by /e/ robot's avatar /e/ robot
Browse files

Merge remote-tracking branch 'origin/lineage-22.2' into a15

parents a7771fa4 3026c4d4
Loading
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.
     *
+33 −7
Original line number Diff line number Diff line
@@ -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.
@@ -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 {
@@ -194,7 +190,7 @@ class MediaStoreDataSource(
                            LocalizedString.StringResIdLocalizedString(
                                R.string.activity_random_albums
                            ),
                            it.shuffled(Random(now.dayOfYear)),
                            it.shuffled(),
                        )
                    },
                    artists.map {
@@ -203,7 +199,7 @@ class MediaStoreDataSource(
                            LocalizedString.StringResIdLocalizedString(
                                R.string.activity_random_artists
                            ),
                            it.shuffled(Random(now.dayOfYear)),
                            it.shuffled(),
                        )
                    },
                    genres.map {
@@ -212,7 +208,7 @@ class MediaStoreDataSource(
                            LocalizedString.StringResIdLocalizedString(
                                R.string.activity_random_genres
                            ),
                            it.shuffled(Random(now.dayOfYear)),
                            it.shuffled(),
                        )
                    },
                ).mapNotNull {
@@ -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,
+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