generated from Dicken/dickendock
round12: FritzBox-Merge-Bug vor Doppel-Ausloesung fixen, Scan-Meldungen entschaerfen, Dienstname-Fallback aus Hostname statt IP
This commit is contained in:
@@ -37,6 +37,27 @@ function isLikelyJunkTitle(title: string | undefined): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Prüft, ob ein String eine reine IPv4-Adresse ist (nicht als "Name" brauchbar). */
|
||||
function isIpAddress(value: string): boolean {
|
||||
return /^\d{1,3}(\.\d{1,3}){3}$/.test(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Macht aus einem technischen Hostnamen ("plug-shelly-heiz-links",
|
||||
* "nas_synology-01") einen lesbaren Anzeigenamen ("Plug Shelly Heiz Links").
|
||||
* Liefert null, wenn der Hostname selbst keine brauchbare Information trägt
|
||||
* (leer oder reine IP) - dann bleibt nur der IP:Port-Fallback übrig.
|
||||
*/
|
||||
function humanizeHostname(hostname: string): string | null {
|
||||
if (!hostname || isIpAddress(hostname)) return null;
|
||||
const words = hostname
|
||||
.replace(/\.(home|local|fritz\.box)$/i, "")
|
||||
.split(/[-_.\s]+/)
|
||||
.filter(Boolean);
|
||||
if (words.length === 0) return null;
|
||||
return words.map((w) => (w.length > 0 ? w[0].toUpperCase() + w.slice(1) : w)).join(" ");
|
||||
}
|
||||
|
||||
export interface DeviceScanResult {
|
||||
services: DiscoveredService[];
|
||||
/**
|
||||
@@ -87,7 +108,14 @@ export async function scanDeviceServices(
|
||||
});
|
||||
|
||||
const titleIsJunk = isLikelyJunkTitle(probe.title);
|
||||
const fallbackName = `${address}:${port}`;
|
||||
// Kein brauchbarer Titel gefunden (z. B. weil eine SPA ihren echten Titel
|
||||
// erst per JavaScript setzt, das der Scanner nicht ausführt) - dann lieber
|
||||
// den bereits bekannten Gerätenamen ("plug-shelly-heiz-links" ->
|
||||
// "Plug Shelly Heiz Links") als Name verwenden statt einer nichtssagenden
|
||||
// IP:Port-Kombination. Nur wenn auch der Gerätename keine Information
|
||||
// trägt (leer/reine IP, z. B. bei unbenannten Geräten), bleibt IP:Port
|
||||
// als letzter Ausweg übrig.
|
||||
const fallbackName = humanizeHostname(device.hostname) ?? `${address}:${port}`;
|
||||
|
||||
// Nur sichtbar, wenn Software erkannt wurde oder eine erfolgreiche Antwort
|
||||
// (Status < 400) mit einem brauchbaren Titel vorliegt. Fehlerseiten und
|
||||
|
||||
Reference in New Issue
Block a user