document.addEventListener('DOMContentLoaded', function() {
const presetContainer = document.getElementById('preset-container');
const addNewPresetButton = document.getElementById('add-new-preset');
const newPresetNameInput = document.getElementById('new-preset-name');
const newPresetUrlInput = document.getElementById('new-preset-url');
let currentPlayingItem = null; // Variable zum Speichern des aktuell spielenden Elements
const exportButton = document.getElementById('export-button');
const importButton = document.getElementById('import-button');
const loadPresetsLink = document.getElementById('load-presets-link'); // Der neue Link zum Laden der Presets-Datei
exportButton.addEventListener('click', exportPresets);
importButton.addEventListener('click', importPresets);
loadPresetsLink.addEventListener('click', loadPresetsFromFile); // Event für den Link
loadExistingPresets();
new Sortable(presetContainer, {
animation: 250,
ghostClass: 'ghost',
handle: '.move-button', // Nur das Verschieben-Symbol erlaubt das Verschieben
onEnd: () => {
savePresetOrder();
}
});
addNewPresetButton.addEventListener('click', () => {
const presetName = newPresetNameInput.value.trim();
const presetUrl = newPresetUrlInput.value.trim();
if (presetName && presetUrl) {
addNewPreset(presetName, presetUrl);
savePresetToLocalStorage(presetName, presetUrl);
newPresetNameInput.value = '';
newPresetUrlInput.value = '';
} else {
alert("Bitte geben Sie einen Namen und eine URL ein.");
}
});
function loadExistingPresets() {
const presets = JSON.parse(localStorage.getItem('presets')) || [];
presets.forEach(preset => {
addNewPreset(preset.name, preset.url);
});
}
function addNewPreset(name, url) {
const presetItem = document.createElement('div');
presetItem.classList.add('preset-item');
presetItem.dataset.streamUrl = url;
presetItem.innerHTML = `
${name}
`;
presetItem.querySelector('.edit-button').addEventListener('click', (event) => {
event.stopPropagation();
editPreset(presetItem, name, url);
});
presetItem.querySelector('.delete-button').addEventListener('click', (event) => {
event.stopPropagation();
deletePreset(presetItem);
});
presetItem.querySelector('.move-button').addEventListener('click', (event) => {
event.stopPropagation(); // Verhindert, dass das Verschieben-Symbol das gesamte Preset aktiviert
});
presetItem.addEventListener('click', (event) => {
if (event.target !== presetItem.querySelector('.edit-button') &&
event.target !== presetItem.querySelector('.delete-button') &&
event.target !== presetItem.querySelector('.move-button')) {
playStream(url, presetItem);
}
});
presetContainer.appendChild(presetItem);
}
function editPreset(item, currentName, currentUrl) {
const newName = prompt("Neuer Name:", currentName);
const newUrl = prompt("Neue URL:", currentUrl);
if (newName !== null && newUrl !== null) {
item.querySelector('h3').textContent = newName;
item.dataset.streamUrl = newUrl;
savePresetOrder();
}
}
function deletePreset(item) {
if (confirm("Möchten Sie diesen Sender wirklich löschen?")) {
presetContainer.removeChild(item);
savePresetOrder();
}
}
function savePresetToLocalStorage(name, url) {
const presets = JSON.parse(localStorage.getItem('presets')) || [];
presets.push({ name, url });
localStorage.setItem('presets', JSON.stringify(presets));
}
function savePresetOrder() {
const presetItems = Array.from(presetContainer.children);
const presets = presetItems.map(item => ({
name: item.querySelector('h3').textContent,
url: item.dataset.streamUrl
}));
localStorage.setItem('presets', JSON.stringify(presets));
}
function playStream(url, item) {
if (currentPlayingItem) {
const currentAudio = currentPlayingItem.querySelector('audio');
if (currentAudio) {
currentAudio.pause();
currentAudio.remove();
}
currentPlayingItem.classList.remove('playing');
}
const audioElement = new Audio(url);
audioElement.autoplay = true;
audioElement.loop = true;
audioElement.volume = 0.5;
audioElement.onerror = function() {
alert('Fehler beim Laden des Streams: ' + url);
};
item.appendChild(audioElement);
item.classList.add('playing');
currentPlayingItem = item;
currentStationName.textContent = item.querySelector('h3').textContent;
}
function exportPresets() {
const presets = JSON.parse(localStorage.getItem('presets')) || [];
const json = JSON.stringify(presets, null, 2);
const blob = new Blob([json], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'webradio_presets.json';
a.click();
URL.revokeObjectURL(url);
}
function importPresets() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.json';
input.addEventListener('change', (event) => {
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (e) => {
try {
const importedPresets = JSON.parse(e.target.result);
if (Array.isArray(importedPresets)) {
// Speichere die importierten Presets im Local Storage
localStorage.setItem('presets', JSON.stringify(importedPresets));
// Leere den Preset-Container und lade die neuen Presets
presetContainer.innerHTML = '';
importedPresets.forEach(preset => {
if (preset.name && preset.url) { // Prüfe, ob die Presets gültig sind
addNewPreset(preset.name, preset.url);
} else {
console.warn("Ungültiger Preset-Eintrag übersprungen:", preset);
}
});
alert("Presets erfolgreich importiert.");
} else {
throw new Error("Das importierte Format ist ungültig. Es wird ein Array erwartet.");
}
} catch (error) {
alert("Fehler beim Importieren der Presets: " + error.message);
}
};
reader.readAsText(file);
}
});
input.click();
}
const stopButton = document.querySelector('.stop-button');
const progressBar = document.getElementById('progress-bar');
const currentStationName = document.getElementById('current-station-name');
stopButton.addEventListener('click', () => {
if (currentPlayingItem) {
const audioElement = currentPlayingItem.querySelector('audio');
audioElement.pause();
audioElement.currentTime = 0;
currentPlayingItem.classList.remove('playing');
currentPlayingItem = null;
currentStationName.textContent = 'Kein Sender ausgewählt.';
}
});
function loadPresetsFromFile(event) {
event.preventDefault();
fetch('/webradio_presets.json')
.then(response => {
if (!response.ok) {
throw new Error('Datei konnte nicht geladen werden');
}
return response.json();
})
.then(data => {
localStorage.setItem('presets', JSON.stringify(data));
presetContainer.innerHTML = '';
data.forEach(preset => addNewPreset(preset.name, preset.url));
alert('Presets erfolgreich geladen.');
})
.catch(error => {
alert('Fehler beim Laden der Presets: ' + error.message);
});
}
});