@@ -11,6 +11,12 @@ import androidx.media3.common.HeartRating
1111import androidx.media3.common.MediaItem
1212import androidx.media3.common.MediaMetadata
1313import androidx.media3.common.util.UnstableApi
14+ import kotlinx.coroutines.Dispatchers
15+ import kotlinx.coroutines.joinAll
16+ import kotlinx.coroutines.launch
17+ import kotlinx.coroutines.runBlocking
18+ import kotlinx.coroutines.supervisorScope
19+ import kotlinx.coroutines.withContext
1420import org.akanework.gramophone.logic.hasAudioPermission
1521import org.akanework.gramophone.logic.hasImagePermission
1622import org.akanework.gramophone.logic.hasImprovedMediaStore
@@ -42,6 +48,7 @@ import uk.akane.libphonograph.utils.MiscUtils.handleShallowMediaItem
4248import java.io.File
4349import java.time.Instant
4450import java.time.ZoneId
51+ import kotlin.math.min
4552
4653internal object Reader {
4754 // not actually defined in API, but CTS tested
@@ -106,7 +113,7 @@ internal object Reader {
106113 * without much hassle.
107114 */
108115 @OptIn(UnstableApi ::class )
109- fun readFromMediaStore (
116+ suspend fun readFromMediaStore (
110117 context : Context ,
111118 minSongLengthSeconds : Long = 0,
112119 blackListSet : Set <String > = setOf(),
@@ -412,6 +419,20 @@ internal object Reader {
412419 }
413420 }
414421 }?.toList<Album >()
422+ if (! albumList.isNullOrEmpty()) {
423+ supervisorScope {
424+ for (i in 0 .. (albumList.size / 100 )) {
425+ launch {
426+ for (j in (i * 100 ).. < min(i * 100 + 100 , albumList.size)) {
427+ (albumList[j].songList as MutableList ).sortBy {
428+ (it.mediaMetadata.discNumber ? : 0 ) * 1000 +
429+ (it.mediaMetadata.trackNumber ? : 0 )
430+ }
431+ }
432+ }
433+ }
434+ }
435+ }
415436 val artistList = artistMap?.values?.toList()
416437 val albumArtistList = albumArtistMap?.values?.toList()
417438 val genreList = genreMap?.values?.toList()
0 commit comments