Skip to content

Commit

Permalink
feat(frontend/api): tv details page
Browse files Browse the repository at this point in the history
  • Loading branch information
sct committed Sep 20, 2020
1 parent 8f21358 commit 02cbb5b
Show file tree
Hide file tree
Showing 12 changed files with 953 additions and 51 deletions.
60 changes: 59 additions & 1 deletion server/api/themoviedb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@ export interface TmdbTvDetails {
type: string;
vote_average: number;
vote_count: number;
credits: {
cast: TmdbCreditCast[];
crew: TmdbCreditCrew[];
};
}

class TheMovieDb {
Expand Down Expand Up @@ -304,7 +308,7 @@ class TheMovieDb {
}): Promise<TmdbTvDetails> => {
try {
const response = await this.axios.get<TmdbTvDetails>(`/tv/${tvId}`, {
params: { language },
params: { language, append_to_response: 'credits' },
});

return response.data;
Expand Down Expand Up @@ -365,6 +369,60 @@ class TheMovieDb {
}
}

public async getTvRecommendations({
tvId,
page = 1,
language = 'en-US',
}: {
tvId: number;
page?: number;
language?: string;
}): Promise<TmdbSearchTvResponse> {
try {
const response = await this.axios.get<TmdbSearchTvResponse>(
`/tv/${tvId}/recommendations`,
{
params: {
page,
language,
},
}
);

return response.data;
} catch (e) {
throw new Error(
`[TMDB] Failed to fetch tv recommendations: ${e.message}`
);
}
}

public async getTvSimilar({
tvId,
page = 1,
language = 'en-US',
}: {
tvId: number;
page?: number;
language?: string;
}): Promise<TmdbSearchTvResponse> {
try {
const response = await this.axios.get<TmdbSearchTvResponse>(
`/tv/${tvId}/similar`,
{
params: {
page,
language,
},
}
);

return response.data;
} catch (e) {
throw new Error(`[TMDB] Failed to fetch tv similar: ${e.message}`);
}
}

public getDiscoverMovies = async ({
sortBy = 'popularity.desc',
page = 1,
Expand Down
57 changes: 9 additions & 48 deletions server/models/Movie.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,13 @@
import {
TmdbMovieDetails,
TmdbCreditCast,
TmdbCreditCrew,
} from '../api/themoviedb';
import { TmdbMovieDetails } from '../api/themoviedb';
import { MediaRequest } from '../entity/MediaRequest';
import { ProductionCompany, Genre } from './common';

export interface Cast {
id: number;
castId: number;
character: string;
creditId: string;
gender?: number;
name: string;
order: number;
profilePath?: string;
}

export interface Crew {
id: number;
creditId: string;
department: string;
gender?: number;
job: string;
name: string;
profilePath?: string;
}
import {
ProductionCompany,
Genre,
Cast,
Crew,
mapCast,
mapCrew,
} from './common';

export interface MovieDetails {
id: number;
Expand Down Expand Up @@ -65,27 +47,6 @@ export interface MovieDetails {
request?: MediaRequest;
}

const mapCast = (person: TmdbCreditCast): Cast => ({
castId: person.cast_id,
character: person.character,
creditId: person.credit_id,
id: person.id,
name: person.name,
order: person.order,
gender: person.gender,
profilePath: person.profile_path,
});

const mapCrew = (person: TmdbCreditCrew): Crew => ({
creditId: person.credit_id,
department: person.department,
id: person.id,
job: person.job,
name: person.name,
gender: person.gender,
profilePath: person.profile_path,
});

export const mapMovieDetails = (
movie: TmdbMovieDetails,
request?: MediaRequest
Expand Down
17 changes: 16 additions & 1 deletion server/models/Tv.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { Genre, ProductionCompany } from './common';
import {
Genre,
ProductionCompany,
Cast,
Crew,
mapCast,
mapCrew,
} from './common';
import { MediaRequest } from '../entity/MediaRequest';
import {
TmdbTvEpisodeDetails,
Expand Down Expand Up @@ -64,6 +71,10 @@ export interface TvDetails {
type: string;
voteAverage: number;
voteCount: number;
credits: {
cast: Cast[];
crew: Crew[];
};
request?: MediaRequest;
}

Expand Down Expand Up @@ -140,5 +151,9 @@ export const mapTvDetails = (
? mapEpisodeDetails(show.next_episode_to_air)
: undefined,
posterPath: show.poster_path,
credits: {
cast: show.credits.cast.map(mapCast),
crew: show.credits.crew.map(mapCrew),
},
request,
});
44 changes: 44 additions & 0 deletions server/models/common.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { TmdbCreditCast, TmdbCreditCrew } from '../api/themoviedb';

export interface ProductionCompany {
id: number;
logoPath?: string;
Expand All @@ -9,3 +11,45 @@ export interface Genre {
id: number;
name: string;
}

export interface Cast {
id: number;
castId: number;
character: string;
creditId: string;
gender?: number;
name: string;
order: number;
profilePath?: string;
}

export interface Crew {
id: number;
creditId: string;
department: string;
gender?: number;
job: string;
name: string;
profilePath?: string;
}

export const mapCast = (person: TmdbCreditCast): Cast => ({
castId: person.cast_id,
character: person.character,
creditId: person.credit_id,
id: person.id,
name: person.name,
order: person.order,
gender: person.gender,
profilePath: person.profile_path,
});

export const mapCrew = (person: TmdbCreditCrew): Crew => ({
creditId: person.credit_id,
department: person.department,
id: person.id,
job: person.job,
name: person.name,
gender: person.gender,
profilePath: person.profile_path,
});
106 changes: 106 additions & 0 deletions server/overseerr-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,17 @@ components:
type: number
voteCount:
type: number
credits:
type: object
properties:
cast:
type: array
items:
$ref: '#/components/schemas/Cast'
crew:
type: array
items:
$ref: '#/components/schemas/Crew'
request:
$ref: '#/components/schemas/MediaRequest'
MediaRequest:
Expand Down Expand Up @@ -1415,13 +1426,108 @@ paths:
schema:
type: number
example: 76479
- in: query
name: language
schema:
type: string
example: en
responses:
'200':
description: TV details
content:
application/json:
schema:
$ref: '#/components/schemas/TvDetails'
/tv/{tvId}/recommendations:
get:
summary: Request recommended tv series
description: Returns list of recommended tv series based on provided tv ID in JSON format
tags:
- tv
parameters:
- in: path
name: tvId
required: true
schema:
type: number
example: 76479
- in: query
name: page
schema:
type: number
example: 1
default: 1
- in: query
name: language
schema:
type: string
example: en
responses:
'200':
description: List of tv series
content:
application/json:
schema:
type: object
properties:
page:
type: number
example: 1
totalPages:
type: number
example: 20
totalResults:
type: number
example: 200
results:
type: array
items:
$ref: '#/components/schemas/TvResult'
/tv/{tvId}/similar:
get:
summary: Request similar tv series
description: Returns list of similar tv series based on provided movie ID in JSON format
tags:
- tv
parameters:
- in: path
name: tvId
required: true
schema:
type: number
example: 76479
- in: query
name: page
schema:
type: number
example: 1
default: 1
- in: query
name: language
schema:
type: string
example: en
responses:
'200':
description: List of tv series
content:
application/json:
schema:
type: object
properties:
page:
type: number
example: 1
totalPages:
type: number
example: 20
totalResults:
type: number
example: 200
results:
type: array
items:
$ref: '#/components/schemas/TvResult'

security:
- cookieAuth: []

0 comments on commit 02cbb5b

Please sign in to comment.