Update index.js

Verbesserter String für export und import
This commit is contained in:
simonpipe 2025-12-18 11:39:13 +01:00
parent d4ce358e1b
commit c77103a391

View file

@ -294,27 +294,32 @@ document.addEventListener('DOMContentLoaded', function () {
} }
} }
// Export nach Base64-Code // Export String mit Kompression (Gzip)
window.copyExportCode = function() { window.generateExportCode = async function() {
const field = document.getElementById('export-string-field');
field.select();
field.setSelectionRange(0, 99999);
try { try {
if (navigator.clipboard) { if (!presets || presets.length === 0) return;
navigator.clipboard.writeText(field.value)
.catch(err => { // 1. Struktur-Diät: Nur Werte speichern [["Name","URL"],["Name","URL"]]
console.error("Kopieren mit Clipboard-API fehlgeschlagen:", err); const compactData = presets.map(p => [p.name, p.url]);
document.execCommand('copy'); const jsonString = JSON.stringify(compactData);
});
} else { // 2. Kompression mittels Gzip
document.execCommand('copy'); 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);
} }
} catch (err) {
console.error("Kopieren fehlgeschlagen:", err);
showAlert("Fehler", "Kopieren fehlgeschlagen. Bitte manuell kopieren: " + field.value);
} }
};
// Export nach JSON-Datei // Export nach JSON-Datei
window.exportPreset = function() { window.exportPreset = function() {
@ -330,24 +335,41 @@ document.addEventListener('DOMContentLoaded', function () {
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
}; };
// Import aus Base64-Code mit Warnung // Import String mit Dekomprimierung
window.importFromString = function() { window.importFromString = function() {
const field = document.getElementById('import-string-field'); const field = document.getElementById('import-string-field');
const code = field.value.trim(); const code = field.value.trim();
if (!code) return showAlert("Fehler", "Bitte Code einfügen."); 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; if (!confirmed) return;
try { try {
const data = JSON.parse(decodeURIComponent(escape(atob(code)))); // 1. Base64 zurück in Bytes
if (Array.isArray(data)) { const binary = atob(code);
presets = data; 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(); savePresets();
location.reload(); location.reload();
} }
} catch (e) { } catch (e) {
showAlert("Fehler", "Code ungültig!"); console.error("Import-Fehler:", e);
showAlert("Fehler", "Code ungültig oder beschädigt!");
} }
}); });
}; };