{"record":{"id":"05ff7b3f277c2a4b","repo":"Sonarr/Sonarr","slug":"no-remoteepisode-release-downloadprotocol-downlo","errorCode":null,"errorMessage":"No {remoteEpisode.Release.DownloadProtocol} download client available","messagePattern":"No (.+?) download client available","errorType":"exception","errorClass":"DownloadClientUnavailableException","httpStatus":null,"severity":"error","filePath":"src/NzbDrone.Core/Download/DownloadService.cs","lineNumber":77,"sourceCode":"            var tags = remoteEpisode.Series?.Tags;\n\n            if (downloadClientId.HasValue)\n            {\n                var specificClient = _downloadClientProvider.Get(downloadClientId.Value);\n                await DownloadReport(remoteEpisode, specificClient);\n\n                return;\n            }\n\n            var availableClients = _downloadClientProvider.GetDownloadClients(\n                remoteEpisode.Release.DownloadProtocol,\n                remoteEpisode.Release.IndexerId,\n                filterBlockedClients,\n                tags).ToList();\n\n            if (!availableClients.Any())\n            {\n                throw new DownloadClientUnavailableException($\"No {remoteEpisode.Release.DownloadProtocol} download client available\");\n            }\n\n            var triedClients = new HashSet<int>();\n\n            foreach (var downloadClient in availableClients)\n            {\n                if (triedClients.Contains(downloadClient.Definition.Id))\n                {\n                    continue;\n                }\n\n                try\n                {\n                    _logger.Debug(\"Attempting download with client: {0}\", downloadClient.Definition.Name);\n                    await DownloadReport(remoteEpisode, downloadClient);\n\n                    _downloadClientProvider.ReportSuccessfulDownloadClient(\n                        remoteEpisode.Release.DownloadProtocol,","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/Sonarr/Sonarr/blob/da2284d7eaab22ed9b2ca698af690148d691e967/src/NzbDrone.Core/Download/DownloadService.cs#L59-L95","documentation":"In DownloadService.DownloadReport, GetDownloadClients returned an empty list for the release's protocol after all filtering, so there is no client to grab with. DownloadClientUnavailableException. Distinct from 186: 186 fires inside the provider during filtering, whereas 190 fires in the service after the provider already returned empty (e.g. no enabled client for the protocol at all).","triggerScenarios":"Grabbing a release whose DownloadProtocol has zero enabled, non-filtered clients after tag/indexer/blocked filtering: availableClients.Any() is false.","commonSituations":"No usenet client is configured but the release is usenet (or vice versa for torrents); all clients for the protocol are disabled; the tag filter excluded everyone.","solutions":["Add and enable a client matching the release's DownloadProtocol (usenet or torrent).","Enable an existing but disabled client for that protocol.","Fix client tags so at least one is eligible for the series."],"exampleFix":"// before: usenet release grabbed with no usenet client configured\n// after: add a usenet client (Sabnzbd / Nzbget) and enable it","handlingStrategy":"validation","validationCode":"var hasClient = _downloadClientFactory.GetAvailableProviders().Any(c => c.Protocol == release.DownloadProtocol);\nif (!hasClient) { /* no enabled client for this protocol: configuration error, do not attempt grab */ }","typeGuard":null,"tryCatchPattern":"try { await _downloadService.DownloadReport(remoteEpisode, downloadClientId); }\ncatch (DownloadClientUnavailableException ex) when (ex.Message.Contains(\"download client available\"))\n{\n    // tell the user to add/enable a client for the release protocol\n}","preventionTips":["Configure at least one enabled client for each protocol you use.","Run a configuration health check on startup and when settings change.","Surface 'no client for protocol' as a setup error, not a silent skip."],"tags":["download-client","configuration","protocol"],"backgroundTag":null,"analyzedSha":"da2284d7eaab22ed9b2ca698af690148d691e967","analyzedAt":"2026-08-13T15:53:02.562Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}