Add Lidarr library update command and UI trigger

This commit is contained in:
J0Z1L 2026-02-28 00:09:47 +01:00
parent abf9d61d72
commit 712d29921d
3 changed files with 57 additions and 0 deletions

View file

@ -9,6 +9,7 @@ const dialogArtist = document.getElementById('dialogArtist');
const trackList = document.getElementById('trackList'); const trackList = document.getElementById('trackList');
const sendBtn = document.getElementById('sendBtn'); const sendBtn = document.getElementById('sendBtn');
const cleanupToggle = document.getElementById('cleanupToggle'); const cleanupToggle = document.getElementById('cleanupToggle');
const updateLibraryBtn = document.getElementById('updateLibraryBtn');
let selectedAlbum = null; 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); searchBtn.addEventListener('click', searchSpotify);
queryInput.addEventListener('keydown', (event) => { queryInput.addEventListener('keydown', (event) => {
if (event.key === 'Enter') { if (event.key === 'Enter') {
@ -228,3 +246,4 @@ queryInput.addEventListener('keydown', (event) => {
} }
}); });
sendBtn.addEventListener('click', sendToLidarr); sendBtn.addEventListener('click', sendToLidarr);
updateLibraryBtn.addEventListener('click', updateLibrary);

View file

@ -22,6 +22,9 @@
<input type="checkbox" id="cleanupToggle" /> <input type="checkbox" id="cleanupToggle" />
<span>Ueberfluessige Dateien nach Download loeschen</span> <span>Ueberfluessige Dateien nach Download loeschen</span>
</label> </label>
<div style="margin-top: 0.8rem;">
<button id="updateLibraryBtn" type="button">Lidarr Bibliothek updaten</button>
</div>
<p class="hint"> <p class="hint">
Wenn nur einzelne Songs gewaehlt sind, versucht die App unnoetige Track-Dateien in Lidarr zu entfernen. Wenn nur einzelne Songs gewaehlt sind, versucht die App unnoetige Track-Dateien in Lidarr zu entfernen.
</p> </p>

View file

@ -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) { async function cleanupUnselectedTrackFiles(albumId, selectedTrackIds) {
const allFiles = await fetchTrackFiles(albumId); const allFiles = await fetchTrackFiles(albumId);
if (!Array.isArray(allFiles) || allFiles.length === 0) { 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) => { app.get('*', (_req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html')); res.sendFile(path.join(__dirname, 'public', 'index.html'));
}); });