From 6dfefeeec3ea9f8466a22cb8f8ee0eba718d4860 Mon Sep 17 00:00:00 2001 From: Mikal Stordal Date: Sun, 14 Apr 2024 00:45:23 +0200 Subject: [PATCH] misc: add warning for windows users - Add a warning for windows users that they need to enable dev mode to be allowed to create sym links, along with a link for how to enable it. Also, this warning is only shown if we fail the test to create a sym link at start up. - Disable the VFS by default if we cannot create sym links. --- Shokofin/Configuration/PluginConfiguration.cs | 9 ++++++- Shokofin/Configuration/configController.js | 4 +++ Shokofin/Configuration/configPage.html | 2 ++ Shokofin/Plugin.cs | 26 ++++++++++++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Shokofin/Configuration/PluginConfiguration.cs b/Shokofin/Configuration/PluginConfiguration.cs index 7358a7d0..f0c05343 100644 --- a/Shokofin/Configuration/PluginConfiguration.cs +++ b/Shokofin/Configuration/PluginConfiguration.cs @@ -16,6 +16,13 @@ public class PluginConfiguration : BasePluginConfiguration { #region Connection + /// + /// Helper for the web ui to show the windows only warning, and to disable + /// the VFS by default if we cannot create symbolic links. + /// + [XmlIgnore, JsonInclude] + public bool CanCreateSymbolicLinks => Plugin.Instance.CanCreateSymbolicLinks; + /// /// The URL for where to connect to shoko internally. /// And externally if no is set. @@ -293,7 +300,7 @@ public PluginConfiguration() TitleAllowAny = false; DescriptionSourceList = new[] { TextSourceType.AniDb, TextSourceType.TvDb, TextSourceType.TMDB }; DescriptionSourceOrder = new[] { TextSourceType.AniDb, TextSourceType.TvDb, TextSourceType.TMDB }; - VirtualFileSystem = true; + VirtualFileSystem = CanCreateSymbolicLinks; VirtualFileSystemThreads = 10; UseGroupsForShows = false; SeparateMovies = false; diff --git a/Shokofin/Configuration/configController.js b/Shokofin/Configuration/configController.js index df841d99..92cf6a9d 100644 --- a/Shokofin/Configuration/configController.js +++ b/Shokofin/Configuration/configController.js @@ -639,6 +639,10 @@ export default function (page) { else { form.querySelector("#ServerVersion").value = "Version N/A"; } + if (!config.CanCreateSymbolicLinks) { + form.querySelector("#WindowsSymLinkWarning1").removeAttribute("hidden"); + form.querySelector("#WindowsSymLinkWarning2").removeAttribute("hidden"); + } if (config.ApiKey) { form.querySelector("#Url").setAttribute("disabled", ""); form.querySelector("#Username").setAttribute("disabled", ""); diff --git a/Shokofin/Configuration/configPage.html b/Shokofin/Configuration/configPage.html index c2eca30f..2f64d89b 100644 --- a/Shokofin/Configuration/configPage.html +++ b/Shokofin/Configuration/configPage.html @@ -228,6 +228,7 @@

Media Folder Settings

Enables the use of the Virtual File System™ for any new media libraries managed by the plugin.
+
What does this mean? Enabling this setting should in theory make it so you won't have to think about file structure incompatibilities, since it will override your existing file structure and replace it with a layer of symbolic links managed by the plugin instead of your actual file structure. @@ -272,6 +273,7 @@

Media Folder Settings

Enables the use of the Virtual File System™ for the library.
+
What does this mean? Enabling this setting should in theory make it so you won't have to think about file structure incompatibilities, since it will override your existing file structure and replace it with a layer of symbolic links managed by the plugin instead of your actual file structure. diff --git a/Shokofin/Plugin.cs b/Shokofin/Plugin.cs index 4f9cfe1f..472b0cf1 100644 --- a/Shokofin/Plugin.cs +++ b/Shokofin/Plugin.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Plugins; using MediaBrowser.Model.Plugins; @@ -19,6 +20,8 @@ public class Plugin : BasePlugin, IHasWebPages public override Guid Id => Guid.Parse("5216ccbf-d24a-4eb3-8a7e-7da4230b7052"); + public readonly bool CanCreateSymbolicLinks; + private readonly ILogger Logger; /// @@ -33,7 +36,28 @@ public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer, IgnoredFolders = Configuration.IgnoredFolders.ToHashSet(); VirtualRoot = Path.Combine(applicationPaths.ProgramDataPath, "Shokofin", "VFS"); Logger = logger; - Logger.LogInformation("Virtual File System Location; {Path}", VirtualRoot); + CanCreateSymbolicLinks = true; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { + var target = Path.Combine(Path.GetDirectoryName(VirtualRoot)!, "TestTarget.txt"); + var link = Path.Combine(Path.GetDirectoryName(VirtualRoot)!, "TestLink.txt"); + try { + if (!Directory.Exists(Path.GetDirectoryName(VirtualRoot)!)) + Directory.CreateDirectory(Path.GetDirectoryName(VirtualRoot)!); + File.Create(target); + File.CreateSymbolicLink(link, target); + } + catch { + CanCreateSymbolicLinks = false; + } + finally { + if (File.Exists(link)) + File.Delete(link); + if (File.Exists(target)) + File.Delete(target); + } + } + Logger.LogDebug("Virtual File System Location; {Path}", VirtualRoot); + Logger.LogDebug("Can create symbolic links; {Value}", CanCreateSymbolicLinks); } public void OnConfigChanged(object? sender, BasePluginConfiguration e)