preliminary work for credit details

This commit is contained in:
Owen LeJeune
2023-06-27 12:02:34 -04:00
parent edad88a81d
commit 3d3711cee9
6 changed files with 180 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ import com.owenlejeune.tvtime.api.QueryParam
import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.ConfigurationApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.CreditsApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.MoviesApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleApi
import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchApi
@@ -67,6 +68,10 @@ class TmdbClient: KoinComponent {
return client.create(ConfigurationApi::class.java)
}
fun createCreditsService(): CreditsApi {
return client.create(CreditsApi::class.java)
}
fun createV4AccountService(): AccountV4Api {
return clientV4.create(AccountV4Api::class.java)
}

View File

@@ -0,0 +1,12 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditResponse
import retrofit2.Response
import retrofit2.http.GET
interface CreditsApi {
@GET("credit/{id}")
suspend fun getCreditDetails(creditId: String): Response<CreditResponse>
}

View File

@@ -0,0 +1,24 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3
import androidx.compose.runtime.mutableStateMapOf
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditResponse
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.util.Collections
class CreditsService: KoinComponent {
private val creditApi: CreditsApi by inject()
val credits = Collections.synchronizedMap(mutableStateMapOf<String, CreditResponse>())
suspend fun getCredits(creditId: String) {
val response = creditApi.getCreditDetails(creditId)
if (response.isSuccessful) {
response.body()?.let {
credits[creditId] = it
}
}
}
}

View File

@@ -0,0 +1,25 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer
import com.google.gson.JsonObject
import com.google.gson.JsonParseException
import com.owenlejeune.tvtime.api.tmdb.api.BaseDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditMedia
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditMovie
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditTv
import com.owenlejeune.tvtime.utils.types.MediaViewType
class CreditMediaDeserializer: BaseDeserializer<CreditMedia>() {
override fun processJson(obj: JsonObject): CreditMedia {
if (obj.has(MediaViewType.JSON_KEY)) {
val typeStr = obj.get(MediaViewType.JSON_KEY).asString
return when (gson.fromJson(typeStr, MediaViewType::class.java)) {
MediaViewType.MOVIE -> gson.fromJson(obj.toString(), CreditMovie::class.java)
MediaViewType.TV -> gson.fromJson(obj.toString(), CreditTv::class.java)
else -> throw JsonParseException("Not a valid MediaViewType: $typeStr")
}
}
throw JsonParseException("JSON object has no property ${MediaViewType.JSON_KEY}")
}
}

View File

