mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-28 18:08:51 +05:00
Fix search
This commit is contained in:
@@ -96,7 +96,8 @@ class TMDBClient {
|
|||||||
return date <= currentDate;
|
return date <= currentDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
filterAndProcessResults(results, type = 'movie') {
|
filterAndProcessResults(results, type) {
|
||||||
|
// Проверяем, что результаты - это массив
|
||||||
if (!Array.isArray(results)) {
|
if (!Array.isArray(results)) {
|
||||||
console.error('Expected results to be an array, got:', typeof results);
|
console.error('Expected results to be an array, got:', typeof results);
|
||||||
return [];
|
return [];
|
||||||
@@ -112,19 +113,18 @@ class TMDBClient {
|
|||||||
|
|
||||||
// Проверяем название (для фильмов - title, для сериалов - name)
|
// Проверяем название (для фильмов - title, для сериалов - name)
|
||||||
const title = type === 'movie' ? item.title : item.name;
|
const title = type === 'movie' ? item.title : item.name;
|
||||||
const isNumericTitle = /^\d+$/.test(title || '');
|
|
||||||
const hasCyrillic = /[а-яА-ЯёЁ]/.test(title || '');
|
// Убираем проверку на кириллицу, разрешаем любые названия
|
||||||
const hasValidTitle = isNumericTitle || hasCyrillic;
|
if (!title) {
|
||||||
|
console.log(`Skipping ${type} - no title`);
|
||||||
if (!hasValidTitle) {
|
|
||||||
console.log(`Skipping ${type} - invalid title:`, title);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Проверяем рейтинг
|
// Проверяем рейтинг, но снижаем требования
|
||||||
const hasValidRating = item.vote_average > 0;
|
// Разрешаем любой рейтинг, даже если он равен 0
|
||||||
if (!hasValidRating) {
|
// Это позволит находить новые фильмы и сериалы без рейтинга
|
||||||
console.log(`Skipping ${type} - no rating:`, title);
|
if (item.vote_average === undefined) {
|
||||||
|
console.log(`Skipping ${type} - no rating info:`, title);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,15 +144,53 @@ class TMDBClient {
|
|||||||
const pageNum = parseInt(page, 10) || 1;
|
const pageNum = parseInt(page, 10) || 1;
|
||||||
console.log('Searching movies:', { query, page: pageNum });
|
console.log('Searching movies:', { query, page: pageNum });
|
||||||
|
|
||||||
const response = await this.makeRequest('GET', '/search/movie', {
|
try {
|
||||||
query,
|
// Сначала пробуем поиск по стандартному запросу
|
||||||
page: pageNum,
|
const response = await this.makeRequest('GET', '/search/movie', {
|
||||||
include_adult: false
|
params: {
|
||||||
});
|
query,
|
||||||
|
page: pageNum,
|
||||||
const data = response.data;
|
include_adult: false
|
||||||
data.results = this.filterAndProcessResults(data.results, 'movie');
|
}
|
||||||
return data;
|
});
|
||||||
|
|
||||||
|
const data = response.data;
|
||||||
|
data.results = this.filterAndProcessResults(data.results, 'movie');
|
||||||
|
|
||||||
|
// Если нет результатов, попробуем поиск по альтернативным параметрам
|
||||||
|
if (data.results.length === 0 && query) {
|
||||||
|
console.log('No results from primary search, trying alternative search...');
|
||||||
|
|
||||||
|
// Выполним поиск по популярным фильмам и отфильтруем результаты локально
|
||||||
|
const popularResponse = await this.makeRequest('GET', '/movie/popular', {
|
||||||
|
params: {
|
||||||
|
page: 1,
|
||||||
|
region: '', // Снимаем ограничение региона
|
||||||
|
language: 'ru-RU'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const queryLower = query.toLowerCase();
|
||||||
|
const filteredResults = popularResponse.data.results.filter(movie => {
|
||||||
|
// Проверяем совпадение в названии и оригинальном названии
|
||||||
|
const titleMatch = (movie.title || '').toLowerCase().includes(queryLower);
|
||||||
|
const originalTitleMatch = (movie.original_title || '').toLowerCase().includes(queryLower);
|
||||||
|
return titleMatch || originalTitleMatch;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Found ${filteredResults.length} results in alternative search`);
|
||||||
|
|
||||||
|
if (filteredResults.length > 0) {
|
||||||
|
data.results = this.filterAndProcessResults(filteredResults, 'movie');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error in searchMovies:', error);
|
||||||
|
// Возвращаем пустой результат в случае ошибки
|
||||||
|
return { results: [], total_results: 0, total_pages: 0, page: pageNum };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPopularMovies(page = 1) {
|
async getPopularMovies(page = 1) {
|
||||||
@@ -160,7 +198,9 @@ class TMDBClient {
|
|||||||
console.log('Getting popular movies:', { page: pageNum });
|
console.log('Getting popular movies:', { page: pageNum });
|
||||||
|
|
||||||
const response = await this.makeRequest('GET', '/movie/popular', {
|
const response = await this.makeRequest('GET', '/movie/popular', {
|
||||||
page: pageNum
|
params: {
|
||||||
|
page: pageNum
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = response.data;
|
const data = response.data;
|
||||||
@@ -171,7 +211,9 @@ class TMDBClient {
|
|||||||
async getTopRatedMovies(page = 1) {
|
async getTopRatedMovies(page = 1) {
|
||||||
const pageNum = parseInt(page, 10) || 1;
|
const pageNum = parseInt(page, 10) || 1;
|
||||||
const response = await this.makeRequest('GET', '/movie/top_rated', {
|
const response = await this.makeRequest('GET', '/movie/top_rated', {
|
||||||
page: pageNum
|
params: {
|
||||||
|
page: pageNum
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = response.data;
|
const data = response.data;
|
||||||
@@ -182,7 +224,9 @@ class TMDBClient {
|
|||||||
async getUpcomingMovies(page = 1) {
|
async getUpcomingMovies(page = 1) {
|
||||||
const pageNum = parseInt(page, 10) || 1;
|
const pageNum = parseInt(page, 10) || 1;
|
||||||
const response = await this.makeRequest('GET', '/movie/upcoming', {
|
const response = await this.makeRequest('GET', '/movie/upcoming', {
|
||||||
page: pageNum
|
params: {
|
||||||
|
page: pageNum
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = response.data;
|
const data = response.data;
|
||||||
@@ -209,13 +253,15 @@ class TMDBClient {
|
|||||||
const response = await this.makeRequest('GET', `/movie/${id}/videos`);
|
const response = await this.makeRequest('GET', `/movie/${id}/videos`);
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получение жанров фильмов
|
// Получение жанров фильмов
|
||||||
async getMovieGenres() {
|
async getMovieGenres() {
|
||||||
console.log('Getting movie genres');
|
console.log('Getting movie genres');
|
||||||
try {
|
try {
|
||||||
const response = await this.makeRequest('GET', '/genre/movie/list', {
|
const response = await this.makeRequest('GET', '/genre/movie/list', {
|
||||||
language: 'ru'
|
params: {
|
||||||
|
language: 'ru'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -229,7 +275,9 @@ class TMDBClient {
|
|||||||
console.log('Getting TV genres');
|
console.log('Getting TV genres');
|
||||||
try {
|
try {
|
||||||
const response = await this.makeRequest('GET', '/genre/tv/list', {
|
const response = await this.makeRequest('GET', '/genre/tv/list', {
|
||||||
language: 'ru'
|
params: {
|
||||||
|
language: 'ru'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -281,7 +329,9 @@ class TMDBClient {
|
|||||||
console.log('Getting popular TV shows:', { page: pageNum });
|
console.log('Getting popular TV shows:', { page: pageNum });
|
||||||
|
|
||||||
const response = await this.makeRequest('GET', '/tv/popular', {
|
const response = await this.makeRequest('GET', '/tv/popular', {
|
||||||
page: pageNum
|
params: {
|
||||||
|
page: pageNum
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -294,16 +344,53 @@ class TMDBClient {
|
|||||||
const pageNum = parseInt(page, 10) || 1;
|
const pageNum = parseInt(page, 10) || 1;
|
||||||
console.log('Searching TV shows:', { query, page: pageNum });
|
console.log('Searching TV shows:', { query, page: pageNum });
|
||||||
|
|
||||||
const response = await this.makeRequest('GET', '/search/tv', {
|
try {
|
||||||
query,
|
// Сначала пробуем стандартный поиск
|
||||||
page: pageNum,
|
const response = await this.makeRequest('GET', '/search/tv', {
|
||||||
include_adult: false
|
params: {
|
||||||
});
|
query,
|
||||||
|
page: pageNum,
|
||||||
return {
|
include_adult: false
|
||||||
...response.data,
|
}
|
||||||
results: this.filterAndProcessResults(response.data.results, 'tv')
|
});
|
||||||
};
|
|
||||||
|
const data = response.data;
|
||||||
|
data.results = this.filterAndProcessResults(data.results, 'tv');
|
||||||
|
|
||||||
|
// Если нет результатов, попробуем поиск по альтернативным параметрам
|
||||||
|
if (data.results.length === 0 && query) {
|
||||||
|
console.log('No results from primary TV search, trying alternative search...');
|
||||||
|
|
||||||
|
// Выполним поиск по популярным сериалам и отфильтруем результаты локально
|
||||||
|
const popularResponse = await this.makeRequest('GET', '/tv/popular', {
|
||||||
|
params: {
|
||||||
|
page: 1,
|
||||||
|
region: '', // Снимаем ограничение региона
|
||||||
|
language: 'ru-RU'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const queryLower = query.toLowerCase();
|
||||||
|
const filteredResults = popularResponse.data.results.filter(show => {
|
||||||
|
// Проверяем совпадение в названии и оригинальном названии
|
||||||
|
const nameMatch = (show.name || '').toLowerCase().includes(queryLower);
|
||||||
|
const originalNameMatch = (show.original_name || '').toLowerCase().includes(queryLower);
|
||||||
|
return nameMatch || originalNameMatch;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Found ${filteredResults.length} results in alternative TV search`);
|
||||||
|
|
||||||
|
if (filteredResults.length > 0) {
|
||||||
|
data.results = this.filterAndProcessResults(filteredResults, 'tv');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error in searchTVShows:', error);
|
||||||
|
// Возвращаем пустой результат в случае ошибки
|
||||||
|
return { results: [], total_results: 0, total_pages: 0, page: pageNum };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getTVShow(id) {
|
async getTVShow(id) {
|
||||||
|
|||||||
Reference in New Issue
Block a user