100 lines
3.5 KiB
JavaScript
100 lines
3.5 KiB
JavaScript
const axios = require('axios');
|
|
const cheerio = require('cheerio');
|
|
const BASE_URL = 'http://www.filmages.ch/';
|
|
|
|
async function searchMovies(query) {
|
|
const searchUrl = `${BASE_URL}films/recherche/search/${encodeURIComponent(query)}.html`;
|
|
const response = await axios.get(searchUrl, { headers: { 'User-Agent': 'Mozilla/5.0' } });
|
|
const $ = cheerio.load(response.data);
|
|
const results = [];
|
|
|
|
$('table.layout_simpletable tbody tr.item').each((_, el) => {
|
|
const row = $(el);
|
|
const titleFrench = row.find('td.field.title_french a').text().trim();
|
|
const link = row.find('td.field.title_french a').attr('href');
|
|
const titleOriginal = row.find('td.field.title_original').text().trim();
|
|
const director = row.find('td.field.director').text().trim();
|
|
const ageLegal = row.find('td.field.age_legal').text().trim();
|
|
const ageSuggested = row.find('td.field.age_suggested').text().trim();
|
|
|
|
if (titleFrench && link) {
|
|
results.push({
|
|
titleFrench,
|
|
titleOriginal,
|
|
director,
|
|
ageLegalSearch: ageLegal,
|
|
ageSuggestedSearch: ageSuggested,
|
|
link: BASE_URL + link, // Make absolute
|
|
});
|
|
}
|
|
});
|
|
// console.log('FilmAges search results:', results);
|
|
return results;
|
|
}
|
|
|
|
async function getMovieClassification(movieUrl) {
|
|
if (!movieUrl) return {};
|
|
const response = await axios.get(movieUrl, { headers: { 'User-Agent': 'Mozilla/5.0' } });
|
|
const $ = cheerio.load(response.data);
|
|
|
|
const mainDetails = $('#reader_main .layout_full .item');
|
|
const rightDetails = $('#reader_right_1 .layout_full .item'); // For ages
|
|
const rightCriteria = $('#reader_right_2 .layout_full .item'); // For indications
|
|
|
|
const titleOriginal = mainDetails.find('.field.title_original .value').text().trim();
|
|
const year = mainDetails.find('.field.year .value').text().trim();
|
|
const summary = mainDetails.find('.field.summary .value').text().trim();
|
|
const synthesis = mainDetails.find('.field.final_remark .value').text().trim();
|
|
|
|
const ageLegal = rightDetails.find('.field.age_legal .value').text().trim();
|
|
const ageSuggested = rightDetails.find('.field.age_suggested .value').text().trim();
|
|
|
|
const indications = [];
|
|
rightCriteria.find('.field.indication .value a').each((_, el) => {
|
|
indications.push($(el).text().trim());
|
|
});
|
|
|
|
const counterIndications = [];
|
|
rightCriteria.find('.field.counter_indication .value a').each((_, el) => {
|
|
counterIndications.push($(el).text().trim());
|
|
});
|
|
|
|
const director = mainDetails.find('.field.director .value').text().trim();
|
|
|
|
return {
|
|
titleOriginalPage: titleOriginal, // To distinguish from search result one
|
|
year,
|
|
summary,
|
|
synthesis,
|
|
ageLegal,
|
|
ageSuggested,
|
|
indications,
|
|
counterIndications,
|
|
directorPage: director,
|
|
};
|
|
}
|
|
|
|
async function searchAndEnrich(query) {
|
|
const searchResults = await searchMovies(query);
|
|
const enrichedResults = await Promise.all(
|
|
searchResults.map(async (movie) => {
|
|
const classification = await getMovieClassification(movie.link);
|
|
return {
|
|
title: movie.titleFrench || movie.titleOriginal, // Prioritize French title for matching
|
|
year: classification.year, // Year is only on detail page
|
|
img: null, // No images readily available from search/detail
|
|
link: movie.link,
|
|
source: 'filmages',
|
|
details: {
|
|
...movie, // Keep all search results fields
|
|
...classification, // Add all detail page fields
|
|
}
|
|
};
|
|
})
|
|
);
|
|
// console.log('FilmAges enriched:', enrichedResults);
|
|
return enrichedResults;
|
|
}
|
|
|
|
module.exports = { searchAndEnrich };
|