浏览代码

stub out storage for new path substitution

Luke Pulverenti 8 年之前
父节点
当前提交
8b096ccc0e

+ 18 - 2
MediaBrowser.Api/Library/LibraryStructureService.cs

@@ -112,6 +112,8 @@ namespace MediaBrowser.Api.Library
         /// <value>The name.</value>
         public string Path { get; set; }
 
+        public MediaPathInfo PathInfo { get; set; }
+
         /// <summary>
         /// Gets or sets a value indicating whether [refresh library].
         /// </summary>
@@ -212,7 +214,12 @@ namespace MediaBrowser.Api.Library
         {
             var libraryOptions = request.LibraryOptions ?? new LibraryOptions();
 
-            _libraryManager.AddVirtualFolder(request.Name, request.CollectionType, request.Paths, libraryOptions, request.RefreshLibrary);
+            if (request.Paths != null && request.Paths.Length > 0)
+            {
+                libraryOptions.PathInfos = request.Paths.Select(i => new MediaPathInfo { Path = i }).ToArray();
+            }
+
+            _libraryManager.AddVirtualFolder(request.Name, request.CollectionType, libraryOptions, request.RefreshLibrary);
         }
 
         /// <summary>
@@ -308,7 +315,16 @@ namespace MediaBrowser.Api.Library
 
             try
             {
-                _libraryManager.AddMediaPath(request.Name, request.Path);
+                var mediaPath = request.PathInfo;
+
+                if (mediaPath == null)
+                {
+                    mediaPath = new MediaPathInfo
+                    {
+                        Path = request.Path
+                    };
+                }
+                _libraryManager.AddMediaPath(request.Name, mediaPath);
             }
             finally
             {

+ 1 - 1
MediaBrowser.Controller/Entities/Audio/Audio.cs

@@ -262,7 +262,7 @@ namespace MediaBrowser.Controller.Entities.Audio
                 Protocol = locationType == LocationType.Remote ? MediaProtocol.Http : MediaProtocol.File,
                 MediaStreams = MediaSourceManager.GetMediaStreams(i.Id).ToList(),
                 Name = i.Name,
-                Path = enablePathSubstituion ? GetMappedPath(i.Path, locationType) : i.Path,
+                Path = enablePathSubstituion ? GetMappedPath(i, i.Path, locationType) : i.Path,
                 RunTimeTicks = i.RunTimeTicks,
                 Container = i.Container,
                 Size = i.Size

+ 2 - 2
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -2121,11 +2121,11 @@ namespace MediaBrowser.Controller.Entities
             return hasChanges;
         }
 
