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
import com.owenlejeune.tvtime.api.tmdb.model.RatedEpisode
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.http.GET
import retrofit2.http.Path
@@ -8,12 +11,12 @@ import retrofit2.http.Path
interface GuestSessionApi {
@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")
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")
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
import com.owenlejeune.tvtime.api.tmdb.model.RatedMedia
import com.owenlejeune.tvtime.api.tmdb.model.RatedMediaResponse
import com.owenlejeune.tvtime.api.tmdb.model.*
import retrofit2.Response
class GuestSessionService {
private val service by lazy { TmdbClient().createGuestSessionService() }
suspend fun getRatedMovies(sessionId: String): Response<RatedMediaResponse> {
return service.getRatedMovies(sessionId = sessionId).apply {
body()?.results?.forEach { it.type = RatedMedia.Type.MOVIE }
}
suspend fun getRatedMovies(sessionId: String): Response<RatedMediaResponse<RatedMovie>> {
return service.getRatedMovies(sessionId = sessionId)
}
suspend fun getRatedTvShows(sessionId: String): Response<RatedMediaResponse> {
return service.getRatedTvShows(sessionId = sessionId).apply {
body()?.results?.forEach { it.type = RatedMedia.Type.SERIES }
}
suspend fun getRatedTvShows(sessionId: String): Response<RatedMediaResponse<RatedTv>> {
return service.getRatedTvShows(sessionId = sessionId)
}
suspend fun getRatedTvEpisodes(sessionId: String): Response<RatedMediaResponse> {
return service.getRatedTvEpisodes(sessionId = sessionId).apply {
body()?.results?.forEach { it.type = RatedMedia.Type.EPISODE }
}
suspend fun getRatedTvEpisodes(sessionId: String): Response<RatedMediaResponse<RatedEpisode>> {
return service.getRatedTvEpisodes(sessionId = sessionId)
}
}

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
class RatedMedia(
@SerializedName("name", alternate = ["title"]) val title: String,
abstract class RatedMedia(
var type: RatedType,
@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("popularity") val popularity: Float,
@SerializedName("name", alternate = ["title"]) val name: String,
@SerializedName("vote_average") val voteAverage: Float,
@SerializedName("vote_count") val voteCount: Int,
// only for movies
@SerializedName("adult") val isAdult: Boolean?,
@SerializedName("video") val isVideo: Boolean?,
// only for tv
@SerializedName("origin_country") val originCountries: List<String>?,
var type: Type
@SerializedName("rating") val rating: Float
) {
enum class Type {
enum class RatedType {
MOVIE,
SERIES,
EPISODE
}
}

View File

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