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

  1. Rebuild the extension/theme package with Playnite Toolbox so the manifest is included at the expected path.
  2. Inspect the archive contents to confirm the manifest filename matches nanifestFileName.
  3. 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

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


AI-assisted analysis of JosefNemec/Playnite@5911f4e964 (2026-08-13). Data as JSON: /api/errors/a3ffa119cd66e87e. Report an issue: GitHub.