const axios = require('axios');
const fs = require('fs');
const cheerio = require('cheerio');
const { Client, Databases, Storage, ID, Query } = require('node-appwrite');
require('dotenv').config({ path: '.env.local' });
let InputFile;
try { InputFile = require('node-appwrite/file').InputFile; } catch (e) { InputFile = null; }
const client = new Client()
.setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT)
.setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID)
.setKey(process.env.APPWRITE_API_KEY);
const databases = new Databases(client);
const storage = new Storage(client);
const DB_ID = process.env.APPWRITE_DATABASE_ID;
const BUCKET_ID = process.env.NEXT_PUBLIC_APPWRITE_MEDIA_BUCKET_ID;
const excludedNodes = ['962', '963', '895', '894', '893', '964'];
async function deleteOldScrapes(postsCollectionId) {
console.log('Deleting poorly scraped posts...');
const res = await databases.listDocuments(DB_ID, postsCollectionId, [Query.limit(100)]);
const toDelete = res.documents.filter(p => p.slug && p.slug.startsWith('multivision-'));
for (const d of toDelete) {
await databases.deleteDocument(DB_ID, postsCollectionId, d.$id);
console.log('Deleted:', d.slug);
}
}
async function scrapeNode(url) {
try {
const res = await axios.get(url);
const $ = cheerio.load(res.data);
const title = $('h1').first().text().replace(/\|.*/, '').trim() || $('title').text().replace(/\|.*/, '').trim();
// Extract date
let dateObj = null;
const timeText = $('span').filter((i, el) => $(el).text().match(/\d{2}\/\d{2}\/\d{4} - \d{2}:\d{2}/)).first().text();
// e.g. "Mar, 31/03/2026 - 10:16"
if (timeText) {
const match = timeText.match(/(\d{2})\/(\d{2})\/(\d{4}) - (\d{2}:\d{2})/);
if (match) {
// DD/MM/YYYY
dateObj = new Date(`${match[3]}-${match[2]}-${match[1]}T${match[4]}:00.000Z`);
}
}
if (!dateObj) return null; // Skip if no date found
// We only want March 2026
if (dateObj.getMonth() !== 2 || dateObj.getFullYear() !== 2026) {
return { skipped: true, reason: 'Not in March 2026' };
}
// Extract image
let image = null;
$('img').each((i, el) => {
const src = $(el).attr('src');
if (src && (src.includes('public/imagenes') || src.includes('styles/')) && !src.includes('logo')) {
image = src.startsWith('http') ? src : 'https://www.multivisiondecolombia.com' + src;
return false; // break
}
});
// Extract content
let contentHtml = '';
const bodyField = $('.field--name-body');
if (bodyField.length > 0) {
contentHtml = bodyField.html();
} else {
// fallback
contentHtml = $('article').html() || '';
}
// Clean content: Keep only p, ul, li, strong, em, b, i
const $content = cheerio.load(contentHtml || '');
$content('*').each((i, el) => {
if (!['p', 'ul', 'li', 'strong', 'em', 'b', 'i'].includes(el.tagName.toLowerCase())) {
if (el.tagName.toLowerCase() === 'br') {
$content(el).replaceWith('
');
} else {
$content(el).replaceWith($content(el).text());
}
}
});
const finalContent = $content.html() || '