cine-kids/aggregators/filmages-adapter.js

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 };