Fix search

This commit is contained in:
2025-05-28 12:03:25 +00:00
parent 25c05d6eb4
commit 0885b8a704

View File

@@ -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 (!hasValidTitle) { // Убираем проверку на кириллицу, разрешаем любые названия
console.log(`Skipping ${type} - invalid title:`, title); if (!title) {
console.log(`Skipping ${type} - no 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,
include_adult: false
}
});
const data = response.data; const data = response.data;
data.results = this.filterAndProcessResults(data.results, 'movie'); data.results = this.filterAndProcessResults(data.results, 'movie');
return data;
// Если нет результатов, попробуем поиск по альтернативным параметрам
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;
@@ -215,7 +259,9 @@ class TMDBClient {
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,
include_adult: false
}
});
return { const data = response.data;
...response.data, data.results = this.filterAndProcessResults(data.results, 'tv');
results: this.filterAndProcessResults(response.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) {