add more info to rated media types

This commit is contained in:
Owen LeJeune
2022-03-02 10:43:14 -05:00
parent 36c7555b56
commit 3d7314b44d
9 changed files with 117 additions and 48 deletions

View File

@@ -1,6 +1,9 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.RatedEpisode
import com.owenlejeune.tvtime.api.tmdb.model.RatedMediaResponse import com.owenlejeune.tvtime.api.tmdb.model.RatedMediaResponse
import com.owenlejeune.tvtime.api.tmdb.model.RatedMovie
import com.owenlejeune.tvtime.api.tmdb.model.RatedTv
import retrofit2.Response import retrofit2.Response
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Path import retrofit2.http.Path
@@ -8,12 +11,12 @@ import retrofit2.http.Path
interface GuestSessionApi { interface GuestSessionApi {
@GET("guest_session/{session_id}/rated/movies") @GET("guest_session/{session_id}/rated/movies")
suspend fun getRatedMovies(@Path("session_id") sessionId: String): Response<RatedMediaResponse> suspend fun getRatedMovies(@Path("session_id") sessionId: String): Response<RatedMediaResponse<RatedMovie>>
@GET("guest_session/{session_id}/rated/tv") @GET("guest_session/{session_id}/rated/tv")
suspend fun getRatedTvShows(@Path("session_id") sessionId: String): Response<RatedMediaResponse> suspend fun getRatedTvShows(@Path("session_id") sessionId: String): Response<RatedMediaResponse<RatedTv>>
@GET("guest_session/{session_id}/rated/tv/episodes") @GET("guest_session/{session_id}/rated/tv/episodes")
suspend fun getRatedTvEpisodes(@Path("session_id") sessionId: String): Response<RatedMediaResponse> suspend fun getRatedTvEpisodes(@Path("session_id") sessionId: String): Response<RatedMediaResponse<RatedEpisode>>
} }

View File

@@ -1,29 +1,22 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb
import com.owenlejeune.tvtime.api.tmdb.model.RatedMedia import com.owenlejeune.tvtime.api.tmdb.model.*
import com.owenlejeune.tvtime.api.tmdb.model.RatedMediaResponse
import retrofit2.Response import retrofit2.Response
class GuestSessionService { class GuestSessionService {
private val service by lazy { TmdbClient().createGuestSessionService() } private val service by lazy { TmdbClient().createGuestSessionService() }
suspend fun getRatedMovies(sessionId: String): Response<RatedMediaResponse> { suspend fun getRatedMovies(sessionId: String): Response<RatedMediaResponse<RatedMovie>> {
return service.getRatedMovies(sessionId = sessionId).apply { return service.getRatedMovies(sessionId = sessionId)
body()?.results?.forEach { it.type = RatedMedia.Type.MOVIE }
}
} }
suspend fun getRatedTvShows(sessionId: String): Response<RatedMediaResponse> { suspend fun getRatedTvShows(sessionId: String): Response<RatedMediaResponse<RatedTv>> {
return service.getRatedTvShows(sessionId = sessionId).apply { return service.getRatedTvShows(sessionId = sessionId)
body()?.results?.forEach { it.type = RatedMedia.Type.SERIES }
}
} }
suspend fun getRatedTvEpisodes(sessionId: String): Response<RatedMediaResponse> { suspend fun getRatedTvEpisodes(sessionId: String): Response<RatedMediaResponse<RatedEpisode>> {
return service.getRatedTvEpisodes(sessionId = sessionId).apply { return service.getRatedTvEpisodes(sessionId = sessionId)
body()?.results?.forEach { it.type = RatedMedia.Type.EPISODE }
}
} }
} }

View File

@@ -0,0 +1,19 @@
package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName
class RatedEpisode(
type: RatedType,
id: Int,
overview: String,
name: String,
voteAverage: Float,
voteCount: Int,
rating: Float,
@SerializedName("air_date") val airDate: String,
@SerializedName("episode_number") val episodeNumber: Int,
@SerializedName("production_code") val productionCode: String?,
@SerializedName("season_number") val seasonNumber: Int,
@SerializedName("show_id") val showId: Int,
@SerializedName("still_path") val stillPath: String?,
): RatedMedia(RatedType.EPISODE, id, overview, name, voteAverage, voteCount, rating)

View File

@@ -2,33 +2,18 @@ package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
class RatedMedia( abstract class RatedMedia(
@SerializedName("name", alternate = ["title"]) val title: String, var type: RatedType,
@SerializedName("id") val id: Int, @SerializedName("id") val id: Int,
@SerializedName("poster_path") val posterPath: String?,
@SerializedName("backdrop_path") val backdropPath: String?,
@SerializedName("release_date", alternate = ["first_air_date", "air_date"]) val releaseDate: String,
@SerializedName("rating") val rating: Float,
@SerializedName("genre_ids") val genreIds: List<Int>,
@SerializedName("original_language") val originalLanguage: String,
@SerializedName("original_title") val originalTitle: String,
@SerializedName("overview") val overview: String, @SerializedName("overview") val overview: String,
@SerializedName("popularity") val popularity: Float, @SerializedName("name", alternate = ["title"]) val name: String,
@SerializedName("vote_average") val voteAverage: Float, @SerializedName("vote_average") val voteAverage: Float,
@SerializedName("vote_count") val voteCount: Int, @SerializedName("vote_count") val voteCount: Int,
// only for movies @SerializedName("rating") val rating: Float
@SerializedName("adult") val isAdult: Boolean?,
@SerializedName("video") val isVideo: Boolean?,
// only for tv
@SerializedName("origin_country") val originCountries: List<String>?,
var type: Type
) { ) {
enum class RatedType {
enum class Type {
MOVIE, MOVIE,
SERIES, SERIES,
EPISODE EPISODE
} }
} }