-        protected static string GetMappedPath(string path, LocationType locationType)
+        protected static string GetMappedPath(BaseItem item, string path, LocationType locationType)
         {
             if (locationType == LocationType.FileSystem || locationType == LocationType.Offline)
             {
-                return LibraryManager.GetPathAfterNetworkSubstitution(path);
+                return LibraryManager.GetPathAfterNetworkSubstitution(path, item);
             }
 
             return path;

+ 18 - 13
MediaBrowser.Controller/Entities/CollectionFolder.cs

@@ -48,24 +48,14 @@ namespace MediaBrowser.Controller.Entities
         private static readonly Dictionary<string, LibraryOptions> LibraryOptions = new Dictionary<string, LibraryOptions>();
         public LibraryOptions GetLibraryOptions()
         {
-            lock (LibraryOptions)
-            {
-                LibraryOptions options;
-                if (!LibraryOptions.TryGetValue(Path, out options))
-                {
-                    options = LoadLibraryOptions();
-                    LibraryOptions[Path] = options;
-                }
-
-                return options;
-            }
+            return GetLibraryOptions(Path);
         }
 
-        private LibraryOptions LoadLibraryOptions()
+        private static LibraryOptions LoadLibraryOptions(string path)
         {
             try
             {
-                var result = XmlSerializer.DeserializeFromFile(typeof(LibraryOptions), GetLibraryOptionsPath(Path)) as LibraryOptions;
+                var result = XmlSerializer.DeserializeFromFile(typeof(LibraryOptions), GetLibraryOptionsPath(path)) as LibraryOptions;
 
                 if (result == null)
                 {
@@ -100,6 +90,21 @@ namespace MediaBrowser.Controller.Entities
             SaveLibraryOptions(Path, options);
         }
 
+        public static LibraryOptions GetLibraryOptions(string path)
+        {
+            lock (LibraryOptions)
+            {
+                LibraryOptions options;
+                if (!LibraryOptions.TryGetValue(path, out options))
+                {
+                    options = LoadLibraryOptions(path);
+                    LibraryOptions[path] = options;
+                }
+
+                return options;
+            }
+        }
+
         public static void SaveLibraryOptions(string path, LibraryOptions options)
         {
             lock (LibraryOptions)

+ 1 - 1
MediaBrowser.Controller/Entities/Video.cs

@@ -600,7 +600,7 @@ namespace MediaBrowser.Controller.Entities
                 Protocol = locationType == LocationType.Remote ? MediaProtocol.Http : MediaProtocol.File,
                 MediaStreams = mediaStreams,
                 Name = GetMediaSourceName(i, mediaStreams),
-                Path = enablePathSubstitution ? GetMappedPath(i.Path, locationType) : i.Path,
+                Path = enablePathSubstitution ? GetMappedPath(i, i.Path, locationType) : i.Path,
                 RunTimeTicks = i.RunTimeTicks,
                 Video3DFormat = i.Video3DFormat,
                 VideoType = i.VideoType,

+ 3 - 3
MediaBrowser.Controller/Library/ILibraryManager.cs

@@ -506,7 +506,7 @@ namespace MediaBrowser.Controller.Library
         /// <returns>QueryResult&lt;BaseItem&gt;.</returns>
         QueryResult<BaseItem> QueryItems(InternalItemsQuery query);
 
-        string GetPathAfterNetworkSubstitution(string path);
+        string GetPathAfterNetworkSubstitution(string path, BaseItem ownerItem = null);
 
         /// <summary>
         /// Substitutes the path.
@@ -556,9 +556,9 @@ namespace MediaBrowser.Controller.Library
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
         bool IgnoreFile(FileSystemMetadata file, BaseItem parent);
 
-        void AddVirtualFolder(string name, string collectionType, string[] mediaPaths, LibraryOptions options, bool refreshLibrary);
+        void AddVirtualFolder(string name, string collectionType, LibraryOptions options, bool refreshLibrary);
         void RemoveVirtualFolder(string name, bool refreshLibrary);
-        void AddMediaPath(string virtualFolderName, string path);
+        void AddMediaPath(string virtualFolderName, MediaPathInfo path);
         void RemoveMediaPath(string virtualFolderName, string path);
 
         QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query);

+ 8 - 0
MediaBrowser.Model/Configuration/LibraryOptions.cs

@@ -9,11 +9,19 @@
         public bool EnableChapterImageExtraction { get; set; }
         public bool ExtractChapterImagesDuringLibraryScan { get; set; }
         public bool DownloadImagesInAdvance { get; set; }
+        public MediaPathInfo[] PathInfos { get; set; }
 
         public LibraryOptions()
         {
             EnablePhotos = true;
             EnableRealtimeMonitor = true;
+            PathInfos = new MediaPathInfo[] { };
         }
     }
+
+    public class MediaPathInfo
+    {
+        public string Path { get; set; }
+        public string NetworkPath { get; set; }
+    }
 }

+ 2 - 2
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -1509,7 +1509,7 @@ namespace MediaBrowser.Server.Implementations.Dto
             }
         }
 
-        private string GetMappedPath(IHasMetadata item)
+        private string GetMappedPath(BaseItem item)
         {
             var path = item.Path;
 
@@ -1517,7 +1517,7 @@ namespace MediaBrowser.Server.Implementations.Dto
 
             if (locationType == LocationType.FileSystem || locationType == LocationType.Offline)
             {
-                path = _libraryManager.GetPathAfterNetworkSubstitution(path);
+                path = _libraryManager.GetPathAfterNetworkSubstitution(path, item);
             }
 
             return path;

+ 2 - 1
MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs

@@ -33,7 +33,8 @@ namespace MediaBrowser.Server.Implementations.Library
 
                 // Synology
                 "@eaDir",
-                "eaDir"
+                "eaDir",
+                "#recycle"
 
         };
         

