// updatelink.js import fs from "fs"; import path from "path"; import * as cheerio from "cheerio"; import axios from "axios"; const appsFile = path.join(process.cwd(), "apps.json"); /*function getShortName($) { return ( $('meta[property="og:site_name"]').attr("content") || $('meta[name="application-name"]').attr("content") || $('meta[property="og:title"]').attr("content") || $("title").text().trim() || null ); } */ function limitText(str,n) { if (!str) return ""; if (str.length <= n) { return str; } return str.slice(0, n-2) + ".."; } function getShortName($) { const candidates = [ /* $('meta[property="og:site_name"]').attr("content"), $('meta[name="application-name"]').attr("content"), $('meta[property="og:title"]').attr("content"), $("title").text().trim(), */ $('meta[property="og:site_name"]').attr("content"), $('meta[name="application-name"]').attr("content"), $('meta[property="og:title"]').attr("content"), $('meta[name="apple-mobile-web-app-title"]').attr("content"), $('meta[name="twitter:title"]').attr("content"), $('meta[name="twitter:site"]').attr("content"), $("title").text().trim(), ]; // Filtra solo stringhe non nulle e non vuote const valid = candidates.filter(s => s && s.trim().length > 0); if (valid.length === 0) return null; // Ordina per lunghezza crescente e prende la prima valid.sort((a, b) => a.length - b.length); return limitText(valid[0],15); } function consolelogName($) { console.log($('meta[property="og:site_name"]').attr("content")); console.log($('meta[name="application-name"]').attr("content")); console.log($('meta[property="og:title"]').attr("content")); console.log($('meta[name="apple-mobile-web-app-title"]').attr("content")); console.log($('meta[name="twitter:title"]').attr("content")); console.log($('meta[name="twitter:site"]').attr("content")); console.log($("title").text().trim()); } async function findBestIconAndName(baseUrl) { try { const res = await axios.get(baseUrl, { timeout: 2000 }); const $ = cheerio.load(res.data); let appName = getShortName($) || null; consolelogName($); const icons = []; $("link[rel*='icon']").each((_, el) => { const href = $(el).attr("href"); const sizes = $(el).attr("sizes") || ""; if (href) icons.push({ href, sizes }); }); icons.sort((a, b) => { const sizeA = parseInt(a.sizes.split("x")[0]) || 0; const sizeB = parseInt(b.sizes.split("x")[0]) || 0; return sizeB - sizeA; }); let chosenIcon; if (icons.length > 0) { chosenIcon = new URL(icons[0].href, baseUrl).href; } else { chosenIcon = "./default.png"; } return { name: appName || "no_name", icon: chosenIcon }; } catch { return { name: "no_name", icon: "/icons/error.png" }; } } /** * Funzione principale che aggiorna apps.json */ export default async function updateLink() { const apps = JSON.parse(fs.readFileSync(appsFile, "utf-8")); for (const app of apps) { if (app.controllato) { console.log(`Skip ${app.name} (${app.host}:${app.port}) già controllato`); continue; } const baseUrl = `http://${app.host}:${app.port}`; console.log(`Controllo ${baseUrl}...`); const result = await findBestIconAndName(baseUrl); app.name = result.name; app.icon = result.icon; app.controllato = true; } fs.writeFileSync(appsFile, JSON.stringify(apps, null, 2)); console.log("apps.json aggiornato ✅"); }