View File

@@ -2,9 +2,9 @@ package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
class RatedMediaResponse( class RatedMediaResponse<T: RatedMedia>(
@SerializedName("page") val page: Int, @SerializedName("page") val page: Int,
@SerializedName("results") val results: List<RatedMedia>, @SerializedName("results") val results: List<T>,
@SerializedName("total_pages") val totalPages: Int, @SerializedName("total_pages") val totalPages: Int,
@SerializedName("total_results") val totalResults: Int @SerializedName("total_results") val totalResults: Int
) )

View File

@@ -0,0 +1,24 @@
package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName
class RatedMovie(
id: Int,
overview: String,
name: String,
voteAverage: Float,
voteCount: Int,
rating: Float,
backdropPath: String?,
genreIds: List<Int>,
originalLanguage: String,
originalName: String,
posterPath: String?,
popularity: Float,
@SerializedName("adult") val isAdult: Boolean,
@SerializedName("release_date") val releaseDate: String,
@SerializedName("video") val video: Boolean,
): RatedTopLevelMedia(
RatedType.MOVIE, id, overview, name, voteAverage, voteCount, rating,
backdropPath, genreIds, originalLanguage, originalName, posterPath, popularity
)

View File

@@ -0,0 +1,19 @@
package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName
abstract class RatedTopLevelMedia(
type: RatedType,
id: Int,
overview: String,
name: String,
voteAverage: Float,
voteCount: Int,
rating: Float,
@SerializedName("backdrop_path") val backdropPath: String?,
@SerializedName("genre_ids") val genreIds: List<Int>,
@SerializedName("original_language") val originalLanguage: String,
@SerializedName("original_name", alternate = ["original_title"]) val originalName: String,
@SerializedName("poster_path") val posterPath: String?,
@SerializedName("popularity") val popularity: Float,
): RatedMedia(type, id, overview, name, voteAverage, voteCount, rating)

View File

@@ -0,0 +1,23 @@
package com.owenlejeune.tvtime.api.tmdb.model
import com.google.gson.annotations.SerializedName
class RatedTv(
id: Int,
overview: String,
name: String,
voteAverage: Float,
voteCount: Int,
rating: Float,
backdropPath: String?,
genreIds: List<Int>,
originalLanguage: String,
originalName: String,
posterPath: String?,
popularity: Float,
@SerializedName("first_air_date") val firstAirDate: String,
@SerializedName("origin_country") val originCountry: List<String>,
): RatedTopLevelMedia(
RatedType.SERIES, id, overview, name, voteAverage, voteCount, rating,
backdropPath, genreIds, originalLanguage, originalName, posterPath, popularity
)

View File

@@ -2,7 +2,10 @@ package com.owenlejeune.tvtime.utils
import com.owenlejeune.tvtime.api.tmdb.GuestSessionApi import com.owenlejeune.tvtime.api.tmdb.GuestSessionApi
import com.owenlejeune.tvtime.api.tmdb.TmdbClient import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.model.RatedEpisode
import com.owenlejeune.tvtime.api.tmdb.model.RatedMedia import com.owenlejeune.tvtime.api.tmdb.model.RatedMedia
import com.owenlejeune.tvtime.api.tmdb.model.RatedMovie
import com.owenlejeune.tvtime.api.tmdb.model.RatedTv
import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.preferences.AppPreferences
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -39,16 +42,16 @@ object SessionManager: KoinComponent {
} }
abstract class Session(val sessionId: String, val isGuest: Boolean) { abstract class Session(val sessionId: String, val isGuest: Boolean) {
protected abstract var _ratedMovies: List<RatedMedia> protected abstract var _ratedMovies: List<RatedMovie>
val ratedMovies: List<RatedMedia> val ratedMovies: List<RatedMovie>
get() = _ratedMovies get() = _ratedMovies
protected abstract var _ratedTvShows: List<RatedMedia> protected abstract var _ratedTvShows: List<RatedTv>
val ratedTvShows: List<RatedMedia> val ratedTvShows: List<RatedTv>
get() = _ratedTvShows get() = _ratedTvShows
protected abstract var _ratedTvEpisodes: List<RatedMedia> protected abstract var _ratedTvEpisodes: List<RatedEpisode>
val ratedTvEpisodes: List<RatedMedia> val ratedTvEpisodes: List<RatedEpisode>
get() = _ratedTvEpisodes get() = _ratedTvEpisodes
fun hasRatedMovie(id: Int): Boolean { fun hasRatedMovie(id: Int): Boolean {
@@ -69,9 +72,9 @@ object SessionManager: KoinComponent {
} }
private class GuestSession: Session(preferences.guestSessionId, true) { private class GuestSession: Session(preferences.guestSessionId, true) {
override var _ratedMovies: List<RatedMedia> = emptyList() override var _ratedMovies: List<RatedMovie> = emptyList()
override var _ratedTvEpisodes: List<RatedMedia> = emptyList() override var _ratedTvShows: List<RatedTv> = emptyList()
override var _ratedTvShows: List<RatedMedia> = emptyList() override var _ratedTvEpisodes: List<RatedEpisode> = emptyList()
private lateinit var service: GuestSessionApi private lateinit var service: GuestSessionApi