mirror of
https://github.com/owenlejeune/TVTime.git
synced 2025-11-19 18:21:19 -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.AccountApi
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationApi
|
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.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.MoviesApi
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleApi
|
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleApi
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchApi
|
import com.owenlejeune.tvtime.api.tmdb.api.v3.SearchApi
|
||||||
@@ -67,6 +68,10 @@ class TmdbClient: KoinComponent {
|
|||||||
return client.create(ConfigurationApi::class.java)
|
return client.create(ConfigurationApi::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createCreditsService(): CreditsApi {
|
||||||
|
return client.create(CreditsApi::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
fun createV4AccountService(): AccountV4Api {
|
fun createV4AccountService(): AccountV4Api {
|
||||||
return clientV4.create(AccountV4Api::class.java)
|
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.AccountService
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.AuthenticationService
|
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.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.MoviesService
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.PeopleService
|
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.SearchService
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.TvService
|
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.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.DetailCastDeserializer
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.DetailCrewDeserializer
|
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.KnownForDeserializer
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.deserializer.SortableSearchResultDeserializer
|
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.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.DetailCast
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCrew
|
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailCrew
|
||||||
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownFor
|
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.KnownFor
|
||||||
@@ -52,6 +55,7 @@ val networkModule = module {
|
|||||||
single { get<TmdbClient>().createSearchService() }
|
single { get<TmdbClient>().createSearchService() }
|
||||||
single { get<TmdbClient>().createTvService() }
|
single { get<TmdbClient>().createTvService() }
|
||||||
single { get<TmdbClient>().createConfigurationService() }
|
single { get<TmdbClient>().createConfigurationService() }
|
||||||
|
single { get<TmdbClient>().createCreditsService() }
|
||||||
|
|
||||||
single { ConfigurationService() }
|
single { ConfigurationService() }
|
||||||
single { MoviesService() }
|
single { MoviesService() }
|
||||||
@@ -60,6 +64,7 @@ val networkModule = module {
|
|||||||
single { AuthenticationService() }
|
single { AuthenticationService() }
|
||||||
single { PeopleService() }
|
single { PeopleService() }
|
||||||
single { SearchService() }
|
single { SearchService() }
|
||||||
|
single { CreditsService() }
|
||||||
single { AccountV4Service() }
|
single { AccountV4Service() }
|
||||||
single { AuthenticationV4Service() }
|
single { AuthenticationV4Service() }
|
||||||
single { ListV4Service() }
|
single { ListV4Service() }
|
||||||
@@ -72,6 +77,7 @@ val networkModule = module {
|
|||||||
AccountStates::class.java to AccountStatesDeserializer(),
|
AccountStates::class.java to AccountStatesDeserializer(),
|
||||||
DetailCast::class.java to DetailCastDeserializer(),
|
DetailCast::class.java to DetailCastDeserializer(),
|
||||||
DetailCrew::class.java to DetailCrewDeserializer(),
|
DetailCrew::class.java to DetailCrewDeserializer(),
|
||||||
|
CreditMedia::class.java to CreditMediaDeserializer(),
|
||||||
Date::class.java to DateTypeAdapter()
|
Date::class.java to DateTypeAdapter()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user