Update 2 files

- /src/api.ts
- /src/lib/api.ts
This commit is contained in:
2025-01-16 15:45:32 +00:00
parent 38cc458fe7
commit 22be996125
2 changed files with 59 additions and 206 deletions

View File

@@ -1,97 +0,0 @@
import axios from 'axios';
const BASE_URL = '/api/movies';
if (typeof window === 'undefined' && !process.env.NEXT_PUBLIC_TMDB_ACCESS_TOKEN) {
throw new Error('TMDB_ACCESS_TOKEN is not defined in environment variables');
}
export const api = axios.create({
baseURL: BASE_URL,
headers: {
'Content-Type': 'application/json'
}
});
export interface MovieDetails extends Movie {
genres: Genre[];
runtime: number;
tagline: string;
budget: number;
revenue: number;
videos: {{
"page": 1,
"results": [
{
"id": 123,
"title": "Movie Title",
"overview": "Movie description",
"poster_path": "/path/to/poster.jpg",
...
},
...
],
"total_pages": 500,
"total_results": 10000
}
results: Video[];
};
credits: {
cast: Cast[];
crew: Crew[];
};
}
export interface Video {
id: string;
key: string;
name: string;
site: string;
type: string;
}
export interface Cast {
id: number;
name: string;
character: string;
profile_path: string | null;
}
export interface Crew {
id: number;
name: string;
job: string;
profile_path: string | null;
}
export const moviesAPI = {
// Получение популярных фильмов
async getPopular(page = 1) {
const response = await api.get(`/popular?page=${page}`);
return response.data;
},
// Получение данных о фильме
async getMovie(id: string | number) {
const response = await api.get(`/${id}`);
return response.data;
},
// Поиск фильмов
async searchMovies(query: string, page = 1) {
const response = await api.get(`/search?query=${encodeURIComponent(query)}&page=${page}`);
return response.data;
},
// Получение предстоящих фильмов
async getUpcoming(page = 1) {
const response = await api.get(`/upcoming?page=${page}`);
return response.data;
},
// Получение топ рейтинговых фильмов
async getTopRated(page = 1) {
const response = await api.get(`/top-rated?page=${page}`);
return response.data;
}
};

View File

