diff --git a/backend/src/services/musicBrainzService.js b/backend/src/services/musicBrainzService.js index 3eb8c1b..925f1a4 100644 --- a/backend/src/services/musicBrainzService.js +++ b/backend/src/services/musicBrainzService.js @@ -92,7 +92,7 @@ class MusicBrainzService { url.searchParams.set('query', q); url.searchParams.set('fmt', 'json'); url.searchParams.set('limit', '10'); - url.searchParams.set('inc', 'artist-credits+labels+recordings'); + url.searchParams.set('inc', 'artist-credits+labels+recordings+cover-art-archive'); try { const data = await mbFetch(url.toString()); diff --git a/backend/src/services/pipelineService.js b/backend/src/services/pipelineService.js index d02d7da..adf39fb 100644 --- a/backend/src/services/pipelineService.js +++ b/backend/src/services/pipelineService.js @@ -9794,11 +9794,6 @@ class PipelineService extends EventEmitter { const tracks = await cdRipService.readToc(devicePath, cdparanoiaCmd); logger.info('cd:analyze:toc', { jobId: job.id, trackCount: tracks.length }); - // Search MusicBrainz - const mbCandidates = await musicBrainzService - .searchByDiscLabel(detectedTitle) - .catch(() => []); - const cdInfo = { phase: 'PREPARE', mediaProfile: 'cd', @@ -9816,7 +9811,7 @@ class PipelineService extends EventEmitter { await historyService.appendLog( job.id, 'SYSTEM', - `CD analysiert: ${tracks.length} Track(s) gefunden. MusicBrainz: ${mbCandidates.length} Treffer.` + `CD analysiert: ${tracks.length} Track(s) gefunden.` ); const runningJobs = await historyService.getRunningJobs(); @@ -9832,13 +9827,12 @@ class PipelineService extends EventEmitter { device, mediaProfile: 'cd', detectedTitle, - tracks, - mbCandidates + tracks } }); } - return { jobId: job.id, detectedTitle, tracks, mbCandidates }; + return { jobId: job.id, detectedTitle, tracks }; } catch (error) { logger.error('cd:analyze:failed', { jobId: job.id, error: errorToMeta(error) }); await this.failJob(job.id, 'CD_ANALYZING', error); diff --git a/frontend/src/components/CdMetadataDialog.jsx b/frontend/src/components/CdMetadataDialog.jsx index 4ab387d..f99a1f0 100644 --- a/frontend/src/components/CdMetadataDialog.jsx +++ b/frontend/src/components/CdMetadataDialog.jsx @@ -24,7 +24,7 @@ export default function CdMetadataDialog({ }) { const [selected, setSelected] = useState(null); const [query, setQuery] = useState(''); - const [extraResults, setExtraResults] = useState([]); + const [results, setResults] = useState([]); // Manual metadata inputs const [manualTitle, setManualTitle] = useState(''); @@ -46,7 +46,7 @@ export default function CdMetadataDialog({ setManualTitle(context?.detectedTitle || ''); setManualArtist(''); setManualYear(null); - setExtraResults([]); + setResults([]); const titles = {}; const positions = new Set(); @@ -84,27 +84,13 @@ export default function CdMetadataDialog({ } }, [selected]); - const allMbRows = [ - ...(Array.isArray(context?.mbCandidates) ? context.mbCandidates : []), - ...extraResults - ].filter(Boolean); - - // Deduplicate by mbId - const mbRows = []; - const seen = new Set(); - for (const r of allMbRows) { - if (r.mbId && !seen.has(r.mbId)) { - seen.add(r.mbId); - mbRows.push(r); - } - } - const handleSearch = async () => { if (!query.trim()) { return; } - const results = await onSearch(query.trim()); - setExtraResults(results || []); + const searchResults = await onSearch(query.trim()); + setResults(searchResults || []); + setSelected(null); }; const handleToggleTrack = (position) => { @@ -163,7 +149,7 @@ export default function CdMetadataDialog({ ); const allSelected = tocTracks.length > 0 && selectedTrackPositions.size === tocTracks.length; - const noneSelected = selectedTrackPositions.size === 0; + const tracksBlocking = tocTracks.length > 0 && selectedTrackPositions.size === 0; return ( - {mbRows.length > 0 ? ( + {results.length > 0 ? (
setSelected(e.value)} @@ -274,7 +260,7 @@ export default function CdMetadataDialog({ icon="pi pi-arrow-right" onClick={handleSubmit} loading={busy} - disabled={noneSelected || (!manualTitle.trim() && !context?.detectedTitle)} + disabled={tracksBlocking || (!manualTitle.trim() && !context?.detectedTitle)} />