let me = null; let instruments = []; let songs = []; const expanded = new Set(); const editing = new Set(); async function loadInstruments() { instruments = await api.get('/api/instruments'); } async function loadSongs() { songs = await api.get('/api/songs'); renderSongs(); } function instrumentOptions() { return instruments.map((i) => ``).join(''); } function songThumbTemplate(song) { const thumb = song.youtube_url ? youtubeThumbnailUrl(song.youtube_url) : null; if (thumb) { return `
`; } return `${escapeHtml(song.notes)}
` : ''} ${songLinksTemplate(song)}Aucun lien pour le moment.
'; return; } container.innerHTML = detail.tutorials .map( (t) => `${escapeHtml(t.instrument_name)}: ${escapeHtml(t.label || t.url)}` ) .join(''); } catch (err) { showError(err.message); } } async function onAddTutorial(e) { e.preventDefault(); const form = e.target; const songId = parseInt(form.dataset.songId, 10); const instrumentId = parseInt(form.instrumentId.value, 10); const url = form.url.value.trim(); const label = form.label.value.trim(); try { await api.post(`/api/songs/${songId}/tutorials`, { instrumentId, url, label }); form.reset(); const song = songs.find((s) => s.id === songId); if (song) song.tutorial_count += 1; await loadTutorials(songId); renderSongs(); } catch (err) { showError(err.message); } } async function onAddSong(e) { e.preventDefault(); const form = e.target; const title = form.title.value.trim(); const artist = form.artist.value.trim(); const notes = form.notes.value.trim(); const youtubeUrl = form.youtubeUrl.value.trim(); const spotifyUrl = form.spotifyUrl.value.trim(); try { await api.post('/api/songs', { title, artist, notes, youtubeUrl, spotifyUrl }); form.reset(); await loadSongs(); } catch (err) { showError(err.message); } } async function onSaveSong(e) { e.preventDefault(); const form = e.target; const id = parseInt(form.dataset.id, 10); const title = form.title.value.trim(); const artist = form.artist.value.trim(); const notes = form.notes.value.trim(); const youtubeUrl = form.youtubeUrl.value.trim(); const spotifyUrl = form.spotifyUrl.value.trim(); try { await api.patch(`/api/songs/${id}`, { title, artist, notes, youtubeUrl, spotifyUrl }); editing.delete(id); await loadSongs(); } catch (err) { showError(err.message); } } async function onDeleteSong(id) { try { await api.del(`/api/songs/${id}`); editing.delete(id); await loadSongs(); } catch (err) { showError(err.message); } } function showError(message) { document.getElementById('error').innerHTML = ``; } (async function init() { me = await initNav('repertoire'); await loadInstruments(); if (me.isAdmin) { document.getElementById('admin-add-song').style.display = 'block'; document.getElementById('add-song-form').addEventListener('submit', onAddSong); } await loadSongs(); })();