{"record":{"id":"5519f8724111cd1b","repo":"jellyfin/jellyfin","slug":"the-loaded-archive-archivepath-does-not-appear","errorCode":null,"errorMessage":"The loaded archive '{archivePath}' does not appear to be a Jellyfin backup as its missing the '{ManifestEntryName}'.","messagePattern":"The loaded archive '(.+?)' does not appear to be a Jellyfin backup as its missing the '(.+?)'\\.","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"Jellyfin.Server.Implementations/FullSystemBackup/BackupService.cs","lineNumber":106,"sourceCode":"    public async Task RestoreBackupAsync(string archivePath)\n    {\n        _logger.LogWarning(\"Begin restoring system to {BackupArchive}\", archivePath); // Info isn't cutting it\n        if (!File.Exists(archivePath))\n        {\n            throw new FileNotFoundException($\"Requested backup file '{archivePath}' does not exist.\");\n        }\n\n        StorageHelper.TestCommonPathsForStorageCapacity(_applicationPaths, _logger);\n\n        var fileStream = File.OpenRead(archivePath);\n        await using (fileStream.ConfigureAwait(false))\n        {\n            using var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read, false);\n            var zipArchiveEntry = zipArchive.GetEntry(ManifestEntryName);\n\n            if (zipArchiveEntry is null)\n            {\n                throw new NotSupportedException($\"The loaded archive '{archivePath}' does not appear to be a Jellyfin backup as its missing the '{ManifestEntryName}'.\");\n            }\n\n            BackupManifest? manifest;\n            var manifestStream = await zipArchiveEntry.OpenAsync().ConfigureAwait(false);\n            await using (manifestStream.ConfigureAwait(false))\n            {\n                manifest = await JsonSerializer.DeserializeAsync<BackupManifest>(manifestStream, _serializerSettings).ConfigureAwait(false);\n            }\n\n            if (manifest!.ServerVersion > _applicationHost.ApplicationVersion) // newer versions of Jellyfin should be able to load older versions as we have migrations.\n            {\n                throw new NotSupportedException($\"The loaded archive '{archivePath}' is made for a newer version of Jellyfin ({manifest.ServerVersion}) and cannot be loaded in this version.\");\n            }\n\n            if (!TestBackupVersionCompatibility(manifest.BackupEngineVersion))\n            {\n                throw new NotSupportedException($\"The loaded archive '{archivePath}' is made for a newer version of Jellyfin ({manifest.ServerVersion}) and cannot be loaded in this version.\");\n            }","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/jellyfin/jellyfin/blob/ae8723026d97b6d0f926638803edef338919b794/Jellyfin.Server.Implementations/FullSystemBackup/BackupService.cs#L88-L124","documentation":"Thrown during RestoreBackupAsync after opening the zip archive, when zipArchive.GetEntry(ManifestEntryName) returns null. The manifest entry is Jellyfin's signature that the archive is a real FullSystemBackup output; an archive without it is treated as a foreign/incompatible zip and rejected.","triggerScenarios":"Pointing RestoreBackupAsync at an arbitrary .zip; at a backup made by a different/older backup mechanism; at a backup that was truncated or whose manifest entry was stripped.","commonSituations":"User selects a random zip thinking it is a Jellyfin backup; restore of a backup created by a much older engine that used a different manifest name; archive corrupted in transit so the central directory lacks the entry.","solutions":["Use an archive produced by BackupService.CreateBackupAsync on this Jellyfin line.","If migrating from an older backup format, restore on the version that created it, then re-back up and upgrade.","Re-download/re-copy the backup and verify its integrity (e.g. test the zip).","Confirm you are not pointing at a media/library archive by mistake."],"exampleFix":"null","handlingStrategy":"validation","validationCode":"using var za = new ZipArchive(File.OpenRead(archivePath), ZipArchiveMode.Read);\nif (za.GetEntry(ManifestEntryName) is null)\n    return Error(\"Selected archive is not a Jellyfin backup.\");","typeGuard":"null","tryCatchPattern":"try { await backup.RestoreBackupAsync(path); }\ncatch (NotSupportedException ex) when (ex.Message.Contains(\"does not appear to be a Jellyfin backup\"))\n{ /* prompt user for a valid backup */ }","preventionTips":["Only feed archives produced by CreateBackupAsync into restore.","Label and store backups with the Jellyfin version that made them.","Pre-validate the manifest entry before offering a file in the restore UI."],"tags":["backup","restore","validation"],"backgroundTag":null,"analyzedSha":"ae8723026d97b6d0f926638803edef338919b794","analyzedAt":"2026-08-13T10:43:30.013Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}