From b4daac0814b7050655c37e3841c7b6a54f7e7795 Mon Sep 17 00:00:00 2001 From: Jannik Date: Sun, 2 Jan 2022 17:51:45 +0100 Subject: [PATCH] replace tmdb multi search with type search (movie/tv) multi search often retuns a wrong result, therfore use movie or tv show search --- .../activity/main/fragments/MediaFragment.kt | 2 +- .../main/viewmodel/MediaFragmentViewModel.kt | 22 ++++-- .../teapod/util/tmdb/TMDBApiController.kt | 28 ++++++-- .../mosad/teapod/util/tmdb/TMDBDataTypes.kt | 70 ++++++++++--------- 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt index d524067..fdfb693 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/fragments/MediaFragment.kt @@ -155,7 +155,7 @@ class MediaFragment(private val mediaIdStr: String, mediaCr: Item = NoneItem) : } } else -> { - println("else") + binding.textEpisodesOrRuntime.visibility = View.GONE } } diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt index d8eb5c1..c431956 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/main/viewmodel/MediaFragmentViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.launch import kotlinx.serialization.ExperimentalSerializationApi import org.mosad.teapod.parser.crunchyroll.* import org.mosad.teapod.preferences.Preferences +import org.mosad.teapod.util.DataTypes.MediaType import org.mosad.teapod.util.Meta import org.mosad.teapod.util.tmdb.* @@ -29,6 +30,8 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic internal set val currentEpisodesCrunchy = arrayListOf() // used for EpisodeItemAdapter (easier updates) + var mediaType = MediaType.OTHER + internal set var tmdbResult: TMDBResult = NoneTMDB // TODO rename internal set var tmdbTVSeason: TMDBTVSeason = NoneTMDBTVSeason @@ -59,6 +62,11 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic currentEpisodesCrunchy.addAll(episodesCrunchy.items) println("episodes: $episodesCrunchy") + // set media type + mediaType = episodesCrunchy.items.firstOrNull()?.let { + if (it.episodeNumber != null) MediaType.TVSHOW else MediaType.MOVIE + } ?: MediaType.OTHER + // TODO check if metaDB knows the title mediaMeta = null // set mediaMeta to null, if metaDB doesn't know the media @@ -94,15 +102,17 @@ class MediaFragmentViewModel(application: Application) : AndroidViewModel(applic suspend fun loadTmdbInfo() { val tmdbApiController = TMDBApiController() - val tmdbSearchResult = tmdbApiController.searchMulti(seriesCrunchy.title) + val tmdbSearchResult = when(mediaType) { + MediaType.MOVIE -> tmdbApiController.searchMovie(seriesCrunchy.title) + MediaType.TVSHOW -> tmdbApiController.searchTVShow(seriesCrunchy.title) + else -> NoneTMDBSearch + } println(tmdbSearchResult) tmdbResult = if (tmdbSearchResult.results.isNotEmpty()) { - val result = tmdbSearchResult.results.first() - - when (result.mediaType) { - "movie" -> tmdbApiController.getMovieDetails(result.id) - "tv" -> tmdbApiController.getTVShowDetails(result.id) + when (val result = tmdbSearchResult.results.first()) { + is TMDBSearchResultMovie -> tmdbApiController.getMovieDetails(result.id) + is TMDBSearchResultTVShow -> tmdbApiController.getTVShowDetails(result.id) else -> NoneTMDB } } else NoneTMDB diff --git a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt index 5d6f76c..b084e85 100644 --- a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt +++ b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBApiController.kt @@ -69,19 +69,35 @@ class TMDBApiController { } /** - * Search for a media(movie or tv show) in tmdb - * @param query The query text - * @return A TMDBSearch object, or NoneTMDBSearch if nothing was found + * Search for a movie in tmdb + * @param query The query text (movie title) + * @return A TMDBSearch object, or + * NoneTMDBSearchMovie if nothing was found */ - @ExperimentalSerializationApi - suspend fun searchMulti(query: String): TMDBSearch { + suspend fun searchMovie(query: String): TMDBSearch { val searchEndpoint = "/search/multi" val parameters = listOf("query" to query, "include_adult" to false) val result = request(searchEndpoint, parameters) return result.component1()?.obj()?.let { json.decodeFromString(it.toString()) - } ?: NoneTMDBSearch + } ?: NoneTMDBSearchMovie + } + + /** + * Search for a tv show in tmdb + * @param query The query text (tv show title) + * @return A TMDBSearch object, or + * NoneTMDBSearchTVShow if nothing was found + */ + suspend fun searchTVShow(query: String): TMDBSearch { + val searchEndpoint = "/search/tv" + val parameters = listOf("query" to query, "include_adult" to false) + + val result = request(searchEndpoint, parameters) + return result.component1()?.obj()?.let { + json.decodeFromString(it.toString()) + } ?: NoneTMDBSearchTVShow } /** diff --git a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt index 9e9c073..10171e3 100644 --- a/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/tmdb/TMDBDataTypes.kt @@ -22,38 +22,8 @@ package org.mosad.teapod.util.tmdb -import android.os.Build -import androidx.annotation.RequiresApi -import kotlinx.serialization.* -import kotlinx.serialization.json.JsonNames -import java.text.DateFormat -import java.time.LocalDate -import java.util.* - -/** - * New TMDB API data classes - */ - -@ExperimentalSerializationApi -@Serializable -data class TMDBSearch( - val page: Int, - val results: List -) - -@ExperimentalSerializationApi -@Serializable -data class TMDBSearchResult( - @SerialName("id") val id: Int, - @SerialName("media_type") val mediaType: String, - @JsonNames("name", "title") val name: String, // tv show = name, movie = title - @SerialName("overview") val overview: String?, - @SerialName("poster_path") val posterPath: String?, - @SerialName("backdrop_path") val backdropPath: String?, -) - -@ExperimentalSerializationApi -val NoneTMDBSearch = TMDBSearch(0, emptyList()) +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** * These data classes represent the tmdb api json objects. @@ -76,6 +46,42 @@ data class TMDBBase( override val backdropPath: String? ) : TMDBResult +/** + * search results for movie and tv show + */ + +@Serializable +data class TMDBSearch( + val page: Int, + val results: List +) + +@Serializable +data class TMDBSearchResultMovie( + @SerialName("id") override val id: Int, + @SerialName("title") override val name: String, + @SerialName("overview") override val overview: String?, + @SerialName("poster_path") override val posterPath: String?, + @SerialName("backdrop_path") override val backdropPath: String?, +) : TMDBResult + +@Serializable +data class TMDBSearchResultTVShow( + @SerialName("id") override val id: Int, + @SerialName("name") override val name: String, + @SerialName("overview") override val overview: String?, + @SerialName("poster_path") override val posterPath: String?, + @SerialName("backdrop_path") override val backdropPath: String?, +) : TMDBResult + +val NoneTMDBSearch = TMDBSearch(0, emptyList()) +val NoneTMDBSearchMovie = TMDBSearch(0, emptyList()) +val NoneTMDBSearchTVShow = TMDBSearch(0, emptyList()) + +/** + * detail return data types + */ + @Serializable data class TMDBMovie( @SerialName("id") override val id: Int,