diff --git a/index.js b/index.js index 125925a..b551f8f 100644 --- a/index.js +++ b/index.js @@ -294,27 +294,32 @@ document.addEventListener('DOMContentLoaded', function () { } } - // Export nach Base64-Code - window.copyExportCode = function() { - const field = document.getElementById('export-string-field'); - field.select(); - field.setSelectionRange(0, 99999); - + // Export String mit Kompression (Gzip) + window.generateExportCode = async function() { try { - if (navigator.clipboard) { - navigator.clipboard.writeText(field.value) - .catch(err => { - console.error("Kopieren mit Clipboard-API fehlgeschlagen:", err); - document.execCommand('copy'); - }); - } else { - document.execCommand('copy'); - } - } catch (err) { - console.error("Kopieren fehlgeschlagen:", err); - showAlert("Fehler", "Kopieren fehlgeschlagen. Bitte manuell kopieren: " + field.value); + if (!presets || presets.length === 0) return; + + // 1. Struktur-Diät: Nur Werte speichern [["Name","URL"],["Name","URL"]] + const compactData = presets.map(p => [p.name, p.url]); + const jsonString = JSON.stringify(compactData); + + // 2. Kompression mittels Gzip + const stream = new Blob([jsonString]).stream(); + const compressedStream = stream.pipeThrough(new CompressionStream('gzip')); + const response = new Response(compressedStream); + const buffer = await response.arrayBuffer(); + + // 3. In Base64 umwandeln + const base64String = btoa(String.fromCharCode(...new Uint8Array(buffer))); + + const exportField = document.getElementById('export-string-field'); + if (exportField) exportField.value = base64String; + + console.log("Kompression erfolgreich. Länge:", base64String.length); + } catch (e) { + console.error("Export-Fehler:", e); } - }; + } // Export nach JSON-Datei window.exportPreset = function() { @@ -330,24 +335,41 @@ document.addEventListener('DOMContentLoaded', function () { URL.revokeObjectURL(url); }; - // Import aus Base64-Code mit Warnung + // Import String mit Dekomprimierung window.importFromString = function() { const field = document.getElementById('import-string-field'); const code = field.value.trim(); if (!code) return showAlert("Fehler", "Bitte Code einfügen."); - - showConfirm("Vorsicht", "Es werden alle bestehenden Sender überschrieben. Möchtest du fortfahren?", function(confirmed) { + + showConfirm("Vorsicht", "Es werden alle bestehenden Sender überschrieben. Möchtest du fortfahren?", async function(confirmed) { if (!confirmed) return; - + try { - const data = JSON.parse(decodeURIComponent(escape(atob(code)))); - if (Array.isArray(data)) { - presets = data; + // 1. Base64 zurück in Bytes + const binary = atob(code); + const bytes = Uint8Array.from(binary, c => c.charCodeAt(0)); + + // 2. Dekomprimieren (Gzip) + const stream = new Blob([bytes]).stream(); + const decompressedStream = stream.pipeThrough(new DecompressionStream('gzip')); + const response = new Response(decompressedStream); + const resultText = await response.text(); + + // 3. Struktur wiederherstellen (Array zu Objekten) + const importedArray = JSON.parse(resultText); + const restoredPresets = importedArray.map(item => ({ + name: item[0], + url: item[1] + })); + + if (Array.isArray(restoredPresets)) { + presets = restoredPresets; savePresets(); location.reload(); } } catch (e) { - showAlert("Fehler", "Code ungültig!"); + console.error("Import-Fehler:", e); + showAlert("Fehler", "Code ungültig oder beschädigt!"); } }); };