diff --git a/webui/static/library.js b/webui/static/library.js
index eb8dc6b0..34823ce6 100644
--- a/webui/static/library.js
+++ b/webui/static/library.js
@@ -2794,10 +2794,7 @@ async function startDiscographyDownload() {
item.classList.remove('active');
if (data.status === 'done') {
- const parts = [];
- if (data.tracks_added > 0) parts.push(`${data.tracks_added} added`);
- if (data.tracks_skipped > 0) parts.push(`${data.tracks_skipped} skipped`);
- statusEl.textContent = parts.join(', ') || 'No new tracks';
+ statusEl.textContent = _discogItemStatus(data);
iconEl.innerHTML = data.tracks_added > 0 ? '✓' : '—';
item.classList.add(data.tracks_added > 0 ? 'done' : 'skipped');
} else if (data.status === 'error') {
@@ -2814,6 +2811,22 @@ async function startDiscographyDownload() {
}
}
+// Build a clear per-album status from the discography stream payload. The
+// backend already reports WHY tracks weren't added — other-artist credit,
+// already owned/queued, or content-filtered — so surface that instead of a
+// misleading "No new tracks" (#830: collab tracks dropped for "artist mismatch"
+// looked identical to "you already have it").
+function _discogItemStatus(data) {
+ const parts = [];
+ const added = data.tracks_added || 0;
+ if (added > 0) parts.push(`${added} added`);
+ if ((data.tracks_skipped_owned || 0) > 0) parts.push(`${data.tracks_skipped_owned} already owned`);
+ if ((data.tracks_skipped || 0) > 0) parts.push(`${data.tracks_skipped} already queued`);
+ if ((data.tracks_skipped_artist || 0) > 0) parts.push(`${data.tracks_skipped_artist} by other artists`);
+ if ((data.tracks_skipped_filter || 0) > 0) parts.push(`${data.tracks_skipped_filter} filtered out`);
+ return parts.join(', ') || 'No tracks';
+}
+
function _handleDiscogProgress(data) {
if (data.type === 'album') {
const item = document.getElementById(`discog-prog-${data.album_id}`);
@@ -2826,10 +2839,7 @@ function _handleDiscogProgress(data) {
statusEl.textContent = `Processing ${data.tracks_total} tracks...`;
item.classList.add('active');
} else if (data.status === 'done') {
- const parts = [];
- if (data.tracks_added > 0) parts.push(`${data.tracks_added} added`);
- if (data.tracks_skipped > 0) parts.push(`${data.tracks_skipped} skipped`);
- statusEl.textContent = parts.join(', ') || 'No new tracks';
+ statusEl.textContent = _discogItemStatus(data);
iconEl.innerHTML = data.tracks_added > 0 ? '✓' : '—';
item.classList.remove('active');
item.classList.add(data.tracks_added > 0 ? 'done' : 'skipped');