{"record":{"id":"b13cad20b3648494","repo":"JosefNemec/Playnite","slug":"failed-to-download-update-manifest","errorCode":null,"errorMessage":"Failed to download update manifest.","messagePattern":"Failed to download update manifest\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"warning","filePath":"source/Playnite/App/Updater.cs","lineNumber":207,"sourceCode":"            {\r\n                logger.Warn(e, \"Failed to download update manifest from main URL\");\r\n            }\r\n\r\n            try\r\n            {\r\n                if (string.IsNullOrEmpty(dataString))\r\n                {\r\n                    dataString = GetUpdateManifestData(GetUpdateDataRootUrl(\"UpdateUrl2\"));\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Warn(e, \"Failed to download update manifest from secondary URL\");\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(dataString))\r\n            {\r\n                throw new Exception(\"Failed to download update manifest.\");\r\n            }\r\n\r\n            updateManifest = JsonConvert.DeserializeObject<UpdateManifest>(dataString);\r\n            return updateManifest;\r\n        }\r\n\r\n        public Version GetLatestVersion()\r\n        {\r\n            if (updateManifest == null)\r\n            {\r\n                DownloadManifest();\r\n            }\r\n\r\n            return updateManifest.Version;\r\n        }\r\n\r\n        private string GetUpdateManifestData(string url)\r\n        {\r","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/JosefNemec/Playnite/blob/5911f4e964e628aa7a69c2030ab35101afa63067/source/Playnite/App/Updater.cs#L189-L225","documentation":"Thrown when the update manifest could not be retrieved from either the primary or the secondary update URL. GetUpdateManifestData is tried for both endpoints; if both return empty data the method throws because it cannot parse version information. The secondary-URL failure is only logged as a warning, so this final throw means both sources failed.","triggerScenarios":"DownloadManifest receives empty/null data from the primary UpdateUrl, then also empty data from UpdateUrl2 (or the secondary request threw and was swallowed), leaving dataString empty.","commonSituations":"Playnite servers are unreachable or returning errors; DNS/proxy/​firewall blocks both update hosts; the client is offline; a captive portal intercepts the request and returns non-manifest content that resolves to empty.","solutions":["Verify internet connectivity and that the update hosts are reachable (no DNS/proxy block).","Retry later if the update servers are temporarily down.","Whitelist the update domains on any filtering proxy/​firewall.","Skip the update check (disable automatic updates) if the environment cannot reach the hosts."],"exampleFix":"// before\nvar manifest = updater.GetLatestVersion();\n\n// after\ntry\n{\n    var manifest = updater.GetLatestVersion();\n}\ncatch (Exception e)\n{\n    logger.Warn(e, \"Update check unavailable, skipping.\");\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { var latest = updater.GetLatestVersion(); }\ncatch (Exception e) { logger.Warn(e, \"Update manifest unavailable; skipping.\"); }","preventionTips":["Treat manifest fetch as best-effort; do not block startup on it.","Retry later when update servers are unreachable.","Whitelist update hosts on filtering proxies/firewalls."],"tags":["network","updater","manifest","playnite"],"backgroundTag":null,"analyzedSha":"5911f4e964e628aa7a69c2030ab35101afa63067","analyzedAt":"2026-08-13T17:38:25.713Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}