diff --git a/core/download_orchestrator.py b/core/download_orchestrator.py index ed306ea1..f91a9c55 100644 --- a/core/download_orchestrator.py +++ b/core/download_orchestrator.py @@ -365,7 +365,7 @@ class DownloadOrchestrator: """ # Get downloads from all available sources all_downloads = [] - for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl]: + for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl, self.lidarr]: if client: try: all_downloads.extend(await client.get_all_downloads()) @@ -384,7 +384,7 @@ class DownloadOrchestrator: DownloadStatus object or None if not found """ # Try each source until we find the download - for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl]: + for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl, self.lidarr]: if not client: continue try: @@ -418,7 +418,7 @@ class DownloadOrchestrator: return await self.soulseek.cancel_download(download_id, username, remove) if self.soulseek else False # Otherwise, try all available sources - for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl]: + for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl, self.lidarr]: if not client: continue try: @@ -453,7 +453,7 @@ class DownloadOrchestrator: True if successful """ results = [] - for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl]: + for client in [self.soulseek, self.youtube, self.tidal, self.qobuz, self.hifi, self.deezer_dl, self.lidarr]: if client: try: results.append(await client.clear_all_completed_downloads()) @@ -524,7 +524,7 @@ class DownloadOrchestrator: async def cancel_all_downloads(self) -> bool: """Cancel and remove all downloads from all sources.""" ok = True - for client in [self.soulseek, self.tidal, self.qobuz, self.hifi, self.deezer_dl]: + for client in [self.soulseek, self.tidal, self.qobuz, self.hifi, self.deezer_dl, self.lidarr]: if client: try: await client.cancel_all_downloads() if hasattr(client, 'cancel_all_downloads') else await client.clear_all_completed_downloads() diff --git a/core/lidarr_download_client.py b/core/lidarr_download_client.py index 78534c9a..72dd3fbc 100644 --- a/core/lidarr_download_client.py +++ b/core/lidarr_download_client.py @@ -450,9 +450,13 @@ class LidarrDownloadClient: return self._to_status(dl) if dl else None def _to_status(self, dl: Dict) -> DownloadStatus: + filename = dl['filename'] + # Append error info to filename for UI visibility when errored + if dl['state'] == 'Errored' and dl.get('error'): + filename = f"{filename} — {dl['error']}" return DownloadStatus( id=dl['id'], - filename=dl['filename'], + filename=filename, username='lidarr', state=dl['state'], progress=dl['progress'], diff --git a/web_server.py b/web_server.py index 8ef88c2b..f31b304d 100644 --- a/web_server.py +++ b/web_server.py @@ -22614,6 +22614,7 @@ def get_version_info(): "• Reject Qobuz 30-second sample/preview downloads", "• Fix library page crash on All filter — non-string soul_id broke card rendering", "• Auto Wing It fallback for failed discovery — unmatched tracks download via Soulseek with raw metadata", + "• Lidarr download source now production-ready — full orchestrator integration", "• Fix M3U showing all tracks as missing — regenerate with real paths after post-processing", "• Fix AcoustID retag not writing corrected tags to audio file", "• Fix wishlist albums cycle stuck at 1 concurrent worker instead of configured value", diff --git a/webui/index.html b/webui/index.html index 5f8dd41c..f1c63959 100644 --- a/webui/index.html +++ b/webui/index.html @@ -4497,7 +4497,7 @@ - +