@@ -1,15 +1,14 @@
import axios from 'axios'; import axios from 'axios';
const BASE_URL = 'https://api.themoviedb.org/3'; const API_URL = process.env.NEXT_PUBLIC_API_URL;
if (typeof window === 'undefined' && !process.env.NEXT_PUBLIC_TMDB_ACCESS_TOKEN) { if (!API_URL) {
throw new Error('TMDB_ACCESS_TOKEN is not defined in environment variables'); throw new Error('NEXT_PUBLIC_API_URL is not defined in environment variables');
} }
export const api = axios.create({ export const api = axios.create({
baseURL: BASE_URL, baseURL: API_URL,
headers: { headers: {
'Authorization': `Bearer ${process.env.NEXT_PUBLIC_TMDB_ACCESS_TOKEN}`,
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }
}); });
@@ -104,14 +103,14 @@ export interface Crew {
profile_path: string | null; profile_path: string | null;
} }
interface MovieResponse { export interface MovieResponse {
page: number; page: number;
results: Movie[]; results: Movie[];
total_pages: number; total_pages: number;
total_results: number; total_results: number;
} }
interface TVShowResponse { export interface TVShowResponse {
page: number; page: number;
results: TVShow[]; results: TVShow[];
total_pages: number; total_pages: number;
@@ -120,136 +119,87 @@ interface TVShowResponse {
export const moviesAPI = { export const moviesAPI = {
// Получение популярных фильмов // Получение популярных фильмов
getPopular: (page = 1) => getPopular(page = 1) {
api.get<MovieResponse>('/movie/popular', { return api.get<MovieResponse>('/movies/popular', {
params: { params: { page }
page, });
language: 'ru-RU', },
}
}),
// Получение данных о фильме по его TMDB ID // Получение данных о фильме по его TMDB ID
getMovie: (id: string | number) => getMovie(id: string | number) {
api.get<MovieDetails>(`/movie/${id}`, { return api.get<MovieDetails>(`/movies/${id}`);
params: { },
language: 'ru-RU',
append_to_response: 'credits,videos,similar'
}
}),
// Получение IMDb ID по TMDB ID для плеера // Получение IMDb ID по TMDB ID для плеера
getImdbId: async (tmdbId: string | number) => { getImdbId(tmdbId: string | number) {
try { return api.get<{ imdb_id: string }>(`/movies/${tmdbId}/external-ids`);
const response = await api.get(`/movie/${tmdbId}/external_ids`);
return response.data.imdb_id;
} catch (error) {
console.error('Ошибка при получении IMDb ID:', error);
return null;
}
}, },
// Получение видео по TMDB ID для плеера // Получение видео по TMDB ID для плеера
getVideo: async (tmdbId: string | number) => { getVideo(tmdbId: string | number) {
try { return api.get<{ results: Video[] }>(`/movies/${tmdbId}/videos`);
const response = await api.get(`/movie/${tmdbId}/videos`, {
params: {
language: 'ru-RU',
},
});
return response.data.results;
} catch (error) {
console.error('Ошибка при получении видео:', error);
return [];
}
}, },
// Поиск фильмов // Поиск фильмов
searchMovies: (query: string, page = 1) => searchMovies(query: string, page = 1) {
api.get<MovieResponse>('/search/movie', { return api.get<MovieResponse>('/movies/search', {
params: { params: { query, page }
query, });
page, },
language: 'ru-RU',
}
}),
// Получение предстоящих фильмов // Получение предстоящих фильмов
getUpcoming: (page = 1) => getUpcoming(page = 1) {
api.get('/movie/upcoming', { return api.get<MovieResponse>('/movies/upcoming', {
params: { params: { page }
page, });
language: 'ru-RU', },
}
}),
// Получение лучших фильмов // Получение лучших фильмов
getTopRated: (page = 1) => getTopRated(page = 1) {
api.get('/movie/top_rated', { return api.get<MovieResponse>('/movies/top-rated', {
params: { params: { page }
page, });
language: 'ru-RU', },
'vote_count.gte': 100
}
}),
// Получение фильмов по жанру // Получение фильмов по жанру
getMoviesByGenre: (genreId: number, page = 1) => getMoviesByGenre(genreId: number, page = 1) {
api.get('/discover/movie', { return api.get<MovieResponse>('/movies/genre/' + genreId, {
params: { params: { page }
with_genres: genreId, });
page, }
language: 'ru-RU',
'vote_count.gte': 100,
'vote_average.gte': 1,
sort_by: 'popularity.desc',
include_adult: false,
'primary_release_date.lte': new Date().toISOString().split('T')[0]
}
}),
}; };
export const tvAPI = { export const tvAPI = {
// Получение популярных сериалов // Получение популярных сериалов
getPopular: (page = 1) => getPopular(page = 1) {
api.get<TVShowResponse>('/tv/popular', { return api.get<TVShowResponse>('/tv/popular', {
params: { params: { page }
page, });
language: 'ru-RU', },
}
}),
// Получение данных о сериале по его TMDB ID // Получение данных о сериале по его TMDB ID
getShow: (id: string | number) => getShow(id: string | number) {
api.get<TVShowDetails>(`/tv/${id}`, { return api.get<TVShowDetails>(`/tv/${id}`);
params: { },
language: 'ru-RU',
append_to_response: 'credits,external_ids',
}
}),
// Получение IMDb ID по TMDB ID для плеера // Получение IMDb ID по TMDB ID для плеера
getImdbId: (tmdbId: string | number) => getImdbId(tmdbId: string | number) {
api.get<{ imdb_id: string | null }>(`/tv/${tmdbId}/external_ids`), return api.get<{ imdb_id: string }>(`/tv/${tmdbId}/external-ids`);
},
// Поиск сериалов // Поиск сериалов
searchShows: (query: string, page = 1) => searchShows(query: string, page = 1) {
api.get<TVShowResponse>('/search/tv', { return api.get<TVShowResponse>('/tv/search', {
params: { params: { query, page }
query, });
page, }
language: 'ru-RU',
}
}),
}; };
// Мультипоиск (фильмы и сериалы) // Мультипоиск (фильмы и сериалы)
export const searchAPI = { export const searchAPI = {
multiSearch: (query: string, page = 1) => multiSearch(query: string, page = 1) {
api.get('/search/multi', { return api.get('/search/multi', {
params: { params: { query, page }
query, });
page, }
language: 'ru-RU',
}
}),
}; };