JosefNemec/Playnite · error · FileNotFoundException
Extenstion/theme manifest not found.
Error message
Extenstion/theme manifest not found.
What it means
Thrown as FileNotFoundException by InstallPackedFile when GetPackedManifest returns null — the extension/theme package does not contain a readable manifest at the expected path (nanifestFileName). Without a manifest the installer cannot determine the addon id, type, or install directory.
Source
Thrown at source/Playnite/Plugins/ExtensionInstaller.cs:189
else
{
logger.Warn($"Can't uninstall extension, directory doesn't exists anymore {queueItem}");
}
}
}
File.Delete(PlaynitePaths.ExtensionQueueFilePath);
currentQueue = new List<ExtensionInstallQueueItem>();
return installedExts;
}
public static ExtensionInstallResult InstallPackedFile<T>(string packagePath, string nanifestFileName, string rootDir, Func<string, T> newMan) where T : BaseExtensionManifest
{
logger.Info($"Installing extenstion/theme {packagePath}");
var manifest = GetPackedManifest<T>(packagePath, nanifestFileName);
if (manifest == null)
{
throw new FileNotFoundException("Extenstion/theme manifest not found.");
}
var entries = Archive.GetArchiveFiles(packagePath);
if (entries.Any(a => a.EndsWith(".sln", StringComparison.OrdinalIgnoreCase)))
{
// Check for themes that are not packaged via Toolbox.
throw new Exception("Package content invalid.");
}
if (manifest is ThemeManifest themeMan)
{
rootDir = Path.Combine(rootDir, themeMan.Mode.ToString());
}
var wasUpdated = false;
var installDir = Path.Combine(rootDir, Paths.GetSafePathName(manifest.Id));
if (Directory.Exists(installDir))
{
View on GitHub (pinned to 5911f4e964)
Solutions
- Rebuild the extension/theme package with Playnite Toolbox so the manifest is included at the expected path.
- Inspect the archive contents to confirm the manifest filename matches nanifestFileName.
- Validate the manifest YAML parses correctly before packaging.
Example fix
// before
var manifest = GetPackedManifest<T>(packagePath, nanifestFileName);
if (manifest == null) { throw new FileNotFoundException("Extenstion/theme manifest not found."); }
// after
var manifest = GetPackedManifest<T>(packagePath, nanifestFileName);
if (manifest == null) {
throw new FileNotFoundException($"No valid manifest '{nanifestFileName}' found in package '{packagePath}'. Ensure it was built with Toolbox.", packagePath);
} Defensive patterns
Strategy: validation
Validate before calling
// Inspect the package for the manifest before installing.
var entries = Archive.GetArchiveFiles(packagePath);
if (!entries.Any(e => e.EndsWith(nanifestFileName, StringComparison.OrdinalIgnoreCase))) {
logger.Error($"No manifest '{nanifestFileName}' in {packagePath}");
return;
} Type guard
static bool PackageHasManifest(string packagePath, string manifestFile) =>
Archive.GetArchiveFiles(packagePath).Any(e => e.EndsWith(manifestFile, StringComparison.OrdinalIgnoreCase)); Try / catch
try { ExtensionInstaller.InstallPackedFile(...); }
catch (FileNotFoundException ex) when (ex.Message.Contains("manifest not found")) { logger.Error(ex, "Package missing manifest."); } Prevention
- Always build packages with Toolbox so the manifest is included.
- Verify archive contents before install.
- Reject packages without a manifest in the addon browser.
When it happens
Trigger: Installing a packed extension/theme archive whose manifest file (e.g. extension.yaml) is missing, misnamed, or failed to deserialize inside the package.
Common situations: Package built incorrectly (manifest omitted or renamed); the package is actually a source .sln bundle rather than a Toolbox-built pack; manifest YAML is malformed so deserialization yields null.
Related errors
- LOC.GeneralExtensionPackageError
- Package content invalid.
- No addon manifest installer url.
- Uknown installer manifest url format {InstallerManifestUrl}.
- Extension version string must be a real version!
AI-assisted analysis of JosefNemec/Playnite@5911f4e964 (2026-08-13).
Data as JSON: /api/errors/a3ffa119cd66e87e.
Report an issue: GitHub.