{"record":{"id":"2c14a6175742f478","repo":"Sonarr/Sonarr","slug":"unable-to-parse","errorCode":null,"errorMessage":"Unable to parse","messagePattern":"Unable to parse","errorType":"validation","errorClass":"ValidationException","httpStatus":400,"severity":"error","filePath":"src/Sonarr.Api.V3/Indexers/ReleasePushController.cs","lineNumber":78,"sourceCode":"\n            ResolveIndexer(info);\n\n            var downloadClientId = ResolveDownloadClientId(release);\n\n            DownloadDecision decision;\n\n            lock (PushLock)\n            {\n                var decisions = _downloadDecisionMaker.GetRssDecision(new List<ReleaseInfo> { info }, true);\n\n                decision = decisions.FirstOrDefault();\n\n                _downloadDecisionProcessor.ProcessDecision(decision, downloadClientId).GetAwaiter().GetResult();\n            }\n\n            if (decision?.RemoteEpisode.ParsedEpisodeInfo == null)\n            {\n                throw new ValidationException(new List<ValidationFailure> { new(\"Title\", \"Unable to parse\", release.Title) });\n            }\n\n            return MapDecisions(new[] { decision });\n        }\n\n        private void ResolveIndexer(ReleaseInfo release)\n        {\n            var indexer = _indexerFactory.ResolveIndexer(release.IndexerId, release.Indexer);\n\n            if (indexer == null)\n            {\n                _logger.Debug(\"Push Release {0} not associated with an indexer.\", release.Title);\n            }\n            else\n            {\n                _logger.Debug(\"Push Release {0} associated with indexer '{1} ({2})\", release.Title, indexer.Name, indexer.Id);\n\n                release.IndexerId = indexer.Id;","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/Sonarr/Sonarr/blob/da2284d7eaab22ed9b2ca698af690148d691e967/src/Sonarr.Api.V3/Indexers/ReleasePushController.cs#L60-L96","documentation":"Returned by POST /api/v3/release/push when the pushed release's title could not be parsed into a ParsedEpisodeInfo after decision processing — decision?.RemoteEpisode.ParsedEpisodeInfo is null. Sonarr throws a ValidationException attaching the failure to the 'Title' field with the supplied release.Title as the attempted value. HTTP 400 (model validation).","triggerScenarios":"POST /api/v3/release/push with a Title that the parser cannot turn into episode info — e.g. a movie release name, garbage characters, a title with no season/episode pattern, or an anime title the parser doesn't recognize.","commonSituations":"Third-party tool pushing a release with a non-series title; copy-paste typos in the title; pushing a movie to Sonarr instead of Radarr; missing scene/absolute-number mapping.","solutions":["Send a Title that follows series naming (e.g. 'Series.Name.S01E02.1080p').","Verify the title contains a recognizable season/episode or absolute pattern.","Push the release to Radarr if it is actually a movie.","Improve parser/scene mapping for the series if the title is valid but unrecognized."],"exampleFix":"// before\n{ \"title\":\"Some.Movie.2023.1080p\", \"downloadUrl\":\"...\", \"protocol\":\"torrent\", \"publishDate\":\"...\" }\n\n// after\n{ \"title\":\"Series.Name.S01E02.1080p.WEB-DL\", \"downloadUrl\":\"...\", \"protocol\":\"torrent\", \"publishDate\":\"...\" }","handlingStrategy":"validation","validationCode":"function looksLikeSeries(t){ return /S\\d{1,2}E\\d{1,2}|\\d{1,3}x\\d{1,2}|\\b\\d{2,4}\\b/i.test(t); }\nif (!looksLikeSeries(release.title)) throw new Error('title does not parse as an episode');\nfetch('/api/v3/release/push', { method:'POST', body: JSON.stringify(release) });","typeGuard":"function isParsableEpisodeTitle(t){ return typeof t === 'string' && /S\\d{1,2}E\\d{1,2}/i.test(t); }","tryCatchPattern":"try { await push(release); }\ncatch (e) { if (/unable to parse/i.test(e.message)) { console.warn('not a series release; route to Radarr?'); } }","preventionTips":["Push only titles with recognizable season/episode patterns.","Route movie releases to Radarr, not Sonarr.","Keep scene/absolute mappings current for anime."],"tags":["api","release","push","parsing","validation"],"backgroundTag":null,"analyzedSha":"da2284d7eaab22ed9b2ca698af690148d691e967","analyzedAt":"2026-08-13T15:53:02.562Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}