mirror of
https://github.com/FluxaMedia/fluxa.git
synced 2026-08-06 16:59:44 +00:00
Fetch home bootstrap catalog rows concurrently
readHomeBootstrap awaited each addon catalog request sequentially, causing 7-8s cold-start latency with multiple addons/genres. Applies the same async/Semaphore(8)/awaitAll fan-out already used by runDiscover for genre switches.
This commit is contained in:
parent
13da42567f
commit
f47ddfa01c
1 changed files with 28 additions and 23 deletions
|
|
@ -579,7 +579,7 @@ class FluxaAndroidHeadlessEnvironment @Inject constructor(
|
|||
return ok(effect, value)
|
||||
}
|
||||
|
||||
private suspend fun readHomeBootstrap(effect: NativeHeadlessEffect): HeadlessEffectCompletion {
|
||||
private suspend fun readHomeBootstrap(effect: NativeHeadlessEffect): HeadlessEffectCompletion = coroutineScope {
|
||||
val profile = effect.payload.profile()
|
||||
profile?.id?.let(watchlistManager::setActiveProfile)
|
||||
val addons = addonRepository.getUserAddons(profile?.authKey.orEmpty(), profile?.safeLocalAddons.orEmpty())
|
||||
|
|
@ -590,29 +590,34 @@ class FluxaAndroidHeadlessEnvironment @Inject constructor(
|
|||
val selectedKeys = effectiveHomeMetadataFeedSelection(profile?.homeFeedToggles, availableKeys)
|
||||
feeds.filter { isMetadataFeedEnabled(selectedKeys, it.key) }
|
||||
}
|
||||
val categories = metadataFeeds.mapNotNull { feed ->
|
||||
val items = runCatching {
|
||||
addonRepository.getAddonCatalog(
|
||||
transportUrl = feed.transportUrl,
|
||||
type = feed.type,
|
||||
id = feed.id,
|
||||
genre = feed.genre
|
||||
)
|
||||
}.getOrDefault(emptyList())
|
||||
if (items.isEmpty()) null else {
|
||||
HomeCategory(
|
||||
name = feed.label,
|
||||
semanticName = feed.label,
|
||||
items = items,
|
||||
id = feed.key,
|
||||
type = feed.type,
|
||||
catalogId = feed.id,
|
||||
addonTransportUrl = feed.transportUrl,
|
||||
addonGenre = feed.genre
|
||||
)
|
||||
val semaphore = Semaphore(8)
|
||||
val categories = metadataFeeds.map { feed ->
|
||||
async {
|
||||
val items = semaphore.withPermit {
|
||||
runCatching {
|
||||
addonRepository.getAddonCatalog(
|
||||
transportUrl = feed.transportUrl,
|
||||
type = feed.type,
|
||||
id = feed.id,
|
||||
genre = feed.genre
|
||||
)
|
||||
}.getOrDefault(emptyList())
|
||||
}
|
||||
if (items.isEmpty()) null else {
|
||||
HomeCategory(
|
||||
name = feed.label,
|
||||
semanticName = feed.label,
|
||||
items = items,
|
||||
id = feed.key,
|
||||
type = feed.type,
|
||||
catalogId = feed.id,
|
||||
addonTransportUrl = feed.transportUrl,
|
||||
addonGenre = feed.genre
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
return ok(
|
||||
}.awaitAll().filterNotNull()
|
||||
ok(
|
||||
effect,
|
||||
mapOf(
|
||||
"categories" to categories,
|
||||
|
|
|
|||
Loading…
Reference in a new issue