From 18877a2da226b153559e235cdc4897a8493ceb7a Mon Sep 17 00:00:00 2001 From: degradin Date: Wed, 7 May 2025 13:32:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20TMDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/mediaService.js | 93 ++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 8 deletions(-) diff --git a/src/services/mediaService.js b/src/services/mediaService.js index 62a5605..fdb3b0a 100644 --- a/src/services/mediaService.js +++ b/src/services/mediaService.js @@ -1,11 +1,13 @@ import axios from 'axios'; const IMDB_API_URL = 'https://imdb.iamidiotareyoutoo.com'; +const TMDB_API_KEY = import.meta.env.VITE_TMDB_API_KEY; +const TMDB_BASE_URL = 'https://api.themoviedb.org/3'; export const mediaTypes = { MOVIE: 'movie', - TV: 'tv', - ALL: 'all' // Добавлено + TV: 'series', + GAME: 'game' }; function isLocalStorageAvailable() { @@ -86,15 +88,59 @@ export async function getMediaById(id) { } } -export async function searchMedia(query) { +export const searchMedia = async (query, type = 'movie') => { try { - if (!query || !query.trim()) return []; - return await searchIMDb(query, mediaTypes.ALL); + const response = await fetch( + `${TMDB_BASE_URL}/search/${type}?api_key=${TMDB_API_KEY}&query=${encodeURIComponent(query)}&language=ru-RU` + ); + + if (!response.ok) { + throw new Error('Failed to fetch from TMDB'); + } + + const data = await response.json(); + return data.results.map(item => ({ + title: item.title || item.name, + description: item.overview, + poster_url: item.poster_path ? `https://image.tmdb.org/t/p/w500${item.poster_path}` : null, + release_date: item.release_date || item.first_air_date, + type: type, + tmdb_id: item.id, + rating: item.vote_average + })); } catch (error) { console.error('Error searching media:', error); - return []; + throw error; } -} +}; + +export const getMediaDetails = async (tmdbId, type = 'movie') => { + try { + const response = await fetch( + `${TMDB_BASE_URL}/${type}/${tmdbId}?api_key=${TMDB_API_KEY}&language=ru-RU` + ); + + if (!response.ok) { + throw new Error('Failed to fetch media details'); + } + + const data = await response.json(); + return { + title: data.title || data.name, + description: data.overview, + poster_url: data.poster_path ? `https://image.tmdb.org/t/p/w500${data.poster_path}` : null, + release_date: data.release_date || data.first_air_date, + type: type, + tmdb_id: data.id, + rating: data.vote_average, + genres: data.genres.map(g => g.name).join(', '), + runtime: data.runtime || data.episode_run_time?.[0] || null + }; + } catch (error) { + console.error('Error fetching media details:', error); + throw error; + } +}; export async function addMedia(mediaData) { try { @@ -128,4 +174,35 @@ export async function addMedia(mediaData) { console.error('Error adding media:', error); throw error; } -} \ No newline at end of file +} + +export const validateMediaData = (data) => { + const errors = []; + + if (!data.title?.trim()) { + errors.push('Название обязательно'); + } + + if (!data.type || !Object.values(mediaTypes).includes(data.type)) { + errors.push('Неверный тип медиа'); + } + + if (data.rating && (isNaN(data.rating) || data.rating < 0 || data.rating > 10)) { + errors.push('Рейтинг должен быть от 0 до 10'); + } + + return errors; +}; + +export const formatMediaData = (data) => { + return { + title: data.title?.trim(), + description: data.description?.trim() || '', + type: data.type, + poster_url: data.poster_url?.trim() || null, + release_date: data.release_date || null, + rating: data.rating ? parseFloat(data.rating) : null, + genres: data.genres?.trim() || '', + runtime: data.runtime ? parseInt(data.runtime) : null + }; +}; \ No newline at end of file