122 lines
3.5 KiB
JavaScript
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 ✅");
|
|
}
|