mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
feat(api): add movie keyword search
This commit is contained in:
@@ -1895,6 +1895,51 @@ paths:
|
|||||||
- $ref: '#/components/schemas/MovieResult'
|
- $ref: '#/components/schemas/MovieResult'
|
||||||
- $ref: '#/components/schemas/TvResult'
|
- $ref: '#/components/schemas/TvResult'
|
||||||
- $ref: '#/components/schemas/PersonResult'
|
- $ref: '#/components/schemas/PersonResult'
|
||||||
|
/discover/keyword/{keywordId}/movies:
|
||||||
|
get:
|
||||||
|
summary: Request list of movies from keyword
|
||||||
|
description: Returns list of movies based on provided keyword ID in JSON format
|
||||||
|
tags:
|
||||||
|
- search
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: keywordId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: number
|
||||||
|
example: 207317
|
||||||
|
- 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 movies
|
||||||
|
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/MovieResult'
|
||||||
/request:
|
/request:
|
||||||
get:
|
get:
|
||||||
summary: Get all requests
|
summary: Get all requests
|
||||||
|
@@ -542,6 +542,32 @@ class TheMovieDb {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getMoviesByKeyword({
|
||||||
|
keywordId,
|
||||||
|
page = 1,
|
||||||
|
language = 'en-US',
|
||||||
|
}: {
|
||||||
|
keywordId: number;
|
||||||
|
page?: number;
|
||||||
|
language?: string;
|
||||||
|
}): Promise<TmdbSearchMovieResponse> {
|
||||||
|
try {
|
||||||
|
const response = await this.axios.get<TmdbSearchMovieResponse>(
|
||||||
|
`/keyword/${keywordId}/movies`,
|
||||||
|
{
|
||||||
|
params: {
|
||||||
|
page,
|
||||||
|
language,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return response.data;
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(`[TMDB] Failed to fetch movies by keyword: ${e.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async getTvRecommendations({
|
public async getTvRecommendations({
|
||||||
tvId,
|
tvId,
|
||||||
page = 1,
|
page = 1,
|
||||||
|
@@ -121,4 +121,36 @@ discoverRoutes.get('/trending', async (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
discoverRoutes.get<{ keywordId: string }>(
|
||||||
|
'/keyword/:keywordId/movies',
|
||||||
|
async (req, res) => {
|
||||||
|
const tmdb = new TheMovieDb();
|
||||||
|
|
||||||
|
const data = await tmdb.getMoviesByKeyword({
|
||||||
|
keywordId: Number(req.params.keywordId),
|
||||||
|
page: Number(req.query.page),
|
||||||
|
language: req.query.language as string,
|
||||||
|
});
|
||||||
|
|
||||||
|
const media = await Media.getRelatedMedia(
|
||||||
|
data.results.map((result) => result.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
page: data.page,
|
||||||
|
totalPages: data.total_pages,
|
||||||
|
totalResults: data.total_results,
|
||||||
|
results: data.results.map((result) =>
|
||||||
|
mapMovieResult(
|
||||||
|
result,
|
||||||
|
media.find(
|
||||||
|
(req) =>
|
||||||
|
req.tmdbId === result.id && req.mediaType === MediaType.MOVIE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
export default discoverRoutes;
|
export default discoverRoutes;
|
||||||
|
Reference in New Issue
Block a user