diff --git a/public/app.js b/public/app.js index 0b8a7a8..b578f8a 100644 --- a/public/app.js +++ b/public/app.js @@ -9,6 +9,7 @@ const dialogArtist = document.getElementById('dialogArtist'); const trackList = document.getElementById('trackList'); const sendBtn = document.getElementById('sendBtn'); const cleanupToggle = document.getElementById('cleanupToggle'); +const updateLibraryBtn = document.getElementById('updateLibraryBtn'); let selectedAlbum = null; @@ -221,6 +222,23 @@ async function sendToLidarr(event) { } } +async function updateLibrary() { + setStatus('Starte Lidarr Bibliothek-Update...'); + updateLibraryBtn.disabled = true; + + try { + const data = await fetchJson('/api/lidarr/update-library', { + method: 'POST', + headers: { 'Content-Type': 'application/json' } + }); + setStatus(`Bibliothek-Update gestartet (${data.commandNames.join(', ')}).`); + } catch (err) { + setStatus(`Fehler beim Bibliothek-Update: ${err.message}`, true); + } finally { + updateLibraryBtn.disabled = false; + } +} + searchBtn.addEventListener('click', searchSpotify); queryInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { @@ -228,3 +246,4 @@ queryInput.addEventListener('keydown', (event) => { } }); sendBtn.addEventListener('click', sendToLidarr); +updateLibraryBtn.addEventListener('click', updateLibrary); diff --git a/public/index.html b/public/index.html index 3ae6469..64c8cf9 100644 --- a/public/index.html +++ b/public/index.html @@ -22,6 +22,9 @@ Ueberfluessige Dateien nach Download loeschen +
+ +

Wenn nur einzelne Songs gewaehlt sind, versucht die App unnoetige Track-Dateien in Lidarr zu entfernen.

diff --git a/server.js b/server.js index e10800f..e6356a3 100644 --- a/server.js +++ b/server.js @@ -176,6 +176,30 @@ async function triggerAlbumSearch(albumId) { }); } +async function triggerLibraryUpdate() { + const started = []; + + try { + await lidarrRequest('post', '/api/v1/command', { name: 'RescanFolders' }); + started.push('RescanFolders'); + } catch (err) { + console.warn('RescanFolders konnte nicht gestartet werden:', err.message); + } + + try { + await lidarrRequest('post', '/api/v1/command', { name: 'RefreshArtist' }); + started.push('RefreshArtist'); + } catch (err) { + console.warn('RefreshArtist konnte nicht gestartet werden:', err.message); + } + + if (started.length === 0) { + throw new Error('Kein Bibliothek-Update-Kommando konnte in Lidarr gestartet werden.'); + } + + return started; +} + async function cleanupUnselectedTrackFiles(albumId, selectedTrackIds) { const allFiles = await fetchTrackFiles(albumId); if (!Array.isArray(allFiles) || allFiles.length === 0) { @@ -416,6 +440,17 @@ app.post('/api/lidarr/send-album', async (req, res) => { } }); +app.post('/api/lidarr/update-library', async (_req, res) => { + try { + const commandNames = await triggerLibraryUpdate(); + res.json({ success: true, commandNames }); + } catch (err) { + const status = err.response?.status || 500; + const details = err.response?.data || err.message; + res.status(status).json({ error: typeof details === 'string' ? details : JSON.stringify(details) }); + } +}); + app.get('*', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); });