diff --git a/gradle.properties b/gradle.properties index d76f6ca..61e951b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.daemon=true org.gradle.caching=true @@ -10,11 +10,11 @@ SONATYPE_AUTOMATIC_RELEASE=true RELEASE_SIGNING_ENABLED=true GROUP=app.moviebase -VERSION_NAME=1.3.2 +VERSION_NAME=1.3.3-SNAPSHOT POM_NAME=TMDB API for KMM POM_DESCRIPTION=Kotlin Multiplatform library to access the TMDB API. -POM_INCEPTION_YEAR=2023 +POM_INCEPTION_YEAR=2024 POM_LICENCE_NAME=The Apache Software License, Version 2.0 POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt @@ -27,7 +27,7 @@ POM_SCM_DEV_CONNECTION=scm:git:git@github.com:MoviebaseApp/tmdb-api.git POM_DEVELOPER_ID=chrisnkrueger POM_DEVELOPER_NAME=Chris Krueger -POM_DEVELOPER_URL=https://github.com/username/ +POM_DEVELOPER_URL=https://github.com/chrisnkrueger # Required to publish to Nexus (see https://github.com/gradle/gradle/issues/11308) systemProp.org.gradle.internal.publish.checksums.insecure=true diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbCollectionModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbCollectionModel.kt index 47da5c9..6589433 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbCollectionModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbCollectionModel.kt @@ -3,6 +3,7 @@ package app.moviebase.tmdb.model import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +@SerialName("collection") @Serializable data class TmdbCollection( @SerialName("adult") val adult: Boolean, @@ -13,7 +14,7 @@ data class TmdbCollection( @SerialName("original_name") val originalName: String, @SerialName("overview") val overview: String, @SerialName("poster_path") val posterPath: String? -) : TmdbSearchable +) : TmdbSearchable, TmdbSearchableListItem @Serializable data class TmdbCollectionPageResult( diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbGenresModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbGenresModel.kt index 479c9a1..4aef993 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbGenresModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbGenresModel.kt @@ -1,15 +1,8 @@ package app.moviebase.tmdb.model -@Deprecated("Use TmdbGenreId.Movie instead") -object TmdbMovieGenreId { - const val ACTION = 28 - const val ADVENTURE = 12 -} - object TmdbGenreId { object Movie { - const val ACTION = 28 const val ADVENTURE = 12 const val ANIMATION = 16 @@ -28,7 +21,7 @@ object TmdbGenreId { const val TV_MOVIE = 10770 const val THRILLER = 53 const val WAR = 10752 - const val WESTERM = 37 + const val WESTERN = 37 val ALL = setOf( ACTION, @@ -49,15 +42,13 @@ object TmdbGenreId { TV_MOVIE, THRILLER, WAR, - WESTERM + WESTERN, ) fun contains(genreId: Int) = ALL.contains(genreId) } object Show { - const val ACTION = 28 - const val ADVENTURE = 12 const val ACTION_ADVENTURE = 10759 const val ANIMATION = 16 const val COMEDY = 35 @@ -65,27 +56,17 @@ object TmdbGenreId { const val DOCUMENTARY = 99 const val DRAMA = 18 const val FAMILY = 10751 - const val FANTASY = 14 const val KIDS = 10762 const val MYSTERY = 9648 - const val HISTORY = 36 - const val HORROR = 27 - const val MUSIC = 10402 const val NEWS = 10763 const val REALITY = 10764 const val SCIENCE_FICTION_FANTASY = 10765 - const val SCIENCE_FICTION = 878 const val SOAP = 10766 const val TALK = 10767 const val WAR_POLITICS = 10768 - const val ROMANCE = 10749 - const val THRILLER = 53 - const val WAR = 10752 const val WESTERN = 37 val ALL = setOf( - ACTION, - ADVENTURE, ACTION_ADVENTURE, ANIMATION, COMEDY, @@ -93,23 +74,15 @@ object TmdbGenreId { DOCUMENTARY, DRAMA, FAMILY, - FANTASY, KIDS, MYSTERY, - HISTORY, - HORROR, - MUSIC, NEWS, REALITY, SCIENCE_FICTION_FANTASY, - SCIENCE_FICTION, SOAP, TALK, WAR_POLITICS, - ROMANCE, - THRILLER, - WAR, - WESTERN + WESTERN, ) fun contains(genreId: Int) = ALL.contains(genreId) diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMediaModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMediaModel.kt index e9ac1e8..2ec5171 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMediaModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMediaModel.kt @@ -1,8 +1,6 @@ package app.moviebase.tmdb.model import app.moviebase.tmdb.image.TmdbImage -import app.moviebase.tmdb.core.LocalDateSerializer -import kotlinx.datetime.LocalDate import kotlinx.serialization.Polymorphic import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -57,92 +55,3 @@ sealed interface TmdbMediaListItem : TmdbAnyItem, TmdbBackdropItem, TmdbPosterIt val popularity: Float val originalLanguage: String } - -@Polymorphic -@Serializable -sealed interface TmdbSearchableListItem : TmdbAnyItem, TmdbSearchable - -@Serializable -data class TmdbMultiPageResult( - @SerialName("page") override val page: Int, - @SerialName("results") override val results: List = emptyList(), - @SerialName("total_results") override val totalResults: Int, - @SerialName("total_pages") override val totalPages: Int -) : TmdbPageResult - -@Serializable -@SerialName("movie") -data class TmdbMovie( - @SerialName("poster_path") override val posterPath: String?, - @SerialName("adult") val adult: Boolean = false, - @SerialName("overview") override val overview: String, - @SerialName("release_date") - @Serializable(LocalDateSerializer::class) - val releaseDate: LocalDate? = null, - @SerialName("genre_ids") override val genresIds: List, - @SerialName("id") override val id: Int, - @SerialName("original_title") val originalTitle: String, - @SerialName("original_language") override val originalLanguage: String, - @SerialName("title") val title: String, - @SerialName("backdrop_path") override val backdropPath: String?, - @SerialName("popularity") override val popularity: Float, - @SerialName("vote_count") override val voteCount: Int, - @SerialName("video") val video: Boolean, - @SerialName("vote_average") override val voteAverage: Float -) : TmdbMediaListItem, TmdbSearchableListItem - -@Serializable -data class TmdbMoviePageResult( - @SerialName("page") override val page: Int, - @SerialName("results") override val results: List = emptyList(), - @SerialName("total_results") override val totalResults: Int, - @SerialName("total_pages") override val totalPages: Int -) : TmdbPageResult - -@Serializable -@SerialName("tv") -data class TmdbShow( - @SerialName("poster_path") override val posterPath: String?, - @SerialName("popularity") override val popularity: Float, - @SerialName("id") override val id: Int, - @SerialName("backdrop_path") override val backdropPath: String?, - @SerialName("vote_average") override val voteAverage: Float, - @SerialName("overview") override val overview: String, - @SerialName("first_air_date") - @Serializable(LocalDateSerializer::class) - val firstAirDate: LocalDate? = null, - @SerialName("origin_country") val originCountry: List, - @SerialName("genre_ids") override val genresIds: List, - @SerialName("original_language") override val originalLanguage: String, - @SerialName("vote_count") override val voteCount: Int, - @SerialName("name") val name: String, - @SerialName("original_name") val originalName: String -) : TmdbMediaListItem, TmdbSearchableListItem - -@Serializable -data class TmdbShowPageResult( - @SerialName("page") override val page: Int, - @SerialName("results") override val results: List = emptyList(), - @SerialName("total_results") override val totalResults: Int, - @SerialName("total_pages") override val totalPages: Int -) : TmdbPageResult - -@Serializable -@SerialName("person") -data class TmdbPerson( - @SerialName("adult") val adult: Boolean, - @SerialName("gender") val gender: TmdbGender, - @SerialName("id") override val id: Int, - @SerialName("known_for_department") val knownForDepartment: String? = null, - @SerialName("name") override val name: String, - @SerialName("profile_path") override val profilePath: String? = null, - @SerialName("popularity") override val popularity: Float -) : TmdbAnyPerson, TmdbSearchableListItem - -@Serializable -data class TmdbPersonPageResult( - @SerialName("page") override val page: Int, - @SerialName("results") override val results: List = emptyList(), - @SerialName("total_results") override val totalResults: Int, - @SerialName("total_pages") override val totalPages: Int -) : TmdbPageResult diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt index 844e892..f1be64a 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbMovieModel.kt @@ -60,6 +60,36 @@ enum class TmdbMovieStatus(val value: String) { } } +@Serializable +@SerialName("movie") +data class TmdbMovie( + @SerialName("poster_path") override val posterPath: String?, + @SerialName("adult") val adult: Boolean = false, + @SerialName("overview") override val overview: String, + @SerialName("release_date") + @Serializable(LocalDateSerializer::class) + val releaseDate: LocalDate? = null, + @SerialName("genre_ids") override val genresIds: List, + @SerialName("id") override val id: Int, + @SerialName("original_title") val originalTitle: String, + @SerialName("original_language") override val originalLanguage: String, + @SerialName("title") val title: String, + @SerialName("backdrop_path") override val backdropPath: String?, + @SerialName("popularity") override val popularity: Float, + @SerialName("vote_count") override val voteCount: Int, + @SerialName("video") val video: Boolean, + @SerialName("vote_average") override val voteAverage: Float +) : TmdbMediaListItem, TmdbSearchableListItem + +@Serializable +data class TmdbMoviePageResult( + @SerialName("page") override val page: Int, + @SerialName("results") override val results: List = emptyList(), + @SerialName("total_results") override val totalResults: Int, + @SerialName("total_pages") override val totalPages: Int +) : TmdbPageResult + + @Serializable data class TmdbMovieDetail( val adult: Boolean, diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbPeopleModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbPeopleModel.kt index b13d3b6..83f7dc9 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbPeopleModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbPeopleModel.kt @@ -73,6 +73,26 @@ data class TmdbAggregateCredits( @SerialName("crew") val crew: List, ) +@Serializable +@SerialName("person") +data class TmdbPerson( + @SerialName("adult") val adult: Boolean, + @SerialName("gender") val gender: TmdbGender, + @SerialName("id") override val id: Int, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, + @SerialName("name") override val name: String, + @SerialName("profile_path") override val profilePath: String? = null, + @SerialName("popularity") override val popularity: Float +) : TmdbAnyPerson, TmdbSearchableListItem + +@Serializable +data class TmdbPersonPageResult( + @SerialName("page") override val page: Int, + @SerialName("results") override val results: List = emptyList(), + @SerialName("total_results") override val totalResults: Int, + @SerialName("total_pages") override val totalPages: Int +) : TmdbPageResult + @Serializable data class TmdbPersonDetail( @SerialName("adult") val adult: Boolean, @@ -84,7 +104,7 @@ data class TmdbPersonDetail( @SerialName("homepage") val homepage: String? = null, @SerialName("id") override val id: Int, @SerialName("imdb_id") val imdbId: String? = null, - @SerialName("known_for_department") val knownForDepartment: String? = null, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, @SerialName("name") override val name: String, @SerialName("place_of_birth") val placeOfBirth: String? = null, @SerialName("popularity") override val popularity: Float? = null, @@ -103,13 +123,13 @@ data class TmdbCrew( @SerialName("adult") val adult: Boolean = false, @SerialName("gender") val gender: TmdbGender = TmdbGender.UNKNOWN, @SerialName("id") override val id: Int, - @SerialName("known_for_department") val knownForDepartment: String? = null, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, @SerialName("name") override val name: String, @SerialName("original_name") val originalName: String? = null, @SerialName("popularity") override val popularity: Float? = null, @SerialName("profile_path") override val profilePath: String? = null, @SerialName("credit_id") val creditId: String, - @SerialName("department") val department: String, + @SerialName("department") val department: TmdbDepartment? = null, @SerialName("job") val job: String, ) : TmdbAnyPerson @@ -118,7 +138,7 @@ data class TmdbCast( @SerialName("adult") val adult: Boolean = false, @SerialName("gender") val gender: TmdbGender, @SerialName("id") override val id: Int, - @SerialName("known_for_department") val knownForDepartment: String? = null, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, @SerialName("name") override val name: String, @SerialName("original_name") val originalName: String? = null, @SerialName("popularity") override val popularity: Float? = null, @@ -134,7 +154,7 @@ data class TmdbAggregateCast( @SerialName("adult") val adult: Boolean = false, @SerialName("gender") val gender: TmdbGender, @SerialName("id") val id: Int, - @SerialName("known_for_department") val knownForDepartment: String? = null, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, @SerialName("name") val name: String, @SerialName("original_name") val originalName: String? = null, @SerialName("popularity") val popularity: Float? = null, @@ -149,13 +169,13 @@ data class TmdbAggregateCrew( @SerialName("adult") val adult: Boolean = false, @SerialName("gender") val gender: TmdbGender, @SerialName("id") override val id: Int, - @SerialName("known_for_department") val knownForDepartment: String? = null, + @SerialName("known_for_department") val knownForDepartment: TmdbDepartment? = null, @SerialName("name") override val name: String, @SerialName("original_name") val originalName: String? = null, @SerialName("popularity") override val popularity: Float? = null, @SerialName("profile_path") override val profilePath: String? = null, @SerialName("jobs") val jobs: List, - @SerialName("department") val department: String, + @SerialName("department") val department: TmdbDepartment? = null, @SerialName("total_episode_count") val totalEpisodeCount: Int, ) : TmdbAnyPerson @@ -216,7 +236,7 @@ data class TmdbImagePageResult( @Serializable data class TmdbTaggedMedia( - @SerialName("backdrop_path") val backdropPath: String?, + @SerialName("backdrop_path") val backdropPath: String? = null, ) @Serializable @@ -241,20 +261,27 @@ sealed interface TmdbPersonCredit : TmdbAnyItem, TmdbBackdropItem, TmdbPosterIte val voteAverage: Float val voteCount: Int val overview: String - val genresIds: List + val genreIds: List val popularity: Float? val originalLanguage: String? + val adult: Boolean + + val character: String? + val creditId: String? + val order: Int? + val department: TmdbDepartment? + val job: String? @Serializable @SerialName("movie") data class Movie( @SerialName("poster_path") override val posterPath: String?, - @SerialName("adult") val adult: Boolean = false, + @SerialName("adult") override val adult: Boolean = false, @SerialName("overview") override val overview: String, @SerialName("release_date") @Serializable(LocalDateSerializer::class) val releaseDate: LocalDate? = null, - @SerialName("genre_ids") override val genresIds: List, + @SerialName("genre_ids") override val genreIds: List, @SerialName("id") override val id: Int, @SerialName("original_title") val originalTitle: String? = null, @SerialName("original_language") override val originalLanguage: String, @@ -264,11 +291,11 @@ sealed interface TmdbPersonCredit : TmdbAnyItem, TmdbBackdropItem, TmdbPosterIte @SerialName("video") val video: Boolean = false, @SerialName("vote_average") override val voteAverage: Float, @SerialName("vote_count") override val voteCount: Int, - @SerialName("character") val character: String? = null, - @SerialName("credit_id") val creditId: String? = null, - @SerialName("order") val order: Int? = null, - @SerialName("department") val department: String? = null, - @SerialName("job") val job: String? = null, + @SerialName("character") override val character: String? = null, + @SerialName("credit_id") override val creditId: String? = null, + @SerialName("order") override val order: Int? = null, + @SerialName("department") override val department: TmdbDepartment? = null, + @SerialName("job") override val job: String? = null, ) : TmdbPersonCredit @Serializable @@ -277,6 +304,7 @@ sealed interface TmdbPersonCredit : TmdbAnyItem, TmdbBackdropItem, TmdbPosterIte @SerialName("poster_path") override val posterPath: String? = null, @SerialName("popularity") override val popularity: Float? = null, @SerialName("id") override val id: Int, + @SerialName("adult") override val adult: Boolean = false, @SerialName("backdrop_path") override val backdropPath: String? = null, @SerialName("vote_average") override val voteAverage: Float, @SerialName("overview") override val overview: String, @@ -284,15 +312,65 @@ sealed interface TmdbPersonCredit : TmdbAnyItem, TmdbBackdropItem, TmdbPosterIte @Serializable(LocalDateSerializer::class) val firstAirDate: LocalDate? = null, @SerialName("origin_country") val originCountry: List = emptyList(), - @SerialName("genre_ids") override val genresIds: List = emptyList(), + @SerialName("genre_ids") override val genreIds: List = emptyList(), @SerialName("original_language") override val originalLanguage: String, @SerialName("vote_count") override val voteCount: Int, @SerialName("name") val name: String? = null, @SerialName("original_name") val originalName: String? = null, - @SerialName("character") val character: String? = null, - @SerialName("credit_id") val creditId: String? = null, - @SerialName("order") val order: Int? = null, - @SerialName("department") val department: String? = null, - @SerialName("job") val job: String? = null, + @SerialName("character") override val character: String? = null, + @SerialName("credit_id") override val creditId: String? = null, + @SerialName("order") override val order: Int? = null, + @SerialName("department") override val department: TmdbDepartment? = null, + @SerialName("job") override val job: String? = null, ) : TmdbPersonCredit } + +@Serializable +enum class TmdbDepartment(val value: String) { + + @SerialName("Acting") + ACTING("Acting"), + + @SerialName("Writing") + WRITING("Writing"), + + @SerialName("Sound") + SOUND("Sound"), + + @SerialName("Production") + PRODUCTION("Production"), + + @SerialName("Art") + ART("Art"), + + @SerialName("Directing") + DIRECTING("Directing"), + + @SerialName("Creator") + CREATOR("Creator"), + + @SerialName("Costume & Make-Up") + COSTUME_AND_MAKEUP("Costume & Make-Up"), + + @SerialName("Camera") + CAMERA("Camera"), + + @SerialName("Visual Effects") + VISUAL_EFFECTS("Visual Effects"), + + @SerialName("Lighting") + LIGHTING("Lighting"), + + @SerialName("Editing") + EDITING("Editing"), + + @SerialName("Actors") + ACTORS("Actors"), + + @SerialName("Crew") + CREW("Crew"); + + companion object { + fun of(value: String?) = entries.find { it.value == value } + } +} diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbSearchModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbSearchModel.kt index 7d3fc8b..e1a734a 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbSearchModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbSearchModel.kt @@ -1,5 +1,6 @@ package app.moviebase.tmdb.model +import kotlinx.serialization.Polymorphic import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -23,3 +24,15 @@ data class TmdbFindResults( interface TmdbSearchable { val id: Int } + +@Polymorphic +@Serializable +sealed interface TmdbSearchableListItem : TmdbAnyItem, TmdbSearchable + +@Serializable +data class TmdbMultiPageResult( + @SerialName("page") override val page: Int, + @SerialName("results") override val results: List = emptyList(), + @SerialName("total_results") override val totalResults: Int, + @SerialName("total_pages") override val totalPages: Int +) : TmdbPageResult diff --git a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbShowModel.kt b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbShowModel.kt index a5e859c..4539253 100644 --- a/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbShowModel.kt +++ b/tmdb-api/src/commonMain/kotlin/app/moviebase/tmdb/model/TmdbShowModel.kt @@ -66,6 +66,35 @@ enum class TmdbShowType(val value: String) { } } +@Serializable +@SerialName("tv") +data class TmdbShow( + @SerialName("poster_path") override val posterPath: String?, + @SerialName("popularity") override val popularity: Float, + @SerialName("id") override val id: Int, + @SerialName("adult") val adult: Boolean = false, + @SerialName("backdrop_path") override val backdropPath: String?, + @SerialName("vote_average") override val voteAverage: Float, + @SerialName("overview") override val overview: String, + @SerialName("first_air_date") + @Serializable(LocalDateSerializer::class) + val firstAirDate: LocalDate? = null, + @SerialName("origin_country") val originCountry: List, + @SerialName("genre_ids") override val genresIds: List, + @SerialName("original_language") override val originalLanguage: String, + @SerialName("vote_count") override val voteCount: Int, + @SerialName("name") val name: String, + @SerialName("original_name") val originalName: String +) : TmdbMediaListItem, TmdbSearchableListItem + +@Serializable +data class TmdbShowPageResult( + @SerialName("page") override val page: Int, + @SerialName("results") override val results: List = emptyList(), + @SerialName("total_results") override val totalResults: Int, + @SerialName("total_pages") override val totalPages: Int +) : TmdbPageResult + @Serializable data class TmdbShowDetail( @SerialName("id") override val id: Int, diff --git a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbPeopleApiTest.kt b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbPeopleApiTest.kt index e95f637..2492212 100644 --- a/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbPeopleApiTest.kt +++ b/tmdb-api/src/jvmTest/kotlin/app/moviebase/tmdb/api/TmdbPeopleApiTest.kt @@ -4,8 +4,8 @@ package app.moviebase.tmdb.api import app.moviebase.tmdb.core.mockHttpClient import app.moviebase.tmdb.model.AppendResponse +import app.moviebase.tmdb.model.TmdbDepartment import app.moviebase.tmdb.model.TmdbGender -import app.moviebase.tmdb.model.TmdbGenre import com.google.common.truth.Truth.assertThat import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -79,7 +79,7 @@ class TmdbPeopleApiTest { assertEquals("https://www.unhcr.org/pages/49c3646c56.html", personDetail.homepage) assertEquals(11701, personDetail.id) assertEquals("nm0001401", personDetail.imdbId) - assertEquals("Acting", personDetail.knownForDepartment) + assertEquals(TmdbDepartment.ACTING, personDetail.knownForDepartment) assertEquals("Angelina Jolie", personDetail.name) assertEquals("Los Angeles, California, USA ", personDetail.placeOfBirth) assertEquals(41.859f, personDetail.popularity) diff --git a/tmdb-api/src/jvmTest/resources/tmdb3/configuration/jobs.json b/tmdb-api/src/jvmTest/resources/tmdb3/configuration/jobs.json new file mode 100644 index 0000000..a50e2d0 --- /dev/null +++ b/tmdb-api/src/jvmTest/resources/tmdb3/configuration/jobs.json @@ -0,0 +1,1003 @@ +[ + { + "department": "Camera", + "jobs": [ + "Director of Photography", + "Underwater Camera", + "Camera Operator", + "Still Photographer", + "Camera Department Manager", + "Camera Supervisor", + "Camera Technician", + "Other", + "Grip", + "Steadicam Operator", + "Additional Camera", + "Camera Intern", + "Additional Photography", + "Helicopter Camera", + "First Assistant Camera", + "Additional Still Photographer", + "Aerial Camera", + "Aerial Camera Technician", + "Aerial Director of Photography", + "Camera Loader", + "Dolly Grip", + "Epk Camera Operator", + "Key Grip", + "Russian Arm Operator", + "Second Unit Director of Photography", + "Ultimate Arm Operator", + "Underwater Director of Photography", + "\"A\" Camera Operator", + "\"B\" Camera Operator", + "\"C\" Camera Operator", + "\"D\" Camera Operator", + "Additional Director of Photography", + "Additional First Assistant Camera", + "Additional Grip", + "Additional Key Grip", + "Additional Second Assistant Camera", + "Additional Set Photographer", + "Additional Underwater Photography", + "Assistant Camera", + "Assistant Grip", + "Best Boy Grip", + "BTS Footage", + "BTS Photographer", + "BTS Videographer", + "Camera Car", + "Camera Department Production Assistant", + "Camera Production Assistant", + "Camera Trainee", + "Camera Truck", + "Clapper Loader", + "Data Wrangler", + "Digital Imaging Technician", + "Drone Cinematographer", + "Drone Pilot", + "Epk Director", + "Epk Producer", + "First Assistant \"A\" Camera", + "First Assistant \"B\" Camera", + "First Assistant \"C\" Camera", + "First Assistant \"D\" Camera", + "First Company Grip", + "Focus Puller", + "Head of Layout", + "Jimmy Jib Operator", + "Libra Head Technician", + "Phantom Operator", + "Red Technician", + "Second Assistant \"A\" Camera", + "Second Assistant \"B\" Camera", + "Second Assistant \"C\" Camera", + "Second Assistant \"D\" Camera", + "Second Assistant Camera", + "Second Company Grip", + "Set Photographer", + "Third Assistant \"A\" Camera", + "Third Assistant \"B\" Camera", + "Third Assistant \"C\" Camera", + "Third Assistant \"D\" Camera", + "Third Assistant Camera", + "Underwater Epk Photographer", + "Underwater Stills Photographer", + "Videojournalist", + "Video Report" + ] + }, + { + "department": "Directing", + "jobs": [ + "Director", + "Script Supervisor", + "Other", + "Layout", + "Script Coordinator", + "Special Guest Director", + "Assistant Director", + "Co-Director", + "Continuity", + "First Assistant Director", + "Second Assistant Director", + "Third Assistant Director", + "Action Director", + "Additional Second Assistant Director", + "Additional Third Assistant Director", + "Assistant Director Trainee", + "Crowd Assistant Director", + "Field Director", + "First Assistant Director (Prep)", + "First Assistant Director Trainee", + "Insert Unit Director", + "Insert Unit First Assistant Director", + "Second Assistant Director Trainee", + "Second Second Assistant Director", + "Second Unit Director", + "Second Unit First Assistant Director", + "Series Director", + "Stage Director" + ] + }, + { + "department": "Sound", + "jobs": [ + "Original Music Composer", + "Sound Designer", + "Sound Editor", + "Sound Director", + "Sound Mixer", + "Music Editor", + "Sound Effects Editor", + "Production Sound Mixer", + "Additional Soundtrack", + "Supervising Sound Editor", + "Supervising Sound Effects Editor", + "Sound Re-Recording Mixer", + "Recording Supervision", + "Boom Operator", + "Sound Montage Associate", + "Songs", + "Music", + "ADR & Dubbing", + "Sound Recordist", + "Sound Engineer", + "Foley", + "Dialogue Editor", + "Additional Music Supervisor", + "First Assistant Sound Editor", + "Scoring Mixer", + "Dolby Consultant", + "Other", + "Music Director", + "Orchestrator", + "Vocal Coach", + "Music Supervisor", + "Sound", + "Musician", + "Additional Sound Re-Recording Mixer", + "Additional Sound Re-Recordist", + "ADR Editor", + "ADR Supervisor", + "Apprentice Sound Editor", + "Assistant Music Supervisor", + "Assistant Sound Editor", + "Conductor", + "Foley Editor", + "Music Programmer", + "Music Score Producer", + "Playback Singer", + "Sound Effects", + "Sound Effects Designer", + "Supervising ADR Editor", + "Supervising Dialogue Editor", + "Supervising Music Editor", + "Theme Song Performance", + "Utility Sound", + "Additional Production Sound Mixer", + "ADR Editor", + "ADR Engineer", + "ADR Coordinator", + "ADR Mixer", + "ADR Post Producer", + "ADR Recording Engineer", + "ADR Recordist", + "Assistant Dialogue Editor", + "Assistant Foley Artist", + "Assistant Sound Designer", + "Assistant Sound Engineer", + "Audio Post Coordinator", + "Digital Foley Artist", + "Foley Artist", + "Foley Mixer", + "Foley Recording Engineer", + "Foley Recordist", + "Foley Supervisor", + "Joint ADR Mixer", + "Keyboard Programmer", + "Location Sound Assistant", + "Location Sound Mixer", + "Location Sound Recordist", + "Loop Group Coordinator", + "Main Title Theme Composer", + "Music Arranger", + "Music Co-Supervisor", + "Music Consultant", + "Music Coordinator", + "Music Producer", + "Music Sound Design and Processing", + "Music Supervision Assistant", + "O.B. Sound", + "Second Assistant Sound", + "Sound Assistant", + "Sound Mix Technician", + "Sound Post Production Coordinator", + "Sound Post Supervisor", + "Sound Re-Recording Assistant", + "Sound Supervisor", + "Sound Technical Supervisor", + "Vocals" + ] + }, + { + "department": "Actors", + "jobs": [ + "Actor", + "Stunt Double", + "Voice", + "Cameo", + "Special Guest" + ] + }, + { + "department": "Art", + "jobs": [ + "Production Design", + "Art Direction", + "Set Decoration", + "Set Designer", + "Conceptual Design", + "Interior Designer", + "Settings", + "Assistant Art Director", + "Art Department Coordinator", + "Assistant Property Master", + "Other", + "Art Department Manager", + "Sculptor", + "Art Department Assistant", + "Background Designer", + "Co-Art Director", + "Set Decoration Buyer", + "Production Illustrator", + "Standby Painter", + "Property Master", + "Location Scout", + "Supervising Art Director", + "Leadman", + "Greensman", + "Gun Wrangler", + "Construction Coordinator", + "Construction Foreman", + "Lead Painter", + "Sign Painter", + "Painter", + "Assistant Set Dresser", + "Conceptual Illustrator", + "Draughtsman", + "Lead Set Dresser", + "Prop Designer", + "Set Decorating Coordinator", + "Set Dresser", + "Storyboard Designer", + "Title Designer", + "Additional Construction", + "Additional Construction Grip", + "Additional Key Construction Grip", + "Additional Set Dresser", + "Additional Storyboarding", + "Art Department Trainee", + "Art Designer", + "Art Direction Intern", + "Assistant Decorator", + "Assistant Director of Photography", + "Assistant Production Design", + "Assistant Set Decoration Buyer", + "Assistant Set Decoration", + "Assistant Set Designer", + "Assistant Set Propsman", + "Concept Artist", + "Construction Buyer", + "Construction Grip", + "Construction Manager", + "Creative Director", + "Daily Grip", + "Decorator", + "Digital Storyboarding", + "Dressing Prop", + "First Assistant Art Direction", + "First Assistant Property Master", + "Graphic Designer", + "Head Carpenter", + "Head Decorator", + "Head Designer", + "Head Greensman", + "Helping Hand", + "Key Carpenter", + "Key Construction Grip", + "Key Set Painter", + "Main Title Designer", + "On Set Computer Graphics", + "On Set Key Props", + "On Set Props", + "Opening Title Sequence", + "Original Series Design", + "Paint Coordinator", + "Petty Cash Buyer", + "Property Builder", + "Property Buyer", + "Property Graphic Designer", + "Props", + "Runner Art Department", + "Second Assistant Art Director", + "Set Dressing Buyer", + "Set Painter", + "Set Propsman", + "Set Supervisor", + "Set Buyer", + "Shop Electric", + "Special Props", + "Standby Art Director", + "Standby Carpenter", + "Standby Property Master", + "Storyboard Artist", + "Storyboard Assistant", + "Supervising Carpenter", + "Swing", + "Textile Artist", + "Title Illustration", + "Web Designer" + ] + }, + { + "department": "Costume & Make-Up", + "jobs": [ + "Costume Design", + "Makeup Artist", + "Hairstylist", + "Set Dressing Artist", + "Set Dressing Supervisor", + "Set Dressing Manager", + "Set Dressing Production Assistant", + "Facial Setup Artist", + "Hair Setup", + "Costume Supervisor", + "Set Costumer", + "Makeup Department Head", + "Wigmaker", + "Shoe Design", + "Other", + "Co-Costume Designer", + "Hair Department Head", + "Hair Designer", + "Makeup Designer", + "Assistant Costume Designer", + "Prosthetic Supervisor", + "Seamstress", + "Key Hair Stylist", + "Ager/Dyer", + "Costume Consultant", + "Costume Coordinator", + "Costume Illustrator", + "Hair Supervisor", + "Key Costumer", + "Key Makeup Artist", + "Key Set Costumer", + "Makeup Effects Designer", + "Makeup Supervisor", + "Prosthetic Designer", + "Prosthetic Makeup Artist", + "Tailor", + "Tattoo Designer", + "Wardrobe Supervisor", + "Wig Designer", + "Additional Hairstylist", + "Additional Wardrobe Assistant", + "Assistant Hairstylist", + "Assistant Hairdresser", + "Assistant Makeup Artist", + "Contact Lens Designer", + "Contact Lens Painter", + "Contact Lens Technician", + "Costume Assistant", + "Costume Mistress", + "Costume Designer", + "Costume Set Supervisor", + "Costume Standby", + "Costumer", + "Daily Makeup & Hair", + "Daily Wardrobe", + "Dresser", + "Extras Dresser", + "Extras Makeup Artist", + "First Assistant Hairstylist", + "First Assistant Makeup Artist", + "Hair Assistant", + "Hairdresser", + "Key Dresser", + "Key Hairdresser", + "Lead Costumer", + "Makeup & Hair", + "Makeup & Hair Assistant", + "Makeup Trainee", + "On Set Dresser", + "Principal Costumer", + "Prosthetics", + "Prosthetics Painter", + "Prosthetics Sculptor", + "Special Effects Key Makeup Artist", + "Special Effects Makeup Artist", + "Truck Costumer", + "Truck Supervisor", + "Wardrobe Assistant", + "Wardrobe Coordinator", + "Wardrobe Designer", + "Wardrobe Intern", + "Wardrobe Master", + "Wardrobe Specialized Technician" + ] + }, + { + "department": "Production", + "jobs": [ + "Producer", + "Executive Producer", + "Casting", + "Production Manager", + "Unit Production Manager", + "Line Producer", + "Location Manager", + "Other", + "Production Supervisor", + "Production Accountant", + "Production Office Coordinator", + "Finance", + "Executive Consultant", + "Character Technical Supervisor", + "Development Manager", + "Administration", + "Executive In Charge Of Post Production", + "Production Director", + "Executive In Charge Of Production", + "Publicist", + "Associate Producer", + "Co-Producer", + "Co-Executive Producer", + "Casting Associate", + "Researcher", + "Production Coordinator", + "Consulting Producer", + "Supervising Producer", + "Senior Executive Consultant", + "Unit Manager", + "ADR Voice Casting", + "Assistant Production Coordinator", + "Assistant Production Manager", + "Casting Assistant", + "Casting Consultant", + "Coordinating Producer", + "Local Casting", + "Script Researcher", + "Accountant", + "Accounting Clerk Assistant", + "Accounting Supervisor", + "Accounting Trainee", + "Additional Casting", + "Additional Production Assistant", + "Additional Post-Production Supervisor", + "Art Department Production Assistant", + "Assistant Accountant", + "Assistant Extras Casting", + "Assistant Location Manager", + "Assistant Unit Manager", + "Attorney", + "Background Casting Director", + "Back-up Set Production Assistant", + "Back-up Truck Production Assistant", + "Broadcast Producer", + "Business Affairs Coordinator", + "Casting Coordinator", + "Casting Director", + "Casting Producer", + "Casting Researcher", + "Consulting Accountant", + "Contract Manager", + "Controller", + "Data Management Technician", + "Delegated Producer", + "Development Producer", + "Director of Operations", + "Executive Assistant", + "Executive Co-Producer", + "Executive Producer's Assistant", + "Extras Casting", + "Extras Casting Assistant", + "Extras Casting Coordinator", + "Feature Finishing Producer", + "Finishing Producer", + "First Assistant Accountant", + "First Assistant Production Coordinator", + "General Manager", + "Grip Production Assistant", + "Head of Production", + "Head of Programming", + "Head of Research", + "Human Resources", + "Insert Unit Location Manager", + "Key Accountant", + "Key Art Production Assistant", + "Key Grip Production Assistant", + "Key Production Assistant", + "Key Set Production Assistant", + "Locale Casting Director", + "Location Assistant", + "Location Casting", + "Location Coordinator", + "Location Production Assistant", + "Musical Casting", + "Original Casting", + "Payroll Accountant", + "Post Coordinator", + "Post Producer", + "Post Production Accountant", + "Post Production Coordinator", + "Post Production Producer", + "Post Production Technical Engineer", + "Producer's Assistant", + "Production Assistant", + "Production Consultant", + "Production Designer", + "Production Driver", + "Production Executive", + "Production Runner", + "Production Secretary", + "Production Trainee", + "Research Assistant", + "Second Assistant Accountant", + "Second Assistant Production Coordinator", + "Second Assistant Unit Manager", + "Second Unit Location Manager", + "Street Casting", + "Trainee Production Coordinator", + "Travel Coordinator", + "Truck Production Assistant", + "Unit Swing" + ] + }, + { + "department": "Writing", + "jobs": [ + "Screenplay", + "Author", + "Novel", + "Characters", + "Theatre Play", + "Adaptation", + "Dialogue", + "Writer", + "Other", + "Storyboard", + "Original Story", + "Scenario Writer", + "Screenstory", + "Musical", + "Idea", + "Story", + "Creative Producer", + "Teleplay", + "Opera", + "Co-Writer", + "Book", + "Comic Book", + "Short Story", + "Series Composition", + "Script Editor", + "Script Consultant", + "Story Editor", + "Executive Story Editor", + "Graphic Novel", + "Head of Story", + "Junior Story Editor", + "Lyricist", + "Original Concept", + "Original Film Writer", + "Original Series Creator", + "Senior Story Editor", + "Staff Writer", + "Story Artist", + "Story Consultant", + "Story Coordinator", + "Story Developer", + "Story Manager", + "Story Supervisor", + "Writers' Assistant", + "Writers' Production" + ] + }, + { + "department": "Visual Effects", + "jobs": [ + "Animation", + "Visual Effects", + "Chief Technician / Stop-Motion Expert", + "Creature Design", + "Shading", + "Modeling", + "CG Painter", + "Visual Development", + "Animation Manager", + "Animation Director", + "Fix Animator", + "Animation Department Coordinator", + "Animation Fix Coordinator", + "Animation Production Assistant", + "Visual Effects Supervisor", + "Mechanical & Creature Designer", + "Battle Motion Coordinator", + "Animation Supervisor", + "VFX Supervisor", + "Cloth Setup", + "VFX Artist", + "CG Engineer", + "24 Frame Playback", + "Imaging Science", + "I/O Supervisor", + "Visual Effects Producer", + "VFX Production Coordinator", + "I/O Manager", + "Additional Effects Development", + "Color Designer", + "Simulation & Effects Production Assistant", + "Simulation & Effects Artist", + "Pyrotechnic Supervisor", + "Special Effects Supervisor", + "3D Supervisor", + "3D Director", + "Digital Compositor", + "Visual Effects Coordinator", + "VFX Editor", + "2D Artist", + "2D Supervisor", + "3D Animator", + "3D Artist", + "3D Coordinator", + "3D Generalist", + "3D Modeller", + "3D Sequence Supervisor", + "3D Tracking Layout", + "CG Animator", + "CGI Director", + "Character Designer", + "Character Modelling Supervisor", + "Creature Technical Director", + "Digital Effects Producer", + "Key Animation", + "Lead Animator", + "Lead Character Designer", + "Matchmove Supervisor", + "Mechanical Designer", + "Opening/Ending Animation", + "Pre-Visualization Supervisor", + "Roto Supervisor", + "Stereoscopic Coordinator", + "VFX Director of Photography", + "VFX Lighting Artist", + "Visual Effects Designer", + "Visual Effects Technical Director", + "2D Sequence Supervisor", + "Additional Visual Effects", + "Animation Coordinator", + "Animation Technical Director", + "CG Artist", + "Compositing Artist", + "Compositing Lead", + "Compositing Supervisor", + "Creature Effects Technical Director", + "Cyber Scanning Supervisor", + "Digital Film Recording", + "Director of Previsualization", + "Effects Supervisor", + "Generalist", + "Head of Animation", + "Layout Supervisor", + "Lead Creature Designer", + "Matte Painter", + "Modelling Supervisor", + "Pipeline Technical Director", + "Photo Retouching", + "Pre-Visualization Coordinator", + "Rotoscoping Artist", + "Senior Animator", + "Senior Generalist", + "Senior Modeller", + "Senior Visual Effects Supervisor", + "Smoke Artist", + "Stereoscopic Supervisor", + "Stereoscopic Technical Director", + "Supervising Animation Director", + "Visual Effects Assistant Editor", + "Visual Effects Camera", + "Visual Effects Compositor", + "Visual Effects Director", + "Visual Effects Lineup", + "Visual Effects Production Assistant", + "Visual Effects Production Manager" + ] + }, + { + "department": "Crew", + "jobs": [ + "Special Effects", + "Post Production Supervisor", + "Second Unit", + "Choreographer", + "Stunts", + "Stunt Coordinator", + "Special Effects Coordinator", + "Supervising Technical Director", + "Supervising Animator", + "Production Artist", + "Sequence Lead", + "Second Film Editor", + "Temp Music Editor", + "Temp Sound Editor", + "Sequence Supervisor", + "Software Team Lead", + "Software Engineer", + "Documentation & Support", + "Machinist", + "Photoscience Manager", + "Department Administrator", + "Schedule Coordinator", + "Supervisor of Production Resources", + "Production Office Assistant", + "Information Systems Manager", + "Systems Administrators & Support", + "Projection", + "Post Production Assistant", + "Sound Design Assistant", + "Mix Technician", + "Motion Actor", + "Sets & Props Supervisor", + "Compositor", + "Tattooist", + "Sets & Props Artist", + "Motion Capture Artist", + "Sequence Artist", + "Mixing Engineer", + "Special Sound Effects", + "Post-Production Manager", + "Dialect Coach", + "Picture Car Coordinator", + "Cableman", + "Set Production Assistant", + "Video Assist Operator", + "Unit Publicist", + "Set Medic", + "Stand In", + "Transportation Coordinator", + "Transportation Captain", + "Post Production Consulting", + "Production Intern", + "Utility Stunts", + "Actor's Assistant", + "Set Production Intern", + "Production Controller", + "Studio Teacher", + "Chef", + "Craft Service", + "Scenic Artist", + "Propmaker", + "Prop Maker", + "Transportation Co-Captain", + "Driver", + "Security", + "Second Unit Cinematographer", + "Loader", + "Manager of Operations", + "Quality Control Supervisor", + "Legal Services", + "Public Relations", + "Score Engineer", + "Translator", + "Title Graphics", + "Telecine Colorist", + "Animatronic and Prosthetic Effects", + "Martial Arts Choreographer", + "Cinematography", + "Steadycam", + "Executive Visual Effects Producer", + "Visual Effects Design Consultant", + "Digital Effects Supervisor", + "Digital Producer", + "CG Supervisor", + "Visual Effects Art Director", + "Visual Effects Editor", + "Executive in Charge of Finance", + "Associate Choreographer", + "Makeup Effects", + "Treatment", + "Dramaturgy", + "Lighting Camera", + "Technical Supervisor", + "CGI Supervisor", + "Creative Consultant", + "Script", + "Executive Music Producer", + "Commissioning Editor", + "Additional Writing", + "Additional Music", + "Poem", + "Thanks", + "Creator", + "Additional Dialogue", + "Video Game", + "Graphic Novel Illustrator", + "Other", + "Series Writer", + "Radio Play", + "Armorer", + "Carpenter", + "Editorial Staff", + "Aerial Coordinator", + "Animal Coordinator", + "Animal Wrangler", + "Animatronics Designer", + "Drone Operator", + "In Memory Of", + "Pilot", + "Presenter", + "Animatronics Supervisor", + "Armory Coordinator", + "Digital Effects Producer", + "Fight Choreographer", + "Marine Coordinator", + "Pyrotechnician", + "Techno Crane Operator", + "Acting Double", + "Additional Script Supervisor", + "Administrative Assistant", + "Assistant Chef", + "Assistant Craft Service", + "Assistant Picture Car Coordinator", + "Assistant Script", + "Assistant Vehicles Coordinator", + "Base Camp Operator", + "Captain Driver", + "Cast Driver", + "Catering", + "Catering Head Chef", + "Chaperone", + "Chaperone Tutor", + "Charge Scenic Artist", + "Child Wrangler", + "Clearances Coordinator", + "Clearances Consultant", + "Dialogue Coach", + "Digital Supervisor", + "Director of Communications", + "File Footage", + "Film Processor", + "Floor Runner", + "Generator Operator", + "Head Driver", + "Health and Safety", + "Interactive Manager", + "Intern", + "Key Scenic Artist", + "Key Special Effects", + "Logistics Coordinator", + "Marine Pilot", + "Master at Arms", + "Medical Consultant", + "Military Consultant", + "Playback Coordinator", + "Police Consultant", + "Post Production Scripts", + "Receptionist", + "Scientific Consultant", + "Security Coordinator", + "Series Publicist", + "Set Runner", + "Special Effects Assistant", + "Special Effects Best Boy", + "Special Effects Manager", + "Special Effects Technician", + "Specialized Driver", + "Sponsorship Coordinator", + "Sponsorship Director", + "Stunt Double", + "Stunt Driver", + "Supervising Armorer", + "Technical Advisor", + "Transcriptions", + "Unit Medic", + "Vehicles Coordinator", + "Vehicles Wrangler", + "Weapons Master", + "Weapons Wrangler" + ] + }, + { + "department": "Lighting", + "jobs": [ + "Lighting Technician", + "Best Boy Electric", + "Gaffer", + "Rigging Gaffer", + "Lighting Supervisor", + "Lighting Manager", + "Directing Lighting Artist", + "Master Lighting Artist", + "Lighting Artist", + "Lighting Coordinator", + "Lighting Production Assistant", + "Best Boy Electrician", + "Electrician", + "Rigging Grip", + "Other", + "Chief Lighting Technician", + "Lighting Director", + "Rigging Supervisor", + "Underwater Gaffer", + "Additional Gaffer", + "Additional Lighting Technician", + "Assistant Chief Lighting Technician", + "Assistant Electrician", + "Assistant Gaffer", + "Best Boy Lighting Technician", + "Daily Electrics", + "Genetator Operator", + "Key Rigging Grip", + "Lighting Design", + "Lighting Programmer", + "O.B. Lighting", + "Standby Rigger" + ] + }, + { + "department": "Editing", + "jobs": [ + "Editor", + "Supervising Film Editor", + "Additional Editing", + "Editorial Manager", + "First Assistant Editor", + "Additional Editorial Assistant", + "Editorial Coordinator", + "Editorial Production Assistant", + "Editorial Services", + "Archival Footage Coordinator", + "Archival Footage Research", + "Color Timer", + "Digital Intermediate", + "Other", + "Assistant Editor", + "Associate Editor", + "Co-Editor", + "Negative Cutter", + "3D Digital Colorist", + "3D Editor", + "Additional Colorist", + "Additional Editor", + "Assistant Picture Editor", + "Atmos Editor", + "Color Assistant", + "Color Grading", + "Colorist", + "Consulting Editor", + "Dailies Manager", + "Dailies Operator", + "Dailies Technician", + "Digital Color Timer", + "Digital Colorist", + "Digital Conform Editor", + "Digital Intermediate Assistant", + "Digital Intermediate Colorist", + "Digital Intermediate Data Wrangler", + "Digital Intermediate Editor", + "Digital Intermediate Producer", + "Editorial Consultant", + "EPK Editor", + "First Assistant Picture Editor", + "Lead Editor", + "Online Editor", + "Project Manager", + "Senior Colorist", + "Senior Digital Intermediate Colorist", + "Stereoscopic Editor", + "Supervising Editor" + ] + } +] diff --git a/tmdb-api/src/jvmTest/resources/tmdb3/genres/tv_list.json b/tmdb-api/src/jvmTest/resources/tmdb3/genres/tv_list.json new file mode 100644 index 0000000..f0936b9 --- /dev/null +++ b/tmdb-api/src/jvmTest/resources/tmdb3/genres/tv_list.json @@ -0,0 +1,68 @@ +{ + "genres": [ + { + "id": 10759, + "name": "Action & Adventure" + }, + { + "id": 16, + "name": "Animation" + }, + { + "id": 35, + "name": "Comedy" + }, + { + "id": 80, + "name": "Crime" + }, + { + "id": 99, + "name": "Documentary" + }, + { + "id": 18, + "name": "Drama" + }, + { + "id": 10751, + "name": "Family" + }, + { + "id": 10762, + "name": "Kids" + }, + { + "id": 9648, + "name": "Mystery" + }, + { + "id": 10763, + "name": "News" + }, + { + "id": 10764, + "name": "Reality" + }, + { + "id": 10765, + "name": "Sci-Fi & Fantasy" + }, + { + "id": 10766, + "name": "Soap" + }, + { + "id": 10767, + "name": "Talk" + }, + { + "id": 10768, + "name": "War & Politics" + }, + { + "id": 37, + "name": "Western" + } + ] +}