mirror of
https://gitlab.com/foxixus/neomovies.git
synced 2025-10-27 17:38:50 +05:00
Update 2 files
- /src/api.ts - /src/lib/api.ts
This commit is contained in:
97
src/api.ts
97
src/api.ts
@@ -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;
|
||||
}
|
||||
};
|
||||
162
src/lib/api.ts
162
src/lib/api.ts
@@ -1,15 +1,14 @@
|
||||
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) {
|
||||
throw new Error('TMDB_ACCESS_TOKEN is not defined in environment variables');
|
||||
if (!API_URL) {
|
||||
throw new Error('NEXT_PUBLIC_API_URL is not defined in environment variables');
|
||||
}
|
||||
|
||||
export const api = axios.create({
|
||||
baseURL: BASE_URL,
|
||||
baseURL: API_URL,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${process.env.NEXT_PUBLIC_TMDB_ACCESS_TOKEN}`,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
@@ -104,14 +103,14 @@ export interface Crew {
|
||||
profile_path: string | null;
|
||||
}
|
||||
|
||||
interface MovieResponse {
|
||||
export interface MovieResponse {
|
||||
page: number;
|
||||
results: Movie[];
|
||||
total_pages: number;
|
||||
total_results: number;
|
||||
}
|
||||
|
||||
interface TVShowResponse {
|
||||
export interface TVShowResponse {
|
||||
page: number;
|
||||
results: TVShow[];
|
||||
total_pages: number;
|
||||
@@ -120,136 +119,87 @@ interface TVShowResponse {
|
||||
|
||||
export const moviesAPI = {
|
||||
// Получение популярных фильмов
|
||||
getPopular: (page = 1) =>
|
||||
api.get<MovieResponse>('/movie/popular', {
|
||||
params: {
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
}
|
||||
}),
|
||||
getPopular(page = 1) {
|
||||
return api.get<MovieResponse>('/movies/popular', {
|
||||
params: { page }
|
||||
});
|
||||
},
|
||||
|
||||
// Получение данных о фильме по его TMDB ID
|
||||
getMovie: (id: string | number) =>
|
||||
api.get<MovieDetails>(`/movie/${id}`, {
|
||||
params: {
|
||||
language: 'ru-RU',
|
||||
append_to_response: 'credits,videos,similar'
|
||||
}
|
||||
}),
|
||||
getMovie(id: string | number) {
|
||||
return api.get<MovieDetails>(`/movies/${id}`);
|
||||
},
|
||||
|
||||
// Получение IMDb ID по TMDB ID для плеера
|
||||
getImdbId: async (tmdbId: string | number) => {
|
||||
try {
|
||||
const response = await api.get(`/movie/${tmdbId}/external_ids`);
|
||||
return response.data.imdb_id;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении IMDb ID:', error);
|
||||
return null;
|
||||
}
|
||||
getImdbId(tmdbId: string | number) {
|
||||
return api.get<{ imdb_id: string }>(`/movies/${tmdbId}/external-ids`);
|
||||
},
|
||||
|
||||
// Получение видео по TMDB ID для плеера
|
||||
getVideo: async (tmdbId: string | number) => {
|
||||
try {
|
||||
const response = await api.get(`/movie/${tmdbId}/videos`, {
|
||||
params: {
|
||||
language: 'ru-RU',
|
||||
},
|
||||
});
|
||||
return response.data.results;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении видео:', error);
|
||||
return [];
|
||||
}
|
||||
getVideo(tmdbId: string | number) {
|
||||
return api.get<{ results: Video[] }>(`/movies/${tmdbId}/videos`);
|
||||
},
|
||||
|
||||
// Поиск фильмов
|
||||
searchMovies: (query: string, page = 1) =>
|
||||
api.get<MovieResponse>('/search/movie', {
|
||||
params: {
|
||||
query,
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
}
|
||||
}),
|
||||
searchMovies(query: string, page = 1) {
|
||||
return api.get<MovieResponse>('/movies/search', {
|
||||
params: { query, page }
|
||||
});
|
||||
},
|
||||
|
||||
// Получение предстоящих фильмов
|
||||
getUpcoming: (page = 1) =>
|
||||
api.get('/movie/upcoming', {
|
||||
params: {
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
}
|
||||
}),
|
||||
getUpcoming(page = 1) {
|
||||
return api.get<MovieResponse>('/movies/upcoming', {
|
||||
params: { page }
|
||||
});
|
||||
},
|
||||
|
||||
// Получение лучших фильмов
|
||||
getTopRated: (page = 1) =>
|
||||
api.get('/movie/top_rated', {
|
||||
params: {
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
'vote_count.gte': 100
|
||||
}
|
||||
}),
|
||||
getTopRated(page = 1) {
|
||||
return api.get<MovieResponse>('/movies/top-rated', {
|
||||
params: { page }
|
||||
});
|
||||
},
|
||||
|
||||
// Получение фильмов по жанру
|
||||
getMoviesByGenre: (genreId: number, page = 1) =>
|
||||
api.get('/discover/movie', {
|
||||
params: {
|
||||
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]
|
||||
getMoviesByGenre(genreId: number, page = 1) {
|
||||
return api.get<MovieResponse>('/movies/genre/' + genreId, {
|
||||
params: { page }
|
||||
});
|
||||
}
|
||||
}),
|
||||
};
|
||||
|
||||
export const tvAPI = {
|
||||
// Получение популярных сериалов
|
||||
getPopular: (page = 1) =>
|
||||
api.get<TVShowResponse>('/tv/popular', {
|
||||
params: {
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
}
|
||||
}),
|
||||
getPopular(page = 1) {
|
||||
return api.get<TVShowResponse>('/tv/popular', {
|
||||
params: { page }
|
||||
});
|
||||
},
|
||||
|
||||
// Получение данных о сериале по его TMDB ID
|
||||
getShow: (id: string | number) =>
|
||||
api.get<TVShowDetails>(`/tv/${id}`, {
|
||||
params: {
|
||||
language: 'ru-RU',
|
||||
append_to_response: 'credits,external_ids',
|
||||
}
|
||||
}),
|
||||
getShow(id: string | number) {
|
||||
return api.get<TVShowDetails>(`/tv/${id}`);
|
||||
},
|
||||
|
||||
// Получение IMDb ID по TMDB ID для плеера
|
||||
getImdbId: (tmdbId: string | number) =>
|
||||
api.get<{ imdb_id: string | null }>(`/tv/${tmdbId}/external_ids`),
|
||||
getImdbId(tmdbId: string | number) {
|
||||
return api.get<{ imdb_id: string }>(`/tv/${tmdbId}/external-ids`);
|
||||
},
|
||||
|
||||
// Поиск сериалов
|
||||
searchShows: (query: string, page = 1) =>
|
||||
api.get<TVShowResponse>('/search/tv', {
|
||||
params: {
|
||||
query,
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
searchShows(query: string, page = 1) {
|
||||
return api.get<TVShowResponse>('/tv/search', {
|
||||
params: { query, page }
|
||||
});
|
||||
}
|
||||
}),
|
||||
};
|
||||
|
||||
// Мультипоиск (фильмы и сериалы)
|
||||
export const searchAPI = {
|
||||
multiSearch: (query: string, page = 1) =>
|
||||
api.get('/search/multi', {
|
||||
params: {
|
||||
query,
|
||||
page,
|
||||
language: 'ru-RU',
|
||||
multiSearch(query: string, page = 1) {
|
||||
return api.get('/search/multi', {
|
||||
params: { query, page }
|
||||
});
|
||||
}
|
||||
}),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user