diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/LocalDebridAvailabilityService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/LocalDebridAvailabilityService.kt index 227a6d37..b638ce7c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/LocalDebridAvailabilityService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/LocalDebridAvailabilityService.kt @@ -6,6 +6,21 @@ import com.nuvio.app.features.streams.StreamDebridCacheStatus import com.nuvio.app.features.streams.StreamItem object LocalDebridAvailabilityService { + fun hasPendingCacheCheck( + groups: List, + eligibleGroupIds: Set? = null, + ): Boolean { + cacheCheckAccount() ?: return false + return groups + .filter { group -> eligibleGroupIds == null || group.addonId in eligibleGroupIds } + .any { group -> + group.streams.any { stream -> + stream.localAvailabilityHash() != null && + stream.debridCacheStatus?.state !in FINAL_CACHE_STATES + } + } + } + fun markChecking( groups: List, eligibleGroupIds: Set? = null, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerStreamsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerStreamsRepository.kt index 32eeca28..ed69b6dd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerStreamsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerStreamsRepository.kt @@ -271,15 +271,26 @@ object PlayerStreamsRepository { } } - fun launchDebridAvailability(group: AddonStreamGroup) { - if (group.addonId !in installedAddonIds || group.streams.isEmpty()) return + fun publishStreamGroupAfterCacheCheck(group: AddonStreamGroup) { + if (group.addonId !in installedAddonIds || group.streams.isEmpty()) { + publishStreamGroup(presentDebridGroup(group)) + return + } val eligibleGroupIds = setOf(group.addonId) + val shouldWaitForCacheCheck = LocalDebridAvailabilityService.hasPendingCacheCheck( + groups = listOf(group), + eligibleGroupIds = eligibleGroupIds, + ) + if (!shouldWaitForCacheCheck) { + publishStreamGroup(presentDebridGroup(group)) + return + } + val checkingGroup = LocalDebridAvailabilityService.markChecking( groups = listOf(group), eligibleGroupIds = eligibleGroupIds, ).firstOrNull() ?: group - publishStreamGroup(checkingGroup) val availabilityJob = launch { val availabilityGroup = LocalDebridAvailabilityService.annotateCachedAvailability( @@ -360,8 +371,7 @@ object PlayerStreamsRepository { } repeat(jobs.size) { val result = completions.receive() - publishStreamGroup(result) - launchDebridAvailability(result) + publishStreamGroupAfterCacheCheck(result) } for (availabilityJob in debridAvailabilityJobs) { availabilityJob.join() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt index 5fe167d7..1ab2b573 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt @@ -278,15 +278,26 @@ object StreamsRepository { } } - fun launchDebridAvailability(group: AddonStreamGroup) { - if (group.addonId !in installedAddonIds || group.streams.isEmpty()) return + fun publishAddonGroupAfterCacheCheck(group: AddonStreamGroup) { + if (group.addonId !in installedAddonIds || group.streams.isEmpty()) { + publishAddonGroup(presentDebridGroup(group)) + return + } val eligibleGroupIds = setOf(group.addonId) + val shouldWaitForCacheCheck = LocalDebridAvailabilityService.hasPendingCacheCheck( + groups = listOf(group), + eligibleGroupIds = eligibleGroupIds, + ) + if (!shouldWaitForCacheCheck) { + publishAddonGroup(presentDebridGroup(group)) + return + } + val checkingGroup = LocalDebridAvailabilityService.markChecking( groups = listOf(group), eligibleGroupIds = eligibleGroupIds, ).firstOrNull() ?: group - publishAddonGroup(checkingGroup) val availabilityJob = launch { val availabilityGroup = LocalDebridAvailabilityService.annotateCachedAvailability( @@ -481,8 +492,7 @@ object StreamsRepository { when (val completion = completions.receive()) { is StreamLoadCompletion.Addon -> { val result = completion.group - publishAddonGroup(result) - launchDebridAvailability(result) + publishAddonGroupAfterCacheCheck(result) } is StreamLoadCompletion.PluginScraper -> {