+ 98 - 42
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -2527,8 +2527,29 @@ namespace MediaBrowser.Server.Implementations.Library
                 }).OrderBy(i => i.Path).ToList();
         }
 
-        public string GetPathAfterNetworkSubstitution(string path)
+        public string GetPathAfterNetworkSubstitution(string path, BaseItem ownerItem)
         {
+            if (ownerItem != null)
+            {
+                var libraryOptions = GetLibraryOptions(ownerItem);
+                if (libraryOptions != null)
+                {
+                    foreach (var pathInfo in libraryOptions.PathInfos)
+                    {
+                        if (string.IsNullOrWhiteSpace(pathInfo.NetworkPath))
+                        {
+                            continue;
+                        }
+
+                        var substitutionResult = SubstitutePathInternal(path, pathInfo.Path, pathInfo.NetworkPath);
+                        if (substitutionResult.Item2)
+                        {
+                            return substitutionResult.Item1;
+                        }
+                    }
+                }
+            }
+
             foreach (var map in ConfigurationManager.Configuration.PathSubstitutions)
             {
                 path = SubstitutePath(path, map.From, map.To);
@@ -2538,6 +2559,11 @@ namespace MediaBrowser.Server.Implementations.Library
         }
 
         public string SubstitutePath(string path, string from, string to)
+        {
+            return SubstitutePathInternal(path, from, to).Item1;
+        }
+
+        private Tuple<string, bool> SubstitutePathInternal(string path, string from, string to)
         {
             if (string.IsNullOrWhiteSpace(path))
             {
@@ -2552,7 +2578,11 @@ namespace MediaBrowser.Server.Implementations.Library
                 throw new ArgumentNullException("to");
             }
 
-            var newPath = path.Replace(from.Trim(), to.Trim(), StringComparison.OrdinalIgnoreCase);
+            from = from.Trim();
+            to = to.Trim();
+
+            var newPath = path.Replace(from, to, StringComparison.OrdinalIgnoreCase);
+            var changed = false;
 
             if (!string.Equals(newPath, path))
             {
@@ -2564,9 +2594,11 @@ namespace MediaBrowser.Server.Implementations.Library
                 {
                     newPath = newPath.Replace('/', '\\');
                 }
+
+                changed = true;
             }
 
-            return newPath;
+            return new Tuple<string, bool>(newPath, changed);
         }
 
         private void SetExtraTypeFromFilename(Video item)
@@ -2695,7 +2727,7 @@ namespace MediaBrowser.Server.Implementations.Library
             throw new InvalidOperationException();
         }
 
-        public void AddVirtualFolder(string name, string collectionType, string[] mediaPaths, LibraryOptions options, bool refreshLibrary)
+        public void AddVirtualFolder(string name, string collectionType, LibraryOptions options, bool refreshLibrary)
         {
             if (string.IsNullOrWhiteSpace(name))
             {
@@ -2713,12 +2745,13 @@ namespace MediaBrowser.Server.Implementations.Library
                 virtualFolderPath = Path.Combine(rootFolderPath, name);
             }
 
-            if (mediaPaths != null)
+            var mediaPathInfos = options.PathInfos;
+            if (mediaPathInfos != null)
             {
-                var invalidpath = mediaPaths.FirstOrDefault(i => !_fileSystem.DirectoryExists(i));
+                var invalidpath = mediaPathInfos.FirstOrDefault(i => !_fileSystem.DirectoryExists(i.Path));
                 if (invalidpath != null)
                 {
-                    throw new ArgumentException("The specified path does not exist: " + invalidpath + ".");
+                    throw new ArgumentException("The specified path does not exist: " + invalidpath.Path + ".");
                 }
             }
 
@@ -2740,11 +2773,11 @@ namespace MediaBrowser.Server.Implementations.Library
 
                 CollectionFolder.SaveLibraryOptions(virtualFolderPath, options);
 
-                if (mediaPaths != null)
+                if (mediaPathInfos != null)
                 {
-                    foreach (var path in mediaPaths)
+                    foreach (var path in mediaPathInfos)
                     {
-                        AddMediaPath(name, path);
+                        AddMediaPathInternal(name, path, false);
                     }
                 }
             }
