From bfae0c5c79035eaf1321165758bafe2af84ee79c Mon Sep 17 00:00:00 2001 From: simonpipe Date: Thu, 18 Dec 2025 22:18:22 +0100 Subject: [PATCH] Update preset-manager.js --- preset-manager.js | 61 +++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/preset-manager.js b/preset-manager.js index 847a3f5..12cf775 100644 --- a/preset-manager.js +++ b/preset-manager.js @@ -2,19 +2,32 @@ window.PresetManager = { presets: [], - // Lädt Presets aus LocalStorage oder der JSON-Datei + // Lädt Presets: URL-Hash hat Vorrang vor LocalStorage async load(callback) { - this.presets = JSON.parse(localStorage.getItem('presets')) || []; - if (this.presets.length === 0) { - try { - const response = await fetch('webradio_presets.json'); - if (!response.ok) throw new Error('Datei konnte nicht geladen werden'); - this.presets = await response.json(); - this.save(); - } catch (error) { - if (window.UI) window.UI.showAlert("Fehler", 'Fehler beim Laden der Presets: ' + error.message); + // 1. Check: Ist ein Hash in der URL vorhanden? + const hash = window.location.hash.substring(1); + if (hash && hash.length > 30) { + const success = await this.importFromString(hash, false); // false = kein Reload + if (success) { + if (callback) callback(this.presets); + return; } } + + // 2. Check: LocalStorage laden + const stored = localStorage.getItem('presets'); + if (stored) { + try { + this.presets = JSON.parse(stored); + } catch (e) { + console.error("Fehler beim Parsen von LocalStorage", e); + this.presets = []; + } + } else { + // 3. Fallback: Leere Liste, wenn gar nichts gefunden wurde + this.presets = []; + } + if (callback) callback(this.presets); }, @@ -22,10 +35,10 @@ window.PresetManager = { localStorage.setItem('presets', JSON.stringify(this.presets)); }, - // --- EXPORT/IMPORT (Gzip/Base64) --- - async generateExportCode() { + // Generiert den Code und gibt ihn zurück + async generateExportCode(updateField = true) { try { - if (!this.presets || this.presets.length === 0) return; + if (!this.presets || this.presets.length === 0) return ""; const compactData = this.presets.map(p => [p.name, p.url]); const jsonString = JSON.stringify(compactData); @@ -35,14 +48,19 @@ window.PresetManager = { const buffer = await response.arrayBuffer(); const base64String = btoa(String.fromCharCode(...new Uint8Array(buffer))); - const exportField = document.getElementById('export-string-field'); - if (exportField) exportField.value = base64String; + if (updateField) { + const exportField = document.getElementById('export-string-field'); + if (exportField) exportField.value = base64String; + } + return base64String; } catch (e) { console.error("Export-Fehler:", e); + return ""; } }, - async importFromString(code) { + // Importiert von einem String + async importFromString(code, shouldReload = true) { try { const binary = atob(code); const bytes = Uint8Array.from(binary, c => c.charCodeAt(0)); @@ -54,10 +72,15 @@ window.PresetManager = { const importedArray = JSON.parse(resultText); this.presets = importedArray.map(item => ({ name: item[0], url: item[1] })); this.save(); - location.reload(); + + if (shouldReload) { + // Seite ohne den langen Hash neu laden für eine saubere URL + location.href = window.location.origin + window.location.pathname; + } + return true; } catch (e) { console.error("Import-Fehler:", e); - if (window.UI) window.UI.showAlert("Fehler", "Code ungültig oder beschädigt!"); + return false; } }, @@ -68,9 +91,7 @@ window.PresetManager = { const a = document.createElement('a'); a.href = url; a.download = 'radio_presets.json'; - document.body.appendChild(a); a.click(); - document.body.removeChild(a); URL.revokeObjectURL(url); } }; \ No newline at end of file