mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
feat : invalidate link cache after 20 mins (#875)
- additionaly clear cache if there is player errors or no links found Co-authored-by: coxju <coxju>
This commit is contained in:
parent
399b28c75b
commit
ebb72d6a0c
4 changed files with 38 additions and 7 deletions
|
@ -102,6 +102,10 @@ abstract class AbstractPlayerFragment(
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun playerStatusChanged(){
|
||||||
|
throw NotImplementedError()
|
||||||
|
}
|
||||||
|
|
||||||
open fun playerDimensionsLoaded(width: Int, height: Int) {
|
open fun playerDimensionsLoaded(width: Int, height: Int) {
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
@ -431,6 +435,7 @@ abstract class AbstractPlayerFragment(
|
||||||
|
|
||||||
is StatusEvent -> {
|
is StatusEvent -> {
|
||||||
updateIsPlaying(wasPlaying = event.wasPlaying, isPlaying = event.isPlaying)
|
updateIsPlaying(wasPlaying = event.wasPlaying, isPlaying = event.isPlaying)
|
||||||
|
playerStatusChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
is PositionEvent -> {
|
is PositionEvent -> {
|
||||||
|
|
|
@ -146,6 +146,12 @@ class GeneratorPlayer : FullScreenPlayer() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun playerStatusChanged() {
|
||||||
|
if(player.getIsPlaying()){
|
||||||
|
viewModel.forceClearCache = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun noSubtitles(): Boolean {
|
private fun noSubtitles(): Boolean {
|
||||||
return setSubtitles(null)
|
return setSubtitles(null)
|
||||||
}
|
}
|
||||||
|
@ -913,10 +919,15 @@ class GeneratorPlayer : FullScreenPlayer() {
|
||||||
|
|
||||||
override fun playerError(exception: Throwable) {
|
override fun playerError(exception: Throwable) {
|
||||||
Log.i(TAG, "playerError = $currentSelectedLink")
|
Log.i(TAG, "playerError = $currentSelectedLink")
|
||||||
|
if(!hasNextMirror()){
|
||||||
|
viewModel.forceClearCache = true
|
||||||
|
}
|
||||||
super.playerError(exception)
|
super.playerError(exception)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun noLinksFound() {
|
private fun noLinksFound() {
|
||||||
|
viewModel.forceClearCache = true
|
||||||
|
|
||||||
showToast(R.string.no_links_found_toast, Toast.LENGTH_SHORT)
|
showToast(R.string.no_links_found_toast, Toast.LENGTH_SHORT)
|
||||||
activity?.popCurrentPage()
|
activity?.popCurrentPage()
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,8 @@ class PlayerGeneratorViewModel : ViewModel() {
|
||||||
*/
|
*/
|
||||||
private var currentLoadingEpisodeId: Int? = null
|
private var currentLoadingEpisodeId: Int? = null
|
||||||
|
|
||||||
|
var forceClearCache = false
|
||||||
|
|
||||||
fun setSubtitleYear(year: Int?) {
|
fun setSubtitleYear(year: Int?) {
|
||||||
_currentSubtitleYear.postValue(year)
|
_currentSubtitleYear.postValue(year)
|
||||||
}
|
}
|
||||||
|
@ -168,7 +170,7 @@ class PlayerGeneratorViewModel : ViewModel() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadLinks(clearCache: Boolean = false, type: LoadType = LoadType.InApp) {
|
fun loadLinks(type: LoadType = LoadType.InApp) {
|
||||||
Log.i(TAG, "loadLinks")
|
Log.i(TAG, "loadLinks")
|
||||||
currentJob?.cancel()
|
currentJob?.cancel()
|
||||||
|
|
||||||
|
@ -183,7 +185,7 @@ class PlayerGeneratorViewModel : ViewModel() {
|
||||||
// load more data
|
// load more data
|
||||||
_loadingLinks.postValue(Resource.Loading())
|
_loadingLinks.postValue(Resource.Loading())
|
||||||
val loadingState = safeApiCall {
|
val loadingState = safeApiCall {
|
||||||
generator?.generateLinks(type = type, clearCache = clearCache, callback = {
|
generator?.generateLinks(type = type, clearCache = forceClearCache, callback = {
|
||||||
currentLinks.add(it)
|
currentLinks.add(it)
|
||||||
// Clone to prevent ConcurrentModificationException
|
// Clone to prevent ConcurrentModificationException
|
||||||
normalSafeApiCall {
|
normalSafeApiCall {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.ui.player
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
|
import com.lagradost.cloudstream3.APIHolder.unixTime
|
||||||
import com.lagradost.cloudstream3.LoadResponse
|
import com.lagradost.cloudstream3.LoadResponse
|
||||||
import com.lagradost.cloudstream3.ui.APIRepository
|
import com.lagradost.cloudstream3.ui.APIRepository
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||||
|
@ -10,6 +11,12 @@ import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
|
data class Cache(
|
||||||
|
val linkCache: MutableSet<ExtractorLink>,
|
||||||
|
val subtitleCache: MutableSet<SubtitleData>,
|
||||||
|
var lastCachedTimestamp: Long = unixTime
|
||||||
|
)
|
||||||
|
|
||||||
class RepoLinkGenerator(
|
class RepoLinkGenerator(
|
||||||
private val episodes: List<ResultEpisode>,
|
private val episodes: List<ResultEpisode>,
|
||||||
private var currentIndex: Int = 0,
|
private var currentIndex: Int = 0,
|
||||||
|
@ -17,7 +24,7 @@ class RepoLinkGenerator(
|
||||||
) : IGenerator {
|
) : IGenerator {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "RepoLink"
|
const val TAG = "RepoLink"
|
||||||
val cache: HashMap<Pair<String, Int>, Pair<MutableSet<ExtractorLink>, MutableSet<SubtitleData>>> =
|
val cache: HashMap<Pair<String, Int>, Cache> =
|
||||||
hashMapOf()
|
hashMapOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,10 +83,10 @@ class RepoLinkGenerator(
|
||||||
val index = currentIndex
|
val index = currentIndex
|
||||||
val current = episodes.getOrNull(index + offset) ?: return false
|
val current = episodes.getOrNull(index + offset) ?: return false
|
||||||
|
|
||||||
val (currentLinkCache, currentSubsCache) = if (clearCache) {
|
val (currentLinkCache, currentSubsCache, lastCachedTimestamp) = if (clearCache) {
|
||||||
Pair(mutableSetOf(), mutableSetOf())
|
Cache(mutableSetOf(), mutableSetOf(), unixTime)
|
||||||
} else {
|
} else {
|
||||||
cache[current.apiName to current.id] ?: Pair(mutableSetOf(), mutableSetOf())
|
cache[current.apiName to current.id] ?: Cache(mutableSetOf(), mutableSetOf(), unixTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
//val currentLinkCache = if (clearCache) mutableSetOf() else linkCache[index].toMutableSet()
|
//val currentLinkCache = if (clearCache) mutableSetOf() else linkCache[index].toMutableSet()
|
||||||
|
@ -89,6 +96,12 @@ class RepoLinkGenerator(
|
||||||
val currentSubsUrls = mutableSetOf<String>() // makes all subs urls unique
|
val currentSubsUrls = mutableSetOf<String>() // makes all subs urls unique
|
||||||
val currentSubsNames = mutableSetOf<String>() // makes all subs names unique
|
val currentSubsNames = mutableSetOf<String>() // makes all subs names unique
|
||||||
|
|
||||||
|
val invalidateCache = unixTime - lastCachedTimestamp > 60 * 20 // 20 minutes
|
||||||
|
if(invalidateCache){
|
||||||
|
currentLinkCache.clear()
|
||||||
|
currentSubsCache.clear()
|
||||||
|
}
|
||||||
|
|
||||||
currentLinkCache.filter { allowedTypes.contains(it.type) }.forEach { link ->
|
currentLinkCache.filter { allowedTypes.contains(it.type) }.forEach { link ->
|
||||||
currentLinks.add(link.url)
|
currentLinks.add(link.url)
|
||||||
callback(link to null)
|
callback(link to null)
|
||||||
|
@ -147,7 +160,7 @@ class RepoLinkGenerator(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
cache[Pair(current.apiName, current.id)] = Pair(currentLinkCache, currentSubsCache)
|
cache[Pair(current.apiName, current.id)] = Cache(currentLinkCache, currentSubsCache, unixTime)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue