2021-04-30 17:20:15 +00:00
|
|
|
package com.lagradost.cloudstream3.ui.home
|
|
|
|
|
2021-07-30 21:03:46 +00:00
|
|
|
import android.content.Context
|
2021-04-30 17:20:15 +00:00
|
|
|
import androidx.lifecycle.LiveData
|
|
|
|
import androidx.lifecycle.MutableLiveData
|
|
|
|
import androidx.lifecycle.ViewModel
|
2021-07-29 00:19:42 +00:00
|
|
|
import androidx.lifecycle.viewModelScope
|
|
|
|
import com.lagradost.cloudstream3.APIHolder.apis
|
|
|
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
|
|
|
import com.lagradost.cloudstream3.HomePageResponse
|
2021-07-29 15:16:08 +00:00
|
|
|
import com.lagradost.cloudstream3.MainAPI
|
2021-07-30 21:03:46 +00:00
|
|
|
import com.lagradost.cloudstream3.SearchResponse
|
2021-07-29 00:19:42 +00:00
|
|
|
import com.lagradost.cloudstream3.mvvm.Resource
|
|
|
|
import com.lagradost.cloudstream3.ui.APIRepository
|
2021-07-30 21:03:46 +00:00
|
|
|
import com.lagradost.cloudstream3.ui.WatchType
|
2021-08-25 15:28:25 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
|
|
|
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllResumeStateIds
|
2021-07-30 21:03:46 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllWatchStateIds
|
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getBookmarkedData
|
2021-08-25 15:28:25 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getLastWatched
|
2021-07-30 21:03:46 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState
|
2021-08-25 15:28:25 +00:00
|
|
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
|
|
|
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
2021-07-30 21:03:46 +00:00
|
|
|
import kotlinx.coroutines.Dispatchers
|
2021-08-25 15:28:25 +00:00
|
|
|
import kotlinx.coroutines.Job
|
2021-07-29 00:19:42 +00:00
|
|
|
import kotlinx.coroutines.launch
|
2021-07-30 21:03:46 +00:00
|
|
|
import kotlinx.coroutines.withContext
|
2021-04-30 17:20:15 +00:00
|
|
|
|
|
|
|
class HomeViewModel : ViewModel() {
|
2021-07-29 00:19:42 +00:00
|
|
|
var repo: APIRepository? = null
|
2021-04-30 17:20:15 +00:00
|
|
|
|
2021-07-29 00:19:42 +00:00
|
|
|
private val _apiName = MutableLiveData<String>()
|
|
|
|
val apiName: LiveData<String> = _apiName
|
|
|
|
|
|
|
|
private val _page = MutableLiveData<Resource<HomePageResponse>>()
|
|
|
|
val page: LiveData<Resource<HomePageResponse>> = _page
|
|
|
|
|
|
|
|
private fun autoloadRepo(): APIRepository {
|
|
|
|
return APIRepository(apis.first { it.hasMainPage })
|
|
|
|
}
|
|
|
|
|
2021-07-30 23:41:54 +00:00
|
|
|
private val _availableWatchStatusTypes = MutableLiveData<Pair<WatchType, List<WatchType>>>()
|
|
|
|
val availableWatchStatusTypes: LiveData<Pair<WatchType, List<WatchType>>> = _availableWatchStatusTypes
|
|
|
|
private val _bookmarks = MutableLiveData<List<SearchResponse>>()
|
|
|
|
val bookmarks: LiveData<List<SearchResponse>> = _bookmarks
|
2021-07-30 21:03:46 +00:00
|
|
|
|
2021-08-25 15:28:25 +00:00
|
|
|
private val _resumeWatching = MutableLiveData<List<SearchResponse>>()
|
|
|
|
val resumeWatching: LiveData<List<SearchResponse>> = _resumeWatching
|
|
|
|
|
|
|
|
fun loadResumeWatching(context: Context) = viewModelScope.launch {
|
|
|
|
val resumeWatching = withContext(Dispatchers.IO) {
|
|
|
|
context.getAllResumeStateIds().mapNotNull { id ->
|
|
|
|
context.getLastWatched(id)
|
|
|
|
}.sortedBy { -it.updateTime }
|
|
|
|
}
|
|
|
|
|
|
|
|
// val resumeWatchingResult = ArrayList<DataStoreHelper.ResumeWatchingResult>()
|
|
|
|
|
|
|
|
val resumeWatchingResult = withContext(Dispatchers.IO) {
|
|
|
|
resumeWatching.map { resume ->
|
|
|
|
val data = context.getKey<VideoDownloadHelper.DownloadHeaderCached>(
|
|
|
|
DOWNLOAD_HEADER_CACHE,
|
|
|
|
resume.parentId.toString()
|
|
|
|
) ?: return@map null
|
|
|
|
val watchPos = context.getViewPos(resume.episodeId)
|
|
|
|
DataStoreHelper.ResumeWatchingResult(
|
|
|
|
data.name,
|
|
|
|
data.url,
|
|
|
|
data.apiName,
|
|
|
|
data.type,
|
|
|
|
data.poster,
|
|
|
|
watchPos,
|
|
|
|
resume.episodeId,
|
|
|
|
resume.parentId,
|
|
|
|
resume.episode,
|
|
|
|
resume.season,
|
|
|
|
resume.isFromDownload
|
|
|
|
)
|
|
|
|
}.filterNotNull()
|
|
|
|
}
|
|
|
|
|
|
|
|
_resumeWatching.postValue(resumeWatchingResult)
|
|
|
|
}
|
|
|
|
|
2021-07-30 21:03:46 +00:00
|
|
|
fun loadStoredData(context: Context, preferredWatchStatus: WatchType?) = viewModelScope.launch {
|
|
|
|
val watchStatusIds = withContext(Dispatchers.IO) {
|
|
|
|
context.getAllWatchStateIds().map { id ->
|
|
|
|
Pair(id, context.getResultWatchState(id))
|
|
|
|
}
|
2021-07-30 23:41:54 +00:00
|
|
|
}.distinctBy { it.first }
|
2021-07-30 21:03:46 +00:00
|
|
|
val length = WatchType.values().size
|
|
|
|
val currentWatchTypes = HashSet<WatchType>()
|
|
|
|
|
|
|
|
for (watch in watchStatusIds) {
|
|
|
|
currentWatchTypes.add(watch.second)
|
|
|
|
if (currentWatchTypes.size >= length) {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-30 23:41:54 +00:00
|
|
|
currentWatchTypes.remove(WatchType.NONE)
|
|
|
|
|
2021-07-30 21:03:46 +00:00
|
|
|
if (currentWatchTypes.size <= 0) {
|
2021-07-30 23:41:54 +00:00
|
|
|
_bookmarks.postValue(ArrayList())
|
2021-07-30 21:03:46 +00:00
|
|
|
return@launch
|
|
|
|
}
|
|
|
|
|
2021-07-30 23:41:54 +00:00
|
|
|
val watchPrefNotNull = preferredWatchStatus ?: currentWatchTypes.first()
|
|
|
|
val watchStatus =
|
|
|
|
if (currentWatchTypes.contains(watchPrefNotNull)) watchPrefNotNull else currentWatchTypes.first()
|
|
|
|
_availableWatchStatusTypes.postValue(
|
2021-07-30 21:03:46 +00:00
|
|
|
Pair(
|
|
|
|
watchStatus,
|
|
|
|
currentWatchTypes.sortedBy { it.internalId }.toList()
|
|
|
|
)
|
|
|
|
)
|
|
|
|
val list = withContext(Dispatchers.IO) {
|
2021-07-30 23:41:54 +00:00
|
|
|
watchStatusIds.filter { it.second == watchStatus }
|
|
|
|
.mapNotNull { context.getBookmarkedData(it.first) }
|
|
|
|
.sortedBy { -it.latestUpdatedTime }
|
2021-07-30 21:03:46 +00:00
|
|
|
}
|
2021-07-30 23:41:54 +00:00
|
|
|
_bookmarks.postValue(list)
|
2021-07-30 21:03:46 +00:00
|
|
|
}
|
|
|
|
|
2021-08-25 15:28:25 +00:00
|
|
|
var onGoingLoad: Job? = null
|
|
|
|
fun loadAndCancel(api: MainAPI?) {
|
|
|
|
onGoingLoad?.cancel()
|
|
|
|
onGoingLoad = load(api)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun load(api: MainAPI?) = viewModelScope.launch {
|
2021-07-29 00:19:42 +00:00
|
|
|
repo = if (api?.hasMainPage == true) {
|
|
|
|
APIRepository(api)
|
|
|
|
} else {
|
|
|
|
autoloadRepo()
|
|
|
|
}
|
2021-08-25 15:28:25 +00:00
|
|
|
|
2021-07-29 15:44:16 +00:00
|
|
|
_apiName.postValue(repo?.name)
|
2021-07-29 00:19:42 +00:00
|
|
|
_page.postValue(Resource.Loading())
|
|
|
|
_page.postValue(repo?.getMainPage())
|
2021-04-30 17:20:15 +00:00
|
|
|
}
|
2021-07-29 15:16:08 +00:00
|
|
|
|
2021-08-25 15:28:25 +00:00
|
|
|
fun loadAndCancel(preferredApiName: String?) = viewModelScope.launch {
|
2021-07-29 15:16:08 +00:00
|
|
|
val api = getApiFromNameNull(preferredApiName)
|
2021-08-25 15:28:25 +00:00
|
|
|
loadAndCancel(api)
|
2021-07-29 15:16:08 +00:00
|
|
|
}
|
2021-04-30 17:20:15 +00:00
|
|
|
}
|