{"record":{"id":"dd260067f0e2165b","repo":"JosefNemec/Playnite","slug":"uknown-installer-manifest-url-format-installerman","errorCode":null,"errorMessage":"Uknown installer manifest url format {InstallerManifestUrl}.","messagePattern":"Uknown installer manifest url format (.+?)\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"warning","filePath":"source/Playnite/Manifests/AddonManifests.cs","lineNumber":241,"sourceCode":"        {\r\n            try\r\n            {\r\n                if (InstallerManifestUrl.IsNullOrEmpty())\r\n                {\r\n                    throw new Exception(\"No addon manifest installer url.\");\r\n                }\r\n\r\n                if (InstallerManifestUrl.StartsWith(\"http\", StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    installerManifest = PlayniteApplication.Current.ServicesClient.GetAddonInstaller(AddonId);\r\n                }\r\n                else if (File.Exists(InstallerManifestUrl))\r\n                {\r\n                    installerManifest = Serialization.FromYamlFile<AddonInstallerManifest>(InstallerManifestUrl);\r\n                }\r\n                else\r\n                {\r\n                    throw new Exception($\"Uknown installer manifest url format {InstallerManifestUrl}.\");\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to get addon installer manifest data.\");\r\n                installerManifest = new AddonInstallerManifest();\r\n            }\r\n\r\n            installerManifest.AddonType = Type;\r\n        }\r\n    }\r\n}\r\n","sourceCodeStart":223,"sourceCodeEnd":254,"githubUrl":"https://github.com/JosefNemec/Playnite/blob/5911f4e964e628aa7a69c2030ab35101afa63067/source/Playnite/Manifests/AddonManifests.cs#L223-L254","documentation":"Thrown by DownloadInstallerManifest when InstallerManifestUrl is neither an http(s) URL nor an existing file path. After ruling out the http prefix and File.Exists, the format is unrecognized. The exception is swallowed by the surrounding catch (PlayniteEnvironment.ThrowAllErrors off) and replaced with an empty AddonInstallerManifest plus a logged error.","triggerScenarios":"InstallerManifestUrl is a non-http string that is not a valid file path — e.g. an ftp URI, a malformed path, or a placeholder token that was never expanded.","commonSituations":"Manifest author put a placeholder or unsupported scheme in InstallerManifestUrl; path contains unexpanded variables; the file was moved/deleted between manifest parse and install.","solutions":["Ensure InstallerManifestUrl is either an http(s) URL or a resolvable local file path.","If using local paths, verify the file exists before triggering addon install.","Expand any path variables/placeholders in the url before calling DownloadInstallerManifest."],"exampleFix":"// before\nelse { throw new Exception($\"Uknown installer manifest url format {InstallerManifestUrl}.\"); }\n\n// after — explicit scheme handling with fallback\nelse {\n    logger.Error($\"Installer manifest URL '{InstallerManifestUrl}' is neither http(s) nor an existing file.\");\n    installerManifest = new AddonInstallerManifest();\n}","handlingStrategy":"try-catch","validationCode":"// Classify the URL scheme/path before download.\nif (!InstallerManifestUrl.StartsWith(\"http\", StringComparison.OrdinalIgnoreCase) && !File.Exists(InstallerManifestUrl)) {\n    logger.Error($\"Unrecognized installer URL: {InstallerManifestUrl}\");\n    return;\n}","typeGuard":"static bool IsValidInstallerUrl(string url) =>\n    !url.IsNullOrEmpty() &&\n    (url.StartsWith(\"http\", StringComparison.OrdinalIgnoreCase) || File.Exists(url));","tryCatchPattern":"try { manifest.DownloadInstallerManifest(token); }\ncatch (Exception ex) when (!PlayniteEnvironment.ThrowAllErrors) { logger.Error(ex, \"Installer manifest download failed.\"); }","preventionTips":["Normalize InstallerManifestUrl to http(s) or an absolute file path.","Expand any variables before calling DownloadInstallerManifest.","Rely on the built-in catch that yields an empty manifest, but log details for diagnosis."],"tags":["addon","manifest","network","filesystem","fallback"],"backgroundTag":null,"analyzedSha":"5911f4e964e628aa7a69c2030ab35101afa63067","analyzedAt":"2026-08-13T17:38:25.713Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}