@@ -0,0 +1,108 @@
package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.utils.types.MediaViewType
import java.util.Date
class CreditResponse(
@SerializedName("credit_type") val creditType: String,
@SerializedName("department") val department: String,
@SerializedName("job") val job: String,
@SerializedName("media") val media: CreditMedia,
@SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("id") val id: String,
@SerializedName("person") val person: CreditPerson
)
abstract class CreditMedia(
@SerializedName("adult") val isAdult: Boolean,
@SerializedName("backdrop_path") val backdropPath: String?,
@SerializedName("id") val id: Int,
@SerializedName("title", alternate = ["name"]) val title: String,
@SerializedName("original_language") val originalLanguage: String,
@SerializedName("original_title", alternate = ["original_name"]) val originalTitle: String,
@SerializedName("overview") val overview: String,
@SerializedName("poster_path") val posterPath: String?,
@SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("genre_ids") val genreIds: List<Int>,
@SerializedName("popularity") val popularity: Float,
@SerializedName("release_date", alternate = ["first_air_date"]) val releaseDate: Date,
@SerializedName("vote_average") val voteAverage: Float,
@SerializedName("vote_count") val voteCount: Int,
@SerializedName("character") val character: String
)
class CreditMovie(
isAdult: Boolean,
backdropPath: String?,
id: Int,
title: String,
originalLanguage: String,
originalTitle: String,
overview: String,
posterPath: String?,
genreIds: List<Int>,
popularity: Float,
releaseDate: Date,
voteAverage: Float,
voteCount: Int,
character: String,
@SerializedName("video") val isVideo: Boolean,
): CreditMedia(isAdult, backdropPath, id, title, originalLanguage, originalTitle, overview, posterPath,
MediaViewType.MOVIE, genreIds, popularity, releaseDate, voteAverage, voteCount, character)
class CreditTv(
isAdult: Boolean,
backdropPath: String?,
id: Int,
title: String,
originalLanguage: String,
originalTitle: String,
overview: String,
posterPath: String?,
genreIds: List<Int>,
popularity: Float,
releaseDate: Date,
voteAverage: Float,
voteCount: Int,
character: String,
@SerializedName("origin_country") val originCountry: List<String>,
@SerializedName("episodes") val episodes: List<CreditEpisode>,
@SerializedName("seasons") val seasons: List<CreditSeason>
): CreditMedia(isAdult, backdropPath, id, title, originalLanguage, originalTitle, overview, posterPath,
MediaViewType.TV, genreIds, popularity, releaseDate, voteAverage, voteCount, character)
class CreditEpisode(
@SerializedName("air_date") val airDate: Date,
@SerializedName("episode_number") val episodeNumber: Int,
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String,
@SerializedName("overview") val overview: String,
@SerializedName("production_code") val productionCode: String,
@SerializedName("show_id") val showId: Int,
@SerializedName("still_path") val stillPath: String?,
@SerializedName("vote_average") val voteAverage: Float,
@SerializedName("vote_count") val voteCount: Int
)
class CreditSeason(
@SerializedName("air_date") val airDate: Date,
@SerializedName("episode_count") val episodeCount: Int,
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String,
@SerializedName("overview") val overview: String,
@SerializedName("poster_path") val posterPath: String?,
@SerializedName("season_number") val seasonNumber: Int,
@SerializedName("show_id") val showId: Int
)
class CreditPerson(
@SerializedName("adult") val isAdult: Boolean,
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String,
@SerializedName("original_name") val originalName: String,
@SerializedName("popularity") val popularity: Float,
@SerializedName("gender") val gender: Int, //2 - male
@SerializedName("known_for_department") val knownForDepartment: String,
@SerializedName("profile_path") val profilePath: String?
)

View File

@@ -9,16 +9,19 @@ import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.AccountService
import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationService
import com.owenlejeune.tvtime.api.tmdb.api.v3.ConfigurationService
import com.owenlejeune.tvtime.api.tmdb.api.v3.CreditsService
import com.owenlejeune.tvtime.api.tmdb.api.v3.MoviesService
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService
import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchService
import com.owenlejeune.tvtime.api.tmdb.api.v3.TvService
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.AccountStatesDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.CreditMediaDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.DetailCastDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.DetailCrewDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.KnownForDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.SortableSearchResultDeserializer
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.AccountStates
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.CreditMedia
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCast
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCrew
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownFor
@@ -52,6 +55,7 @@ val networkModule = module {
single { get<TmdbClient>().createSearchService() }
single { get<TmdbClient>().createTvService() }
single { get<TmdbClient>().createConfigurationService() }
single { get<TmdbClient>().createCreditsService() }
single { ConfigurationService() }
single { MoviesService() }
@@ -60,6 +64,7 @@ val networkModule = module {
single { AuthenticationService() }
single { PeopleService() }
single { SearchService() }
single { CreditsService() }
single { AccountV4Service() }
single { AuthenticationV4Service() }
single { ListV4Service() }
@@ -72,6 +77,7 @@ val networkModule = module {
AccountStates::class.java to AccountStatesDeserializer(),
DetailCast::class.java to DetailCastDeserializer(),
DetailCrew::class.java to DetailCrewDeserializer(),
CreditMedia::class.java to CreditMediaDeserializer(),
Date::class.java to DateTypeAdapter()
)
}