teapod/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt

156 lines
5.6 KiB
Kotlin

package org.mosad.teapod.ui.activity.main.viewmodel
import android.app.Application
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import org.mosad.teapod.parser.crunchyroll.*
import org.mosad.teapod.util.*
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.tmdb.TMDBApiController
import org.mosad.teapod.util.tmdb.TMDBResult
import org.mosad.teapod.util.tmdb.TMDBTVSeason
/**
* handle media, next ep and tmdb
* TODO this lives in activity, is this correct?
*/
class MediaFragmentViewModel(application: Application) : AndroidViewModel(application) {
var media = AoDMediaNone
internal set
var nextEpisodeId = -1
internal set
var mediaCrunchy = NoneItem
internal set
var seasonsCrunchy = NoneSeasons
internal set
var episodesCrunchy = NoneEpisodes
internal set
var tmdbResult: TMDBResult? = null // TODO rename
internal set
var tmdbTVSeason: TMDBTVSeason? =null
internal set
var mediaMeta: Meta? = null
internal set
suspend fun loadCrunchy(crunchyId: String) {
val tmdbApiController = TMDBApiController()
println("loading crunchyroll media $crunchyId")
// TODO info also in browse result item
mediaCrunchy = Crunchyroll.browsingCache.find { it ->
it.id == crunchyId
} ?: NoneItem
println("media: $mediaCrunchy")
// load seasons
seasonsCrunchy = Crunchyroll.seasons(crunchyId)
println("seasons: $seasonsCrunchy")
// load first season
// TODO make sure to load the preferred season (language), language is set per season, not per stream
episodesCrunchy = Crunchyroll.episodes(seasonsCrunchy.items.first().id)
println("episodes: $episodesCrunchy")
// TODO check if metaDB knows the title
// use tmdb search to get media info TODO media type is hardcoded, use type info from browse result once implemented
mediaMeta = null // set mediaMeta to null, if metaDB doesn't know the media
val tmdbId = tmdbApiController.search(stripTitleInfo(mediaCrunchy.title), MediaType.TVSHOW)
tmdbResult = when (MediaType.TVSHOW) {
MediaType.MOVIE -> tmdbApiController.getMovieDetails(tmdbId)
MediaType.TVSHOW -> tmdbApiController.getTVShowDetails(tmdbId)
else -> null
}
}
/**
* set media, tmdb and nextEpisode
* TODO run aod and tmdb load parallel
*/
// suspend fun loadAoD(aodId: Int) {
// val tmdbApiController = TMDBApiController()
// media = AoDParser.getMediaById(aodId)
//
// // check if metaDB knows the title
// val tmdbId: Int = if (MetaDBController.mediaList.media.contains(aodId)) {
// // load media info from metaDB
// val metaDB = MetaDBController()
// mediaMeta = when (media.type) {
// MediaType.MOVIE -> metaDB.getMovieMetadata(media.aodId)
// MediaType.TVSHOW -> metaDB.getTVShowMetadata(media.aodId)
// else -> null
// }
//
// mediaMeta?.tmdbId ?: -1
// } else {
// // use tmdb search to get media info
// mediaMeta = null // set mediaMeta to null, if metaDB doesn't know the media
// tmdbApiController.search(stripTitleInfo(media.title), media.type)
// }
//
// tmdbResult = when (media.type) {
// MediaType.MOVIE -> tmdbApiController.getMovieDetails(tmdbId)
// MediaType.TVSHOW -> tmdbApiController.getTVShowDetails(tmdbId)
// else -> null
// }
//
// // get season info, if metaDB knows the tv show
// tmdbTVSeason = if (media.type == MediaType.TVSHOW && mediaMeta != null) {
// val tvShowMeta = mediaMeta as TVShowMeta
// tmdbApiController.getTVSeasonDetails(tvShowMeta.tmdbId, tvShowMeta.tmdbSeasonNumber)
// } else {
// null
// }
//
// if (media.type == MediaType.TVSHOW) {
// //nextEpisode = media.episodes.firstOrNull{ !it.watched } ?: media.episodes.first()
// nextEpisodeId = media.playlist.firstOrNull { !it.watched }?.mediaId
// ?: media.playlist.first().mediaId
// }
// }
/**
* get the next episode based on episodeId
* if no matching is found, use first episode
*/
fun updateNextEpisode(episodeId: Int) {
if (media.type == MediaType.MOVIE) return // return if movie
nextEpisodeId = media.playlist.firstOrNull { it.index > media.getEpisodeById(episodeId).index }?.mediaId
?: media.playlist.first().mediaId
}
// remove unneeded info from the media title before searching
private fun stripTitleInfo(title: String): String {
return title.replace("(Sub)", "")
.replace(Regex("-?\\s?[0-9]+.\\s?(Staffel|Season)"), "")
.replace(Regex("(Staffel|Season)\\s?[0-9]+"), "")
.trim()
}
/** guess Season from title
* if the title ends with a number, that could be the season
* if the title ends with Regex("-?\\s?[0-9]+.\\s?(Staffel|Season)") or
* Regex("(Staffel|Season)\\s?[0-9]+"), that is the season information
*/
private fun guessSeasonFromTitle(title: String): Int {
val helpTitle = title.replace("(Sub)", "").trim()
Log.d("test", "helpTitle: $helpTitle")
return if (helpTitle.last().isDigit()) {
helpTitle.last().digitToInt()
} else {
Regex("([0-9]+.\\s?(Staffel|Season))|((Staffel|Season)\\s?[0-9]+)")
.find(helpTitle)
?.value?.filter { it.isDigit() }?.toInt() ?: 1
}
}
}