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