dashboard/backend/updatelink.js
2025-12-23 16:48:22 +01:00

122 lines
3.5 KiB
JavaScript

// 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 ✅");
}