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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
168
src/lib/api.ts
168
src/lib/api.ts
@@ -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',
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user