feat(debrid): add cache check before publishing stream

This commit is contained in:
tapframe 2026-05-28 23:02:28 +05:30
parent f33a513b1c
commit 2a9f523ccb
3 changed files with 45 additions and 10 deletions

View file

@ -6,6 +6,21 @@ import com.nuvio.app.features.streams.StreamDebridCacheStatus
import com.nuvio.app.features.streams.StreamItem
object LocalDebridAvailabilityService {
fun hasPendingCacheCheck(
groups: List<AddonStreamGroup>,
eligibleGroupIds: Set<String>? = 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<AddonStreamGroup>,
eligibleGroupIds: Set<String>? = null,

View file

@ -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()

View file

@ -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 -> {