Browse Source

optimize FindByPath

Luke Pulverenti 9 năm trước cách đây
mục cha
commit
076a07a546

+ 5 - 0
MediaBrowser.Api/Playback/Progressive/VideoService.cs

@@ -148,6 +148,11 @@ namespace MediaBrowser.Api.Playback.Progressive
                     args += " -bsf:v h264_mp4toannexb";
                 }
 
+                if (state.RunTimeTicks.HasValue && state.VideoRequest.CopyTimestamps)
+                {
+                    args += " -copyts -avoid_negative_ts disabled -start_at_zero";
+                }
+                
                 return args;
             }
 

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

@@ -1359,7 +1359,7 @@ namespace MediaBrowser.Controller.Entities
         {
             if (!string.IsNullOrEmpty(info.Path))
             {
-                var itemByPath = LibraryManager.RootFolder.FindByPath(info.Path);
+                var itemByPath = LibraryManager.FindByPath(info.Path);
 
                 if (itemByPath == null)
                 {

+ 2 - 0
MediaBrowser.Controller/Entities/InternalItemsQuery.cs

@@ -45,6 +45,8 @@ namespace MediaBrowser.Controller.Entities
         public string NameLessThan { get; set; }
         public string NameContains { get; set; }
 
+        public string Path { get; set; }
+        
         public string Person { get; set; }
         public string[] PersonIds { get; set; }
         public string[] ItemIds { get; set; }

+ 7 - 0
MediaBrowser.Controller/Library/ILibraryManager.cs

@@ -56,6 +56,13 @@ namespace MediaBrowser.Controller.Library
         /// <returns>Task{Person}.</returns>
         Person GetPerson(string name);
 
+        /// <summary>
+        /// Finds the by path.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        /// <returns>BaseItem.</returns>
+        BaseItem FindByPath(string path);
+        
         /// <summary>
         /// Gets the artist.
         /// </summary>

+ 1 - 1
MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs

@@ -664,7 +664,7 @@ namespace MediaBrowser.Server.Implementations.IO
 
             while (item == null && !string.IsNullOrEmpty(path))
             {
-                item = LibraryManager.RootFolder.FindByPath(path);
+                item = LibraryManager.FindByPath(path);
 
                 path = Path.GetDirectoryName(path);
             }

+ 17 - 0
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -788,6 +788,23 @@ namespace MediaBrowser.Server.Implementations.Library
             return _userRootFolder;
         }
 
+        public BaseItem FindByPath(string path)
+        {
+            var query = new InternalItemsQuery
+            {
+                Path = path
+            };
+
+            var items = GetItemIds(query).Select(GetItemById).Where(i => i != null).ToArray();
+
+            if (items.Length == 1)
+            {
+                return items[0];
+            }
+            
+            return RootFolder.FindByPath(path);
+        }
+
         /// <summary>
         /// Gets a Person
         /// </summary>

+ 7 - 0
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs

@@ -130,6 +130,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
                                 "create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID)",
                                 "create index if not exists idx_TypedBaseItems on TypedBaseItems(guid)",
+                                "create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
                                 "create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
 
                                 "create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
@@ -1804,6 +1805,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 cmd.Parameters.Add(cmd, "@ParentId", DbType.Guid).Value = query.ParentId.Value;
             }
 
+            if (!string.IsNullOrWhiteSpace(query.Path))
+            {
+                whereClauses.Add("Path=@Path");
+                cmd.Parameters.Add(cmd, "@Path", DbType.String).Value = query.Path;
+            }
+
             if (query.MinEndDate.HasValue)
             {
                 whereClauses.Add("EndDate>=@MinEndDate");