@@ -2770,6 +2803,61 @@ namespace MediaBrowser.Server.Implementations.Library
             }
         }
 
+        private const string ShortcutFileExtension = ".mblink";
+        private const string ShortcutFileSearch = "*" + ShortcutFileExtension;
+        public void AddMediaPath(string virtualFolderName, MediaPathInfo pathInfo)
+        {
+            AddMediaPathInternal(virtualFolderName, pathInfo, true);
+        }
+
+        private void AddMediaPathInternal(string virtualFolderName, MediaPathInfo pathInfo, bool saveLibraryOptions)
+        {
+            if (pathInfo == null)
+            {
+                throw new ArgumentNullException("path");
+            }
+
+            var path = pathInfo.Path;
+
+            if (string.IsNullOrWhiteSpace(path))
+            {
+                throw new ArgumentNullException("path");
+            }
+
+            if (!_fileSystem.DirectoryExists(path))
+            {
+                throw new DirectoryNotFoundException("The path does not exist.");
+            }
+
+            var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
+            var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
+
+            var shortcutFilename = _fileSystem.GetFileNameWithoutExtension(path);
+
+            var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
+
+            while (_fileSystem.FileExists(lnk))
+            {
+                shortcutFilename += "1";
+                lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
+            }
+
+            _fileSystem.CreateShortcut(lnk, path);
+
+            RemoveContentTypeOverrides(path);
+
+            if (saveLibraryOptions)
+            {
+                var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath);
+
+                var list = libraryOptions.PathInfos.ToList();
+                list.Add(pathInfo);
+                libraryOptions.PathInfos = list.ToArray();
+
+                CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions);
+            }
+        }
+
         public void RemoveVirtualFolder(string name, bool refreshLibrary)
         {
             if (string.IsNullOrWhiteSpace(name))
@@ -2814,38 +2902,6 @@ namespace MediaBrowser.Server.Implementations.Library
             }
         }
 
-        private const string ShortcutFileExtension = ".mblink";
-        private const string ShortcutFileSearch = "*" + ShortcutFileExtension;
-        public void AddMediaPath(string virtualFolderName, string path)
-        {
-            if (string.IsNullOrWhiteSpace(path))
-            {
-                throw new ArgumentNullException("path");
-            }
-
-            if (!_fileSystem.DirectoryExists(path))
-            {
-                throw new DirectoryNotFoundException("The path does not exist.");
-            }
-
-            var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
-            var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
-
-            var shortcutFilename = _fileSystem.GetFileNameWithoutExtension(path);
-
-            var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
-
-            while (_fileSystem.FileExists(lnk))
-            {
-                shortcutFilename += "1";
-                lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
-            }
-
-            _fileSystem.CreateShortcut(lnk, path);
-
-            RemoveContentTypeOverrides(path);
-        }
-
         private void RemoveContentTypeOverrides(string path)
         {
             if (string.IsNullOrWhiteSpace(path))

+ 7 - 1
MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -143,9 +143,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
                     continue;
                 }
 
+                var mediaPathInfos = pathsToCreate.Select(i => new MediaPathInfo { Path = i }).ToArray();
+
+                var libraryOptions = new LibraryOptions
+                {
+                    PathInfos = mediaPathInfos
+                };
                 try
                 {
-                    _libraryManager.AddVirtualFolder(recordingFolder.Name, recordingFolder.CollectionType, pathsToCreate.ToArray(), new LibraryOptions(), true);
+                    _libraryManager.AddVirtualFolder(recordingFolder.Name, recordingFolder.CollectionType, libraryOptions, true);
                 }
                 catch (Exception ex)
                 {