mirror of
https://github.com/owenlejeune/TVTime.git
synced 2025-11-08 04:32:43 -05:00
preliminary work for credit details
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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}")
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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?
|
||||
)
|
||||
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user