{"record":{"id":"6e524fedb074cce9","repo":"rocksdanister/lively","slug":"xaml-island-gif-player-not-available","errorCode":null,"errorMessage":"xaml island gif player not available.","messagePattern":"xaml island gif player not available\\.","errorType":"exception","errorClass":"PluginNotFoundException","httpStatus":null,"severity":"error","filePath":"src/Lively/Lively/Factories/WallpaperPluginFactory.cs","lineNumber":116,"sourceCode":"                                model,\n                                display,\n                                lpFactory.CreateLivelyPropertyFolder(model, display, arrangement, userSettings),\n                                userSettings.Settings.VideoPlayerHwAccel,\n                                isWindowed: isWindowed,\n                                userSettings.Settings.VideoTargetColorSpaceMode);\n                        case LivelyMediaPlayer.vlc:\n                            return new VideoVlcPlayer(model.FilePath, \n                                model, \n                                display,\n                                userSettings.Settings.WallpaperScaling, \n                                userSettings.Settings.VideoPlayerHwAccel);\n                    }\n                    break;\n                case WallpaperType.gif:\n                    switch (userSettings.Settings.GifPlayer)\n                    {\n                        case LivelyGifPlayer.win10Img:\n                        throw new PluginNotFoundException(\"xaml island gif player not available.\");\n                        case LivelyGifPlayer.libmpvExt:\n                            throw new DepreciatedException(\"libmpvExt depreciated player selected.\");\n                        case LivelyGifPlayer.mpv:\n                            return new VideoMpvPlayer(model.FilePath,\n                                model,\n                                display,\n                                lpFactory.CreateLivelyPropertyFolder(model, display, arrangement, userSettings),\n                                userSettings.Settings.VideoPlayerHwAccel,\n                                isWindowed: isWindowed, \n                                userSettings.Settings.VideoTargetColorSpaceMode);\n                        case LivelyGifPlayer.libvlcExt:\n                            return new VideoLibVlcPlayer(model.FilePath,\n                                model,\n                                display,\n                                lpFactory.CreateLivelyPropertyFolder(model, display, arrangement, userSettings),\n                                userSettings.Settings.ApplicationTheme,\n                                userSettings.Settings.AudioVolumeGlobal,\n                                userSettings.Settings.VideoPlayerHwAccel);","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/rocksdanister/lively/blob/c1036feb664960722e34bf4309042c247d6a909d/src/Lively/Lively/Factories/WallpaperPluginFactory.cs#L98-L134","documentation":"Thrown by WallpaperPluginFactory.CreateWallpaper when a WallpaperType.gif item is created with userSettings.Settings.GifPlayer == LivelyGifPlayer.win10Img. The win10Img backend relied on a UWP XAML Island control that is no longer shipped/compiled into the app, so the factory refuses to construct it rather than silently substituting another backend. No fallback player is selected automatically; the caller receives the exception directly.","triggerScenarios":"Calling factory.CreateWallpaper(model, display, arrangement) where model.LivelyInfo.Type == WallpaperType.gif and userSettings.Settings.GifPlayer == LivelyGifPlayer.win10Img.","commonSituations":"A user upgraded Lively and their persisted settings file still stores the removed win10Img GIF player. Dev builds that exclude the XAML Island project surface it. Manually editing the config JSON to win10Img reproduces it immediately.","solutions":["Set the GIF player to mpv (or libvlcExt) in Settings and restart Lively.","On startup, migrate/reset userSettings.Settings.GifPlayer to a supported value when it equals win10Img.","Remove win10Img from the settings picker so it can never be selected."],"exampleFix":"// before\nswitch (userSettings.Settings.GifPlayer)\n{\n    case LivelyGifPlayer.win10Img:\n        throw new PluginNotFoundException(\"xaml island gif player not available.\");\n    case LivelyGifPlayer.mpv:\n        return new VideoMpvPlayer(model.FilePath, model, display, ...);\n}\n\n// after: migrate the removed value to the supported mpv backend instead of throwing\nswitch (userSettings.Settings.GifPlayer)\n{\n    case LivelyGifPlayer.win10Img:\n    case LivelyGifPlayer.mpv:\n        return new VideoMpvPlayer(model.FilePath, model, display,\n            lpFactory.CreateLivelyPropertyFolder(model, display, arrangement, userSettings),\n            userSettings.Settings.VideoPlayerHwAccel,\n            isWindowed: isWindowed,\n            userSettings.Settings.VideoTargetColorSpaceMode);\n}","handlingStrategy":"validation","validationCode":"if (model.LivelyInfo.Type == WallpaperType.gif &&\n    userSettings.Settings.GifPlayer == LivelyGifPlayer.win10Img)\n{\n    // win10Img backend removed; auto-migrate to the supported mpv backend\n    userSettings.Settings.GifPlayer = LivelyGifPlayer.mpv;\n}","typeGuard":"static bool IsGifBackendSupported(LibraryModel model, IUserSettingsService s) =>\n    model.LivelyInfo.Type != WallpaperType.gif ||\n    s.Settings.GifPlayer != LivelyGifPlayer.win10Img;","tryCatchPattern":"try\n{\n    var wp = factory.CreateWallpaper(model, display, arrangement);\n}\ncatch (WallpaperPluginFactory.PluginNotFoundException ex) when (ex.Message.Contains(\"gif player\"))\n{\n    Logger.Warn(ex, \"Migrating removed GIF player; retrying with mpv.\");\n    userSettings.Settings.GifPlayer = LivelyGifPlayer.mpv;\n    wp = factory.CreateWallpaper(model, display, arrangement);\n}","preventionTips":["Migrate removed player-enum values to a supported default on app startup, before any wallpaper is created.","Filter the settings UI options against the set of players the running build actually compiles in.","Add a smoke test that loads one wallpaper of each type with the default config after every player-enum change."],"tags":["wallpaper","config","deprecated","gif","csharp"],"backgroundTag":null,"analyzedSha":"c1036feb664960722e34bf4309042c247d6a909d","analyzedAt":"2026-08-13T13:03:12.648Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}