foundation for api v4

This commit is contained in:
Owen LeJeune
2022-03-14 11:29:04 -04:00
parent f74b07102d
commit 4001f2d0ea
124 changed files with 614 additions and 177 deletions

View File

@@ -22,6 +22,7 @@ android {
} }
buildConfigField("String", "TMDB_ApiKey", TMDB_ApiKey) buildConfigField("String", "TMDB_ApiKey", TMDB_ApiKey)
buildConfigField("String", "TMDB_Api_v4Key", TMDB_Api_v4Key)
} }
buildTypes { buildTypes {

View File

@@ -1,12 +1,27 @@
package com.owenlejeune.tvtime.api package com.owenlejeune.tvtime.api
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonDeserializer
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
import kotlin.reflect.KClass
class GsonConverter: Converter, KoinComponent {
private val deserializers: Map<Class<*>, JsonDeserializer<*>> by inject()
class GsonConverter: Converter {
override fun get(): retrofit2.Converter.Factory { override fun get(): retrofit2.Converter.Factory {
val gson = GsonBuilder() // val gson = GsonBuilder()
.create() // .registerTypeAdapter()
// .create()
val builder = GsonBuilder()
deserializers.forEach { deserializer ->
builder.registerTypeAdapter(deserializer.key, deserializer.value)
}
val gson = builder.create()
return GsonConverterFactory.create(gson) return GsonConverterFactory.create(gson)
} }

View File

@@ -4,6 +4,8 @@ import androidx.compose.ui.text.intl.Locale
import com.owenlejeune.tvtime.BuildConfig import com.owenlejeune.tvtime.BuildConfig
import com.owenlejeune.tvtime.api.Client import com.owenlejeune.tvtime.api.Client
import com.owenlejeune.tvtime.api.QueryParam import com.owenlejeune.tvtime.api.QueryParam
import com.owenlejeune.tvtime.api.tmdb.api.v3.*
import com.owenlejeune.tvtime.api.tmdb.api.v4.AuthenticationV4Api
import com.owenlejeune.tvtime.extensions.addQueryParams import com.owenlejeune.tvtime.extensions.addQueryParams
import com.owenlejeune.tvtime.preferences.AppPreferences import com.owenlejeune.tvtime.preferences.AppPreferences
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
@@ -16,14 +18,17 @@ import org.koin.core.parameter.parametersOf
class TmdbClient: KoinComponent { class TmdbClient: KoinComponent {
companion object { companion object {
const val BASE_URL = "https://api.themoviedb.org/3/" const val V_3_BASE_URL = "https://api.themoviedb.org/3/"
const val V_4_BASE_URL = "https://api.themoviedb.org/4/"
} }
private val client: Client by inject { parametersOf(BASE_URL) } private val client: Client by inject { parametersOf(V_3_BASE_URL) }
private val clientV4: Client by inject { parametersOf(V_4_BASE_URL) }
private val preferences: AppPreferences by inject() private val preferences: AppPreferences by inject()
init { init {
client.addInterceptor(TmdbInterceptor()) client.addInterceptor(TmdbInterceptor())
clientV4.addInterceptor(V4Interceptor())
} }
fun createMovieService(): MoviesApi { fun createMovieService(): MoviesApi {
@@ -42,6 +47,10 @@ class TmdbClient: KoinComponent {
return client.create(AuthenticationApi::class.java) return client.create(AuthenticationApi::class.java)
} }
fun createV4AuthenticationService(): AuthenticationV4Api {
return clientV4.create(AuthenticationV4Api::class.java)
}
fun createGuestSessionService(): GuestSessionApi { fun createGuestSessionService(): GuestSessionApi {
return client.create(GuestSessionApi::class.java) return client.create(GuestSessionApi::class.java)
} }
@@ -61,22 +70,41 @@ class TmdbClient: KoinComponent {
val segments = chain.request().url.encodedPathSegments val segments = chain.request().url.encodedPathSegments
val sessionIdParam: QueryParam? = sessionIdParam(segments) val sessionIdParam: QueryParam? = sessionIdParam(segments)
val request = chain.addQueryParams(apiParam, languageParam, sessionIdParam) val builder = chain.request().url.newBuilder()
builder.addQueryParams(apiParam, languageParam, sessionIdParam)
val requestBuilder = chain.request().newBuilder().url(builder.build())
val request = requestBuilder.build()
return chain.proceed(request) return chain.proceed(request)
} }
private fun sessionIdParam(urlSegments: List<String>): QueryParam? {
var sessionIdParam: QueryParam? = null
if (urlSegments.size > 1 && urlSegments[1] == "account") {
if (SessionManager.currentSession?.isAuthorized == true) {
sessionIdParam = QueryParam("session_id", SessionManager.currentSession!!.sessionId)
} else if (preferences.authorizedSessionId.isNotEmpty()) {
sessionIdParam = QueryParam("session_id", preferences.authorizedSessionId)
}
}
return sessionIdParam
}
} }
private fun sessionIdParam(urlSegments: List<String>): QueryParam? { private inner class V4Interceptor: Interceptor {
var sessionIdParam: QueryParam? = null override fun intercept(chain: Interceptor.Chain): Response {
if (urlSegments.size > 1 && urlSegments[1] == "account") { val builder = chain.request().newBuilder()
if (SessionManager.currentSession?.isAuthorized == true) { builder.header("Authorization", "Bearer ${BuildConfig.TMDB_Api_v4Key}")
sessionIdParam = QueryParam("session_id", SessionManager.currentSession!!.sessionId)
} else if (preferences.authorizedSessionId.isNotEmpty()) { val locale = Locale.current
sessionIdParam = QueryParam("session_id", preferences.authorizedSessionId) val languageCode = "${locale.language}-${locale.region}"
} val languageParam = QueryParam("language", languageCode)
val url = chain.request().url.newBuilder().addQueryParams(languageParam).build()
builder.url(url)
return chain.proceed(builder.build())
} }
return sessionIdParam
} }
} }

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
import retrofit2.http.* import retrofit2.http.*

View File

@@ -1,6 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
class AccountService { class AccountService {

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET

View File

@@ -1,6 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
class AuthenticationService { class AuthenticationService {

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
interface DetailService { interface DetailService {

View File

@@ -1,9 +1,9 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.RatedEpisode import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedEpisode
import com.owenlejeune.tvtime.api.tmdb.model.RatedMediaResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedMediaResponse
import com.owenlejeune.tvtime.api.tmdb.model.RatedMovie import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedMovie
import com.owenlejeune.tvtime.api.tmdb.model.RatedTv import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedTv
import retrofit2.Response import retrofit2.Response
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Path import retrofit2.http.Path

View File

@@ -1,6 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedEpisode
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedMediaResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedMovie
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.RatedTv
import retrofit2.Response import retrofit2.Response
class GuestSessionService { class GuestSessionService {

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.HomePageResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePageResponse
import retrofit2.Response import retrofit2.Response
interface HomePageService { interface HomePageService {

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
import retrofit2.http.* import retrofit2.http.*

View File

@@ -1,6 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import retrofit2.Response import retrofit2.Response

View File

@@ -1,9 +1,9 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.DetailPerson import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailPerson
import com.owenlejeune.tvtime.api.tmdb.model.HomePagePeopleResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePagePeopleResponse
import com.owenlejeune.tvtime.api.tmdb.model.PersonCreditsResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse
import com.owenlejeune.tvtime.api.tmdb.model.PersonImageCollection import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonImageCollection
import retrofit2.Response import retrofit2.Response
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Path import retrofit2.http.Path

View File

@@ -1,9 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.DetailPerson import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.model.HomePagePeopleResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailPerson
import com.owenlejeune.tvtime.api.tmdb.model.PersonCreditsResponse import com.owenlejeune.tvtime.api.tmdb.api.v3.model.HomePagePeopleResponse
import com.owenlejeune.tvtime.api.tmdb.model.PersonImageCollection import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonCreditsResponse
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.PersonImageCollection
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import retrofit2.Response import retrofit2.Response

View File

@@ -1,6 +1,6 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import retrofit2.Response import retrofit2.Response
import retrofit2.http.* import retrofit2.http.*

View File

@@ -1,6 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.*
import com.owenlejeune.tvtime.utils.SessionManager import com.owenlejeune.tvtime.utils.SessionManager
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import retrofit2.Response import retrofit2.Response

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.ui.screens.MediaViewType import com.owenlejeune.tvtime.ui.screens.MediaViewType

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.ui.screens.MediaViewType import com.owenlejeune.tvtime.ui.screens.MediaViewType

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,6 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
class HomePageMovie( class HomePageMovie(
id: Int, id: Int,

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,6 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName
class HomePageTv( class HomePageTv(
id: Int, id: Int,

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,9 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.ui.screens.MediaViewType
class MarkAsFavoriteBody( class MarkAsFavoriteBody(
@SerializedName("media_type") val mediaType: String, // media type @SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("media_id") val mediaId: Int, @SerializedName("media_id") val mediaId: Int,
@SerializedName("favorite") val isFavorite: Boolean @SerializedName("favorite") val isFavorite: Boolean
) )

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,9 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.ui.screens.MediaViewType
class WatchlistBody( class WatchlistBody(
@SerializedName("media_type") val mediaType: String, // media type @SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("media_id") val mediaId: Int, @SerializedName("media_id") val mediaId: Int,
@SerializedName("watchlist") val onWatchlist: Boolean @SerializedName("watchlist") val onWatchlist: Boolean
) )

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.api.tmdb.model package com.owenlejeune.tvtime.api.tmdb.api.v3.model
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName

View File

@@ -0,0 +1,20 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.StatusResponse
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.*
import retrofit2.Response
import retrofit2.http.DELETE
import retrofit2.http.POST
interface AuthenticationV4Api {
@POST("auth/request_token")
suspend fun createRequestToken(body: AuthRequestBody): Response<AuthResponse>
@POST("auth/access_token")
suspend fun createAccessToken(body: AuthAccessBody): Response<AccessResponse>
@DELETE("auth/access_token")
suspend fun deleteAccessToken(body: AuthDeleteBody): Response<StatusResponse>
}

View File

@@ -0,0 +1,24 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4
import com.owenlejeune.tvtime.api.tmdb.TmdbClient
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.StatusResponse
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.*
import retrofit2.Response
class AuthenticationV4Service {
private val service by lazy { TmdbClient().createV4AuthenticationService() }
suspend fun createRequestToken(body: AuthRequestBody): Response<AuthResponse> {
return service.createRequestToken(body)
}
suspend fun createAccessToken(body: AuthAccessBody): Response<AccessResponse> {
return service.createAccessToken(body)
}
suspend fun deleteAccessToken(body: AuthDeleteBody): Response<StatusResponse> {
return service.deleteAccessToken(body)
}
}

View File

@@ -0,0 +1,40 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.*
import retrofit2.Response
import retrofit2.http.*
interface ListV4Api {
@GET("list/{id}")
suspend fun getLists(
@Path("id") listId: Int,
@Query("api_key") apiKey: String,
@Query("page") page: Int = 1
): Response<MediaList>
@POST("list")
suspend fun createList(body: CreateListBody): Response<CreateListResponse>
@PUT("list/{id}")
suspend fun updateList(@Path("id") listId: Int, body: ListUpdateBody): Response<StatusResponse>
@GET("list/{id}/clear")
suspend fun clearList(@Path("id") listId: Int): Response<ClearListResponse>
@DELETE("list/{id}")
suspend fun deleteList(@Path("id") listId: Int): Response<StatusResponse>
@POST("list/{id}/items")
suspend fun addItemsToList(@Path("id") listId: Int, body: AddToListBody): Response<AddToListResponse>
@PUT("list/{id}/items")
suspend fun updateListItems(@Path("id") listId: Int, body: UpdateListItemBody): Response<AddToListResponse>
@DELETE("list/{id}/items")
suspend fun deleteListItems(@Path("id") listId: Int, body: DeleteListItemsBody): Response<AddToListResponse>
@GET("list/{id}/item_status")
suspend fun getListItemStatus(@Path("id") listId: Int, @Query("media_id") mediaId: Int, @Query("media_type") mediaType: String)
}

View File

@@ -0,0 +1,35 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.deserializer
import com.google.gson.*
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListItem
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListMovie
import com.owenlejeune.tvtime.api.tmdb.api.v4.model.ListTv
import com.owenlejeune.tvtime.ui.screens.MediaViewType
import java.lang.reflect.Type
class ListItemDeserializer: JsonDeserializer<ListItem> {
companion object {
const val MEDIA_TYPE = "media_type"
}
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
context: JsonDeserializationContext?
): ListItem? {
if (json?.isJsonObject == true) {
val obj = json.asJsonObject
if (obj.has(MEDIA_TYPE)) {
val typeStr = obj.get(MEDIA_TYPE).asString
return when (Gson().fromJson(typeStr, MediaViewType::class.java)) {
MediaViewType.MOVIE -> Gson().fromJson(obj.toString(), ListMovie::class.java)
MediaViewType.TV -> Gson().fromJson(obj.toString(), ListTv::class.java)
else -> throw JsonParseException("Not a valid MediaViewType: $typeStr")
}
}
throw JsonParseException("JSON object has no property $MEDIA_TYPE")
}
throw JsonParseException("Not a JSON object")
}
}

View File

@@ -0,0 +1,11 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AccessResponse(
@SerializedName("status_message") val statusMessage: String,
@SerializedName("access_token") val accessToken: String,
@SerializedName("success") val success: Boolean,
@SerializedName("status_code") val statusCode: Int,
@SerializedName("account_id") val accountId: String
)

View File

@@ -0,0 +1,13 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
import com.owenlejeune.tvtime.ui.screens.MediaViewType
class AddToListBody(
@SerializedName("items") val items: List<AddToListBodyItem>
)
class AddToListBodyItem(
@SerializedName("media_type") val mediaType: MediaViewType,
@SerializedName("media_id") val id: Int
)

View File

@@ -0,0 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AddToListResponse(
@SerializedName("status_message") val statusMessage: String,
@SerializedName("success") val isSuccess: Boolean,
@SerializedName("status_code") val statusCode: Int,
@SerializedName("results") val results: List<AddToListBodyItem>
)

View File

@@ -0,0 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthAccessBody(
@SerializedName("request_token") val requestToken: String
)

View File

@@ -0,0 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthDeleteBody(
@SerializedName("access_token") val accessToken: String
)

View File

@@ -0,0 +1,7 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthRequestBody(
@SerializedName("redirect_to") val redirect: String
)

View File

@@ -0,0 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class AuthResponse(
@SerializedName("status_message") val statusMessage: String,
@SerializedName("request_token") val requestToken: String,
@SerializedName("success") val success: Boolean,
@SerializedName("status_code") val statusCode: Int
)

View File

@@ -0,0 +1,11 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class ClearListResponse(
@SerializedName("items_deleted") val deletedItemsCount: Int,
@SerializedName("status_message") val statusMessage: String,
@SerializedName("id") val id: Int,
@SerializedName("status_code") val statusCode: Int,
@SerializedName("success") val isSuccess: Boolean
)

View File

@@ -0,0 +1,11 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class CreateListBody(
@SerializedName("name") val name: String,
@SerializedName("iso_639_1") val language: String,
@SerializedName("description") val description: String,
@SerializedName("public") val isPublic: Boolean,
@SerializedName("iso_3166_1") val localeCode: String
)

View File

@@ -0,0 +1,10 @@
package com.owenlejeune.tvtime.api.tmdb.api.v4.model
import com.google.gson.annotations.SerializedName
class CreateListResponse(
@SerializedName("status_message") val statusMessage: String,
@SerializedName("id") val id: Int,
@SerializedName("success") val isSuccess: Boolean,
@SerializedName("status_code") val statusCode: Int
)

Some files were not shown because too many files have changed in this diff Show More