瀏覽代碼

Merge pull request #952 from Liggy/populate-extras

Populate video extras again
Vasily 6 年之前
父節點
當前提交
6c967c5982
共有 2 個文件被更改,包括 68 次插入7 次删除
  1. 1 0
      CONTRIBUTORS.md
  2. 67 7
      MediaBrowser.Controller/Entities/BaseItem.cs

+ 1 - 0
CONTRIBUTORS.md

@@ -19,6 +19,7 @@
  - [LogicalPhallacy](https://github.com/LogicalPhallacy/)
  - [RazeLighter777](https://github.com/RazeLighter777)
  - [WillWill56](https://github.com/WillWill56)
+ - [Liggy](https://github.com/Liggy)
  - [fruhnow](https://github.com/fruhnow)
 
 # Emby Contributors

+ 67 - 7
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -1283,6 +1283,35 @@ namespace MediaBrowser.Controller.Entities
                 }).OrderBy(i => i.Path).ToArray();
         }
 
+        protected virtual BaseItem[] LoadExtras(List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService)
+        {
+            var files = fileSystemChildren.Where(i => i.IsDirectory)
+                .SelectMany(i => FileSystem.GetFiles(i.FullName));
+
+            return LibraryManager.ResolvePaths(files, directoryService, null, new LibraryOptions())
+                .OfType<Video>()
+                .Select(item =>
+                {
+                    // Try to retrieve it from the db. If we don't find it, use the resolved version
+                    var dbItem = LibraryManager.GetItemById(item.Id) as Video;
+
+                    if (dbItem != null)
+                    {
+                        item = dbItem;
+                    }
+                    else
+                    {
+                        // item is new
+                        item.ExtraType = MediaBrowser.Model.Entities.ExtraType.Clip;
+                    }
+
+                    return item;
+
+                    // Sort them so that the list can be easily compared for changes
+                }).OrderBy(i => i.Path).ToArray();
+        }
+
+
         public Task RefreshMetadata(CancellationToken cancellationToken)
         {
             return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)), cancellationToken);
@@ -1371,6 +1400,8 @@ namespace MediaBrowser.Controller.Entities
 
             var themeVideosChanged = false;
 
+            var extrasChanged = false;
+
             var localTrailersChanged = false;
 
             if (IsFileProtocol && SupportsOwnedItems)
@@ -1382,6 +1413,8 @@ namespace MediaBrowser.Controller.Entities
                         themeSongsChanged = await RefreshThemeSongs(this, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
 
                         themeVideosChanged = await RefreshThemeVideos(this, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
+
+                        extrasChanged = await RefreshExtras(this, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
                     }
                 }
 
@@ -1392,7 +1425,7 @@ namespace MediaBrowser.Controller.Entities
                 }
             }
 
-            return themeSongsChanged || themeVideosChanged || localTrailersChanged;
+            return themeSongsChanged || themeVideosChanged || extrasChanged || localTrailersChanged;
         }
 
         protected virtual FileSystemMetadata[] GetFileSystemChildren(IDirectoryService directoryService)
@@ -1435,6 +1468,31 @@ namespace MediaBrowser.Controller.Entities
             return itemsChanged;
         }
 
+        private async Task<bool> RefreshExtras(BaseItem item, MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
+        {
+            var newExtras = LoadExtras(fileSystemChildren, options.DirectoryService).Concat(LoadThemeVideos(fileSystemChildren, options.DirectoryService)).Concat(LoadThemeSongs(fileSystemChildren, options.DirectoryService));
+
+            var newExtraIds = newExtras.Select(i => i.Id).ToArray();
+
+            var extrasChanged = !item.ExtraIds.SequenceEqual(newExtraIds);
+
+            if (extrasChanged)
+            {
+                var ownerId = item.Id;
+
+                var tasks = newExtras.Select(i =>
+                {
+                    return RefreshMetadataForOwnedItem(i, true, new MetadataRefreshOptions(options), cancellationToken);
+                });
+
+                await Task.WhenAll(tasks).ConfigureAwait(false);
+
+                item.ExtraIds = newExtraIds;
+            }
+
+            return extrasChanged;
+        }
+
         private async Task<bool> RefreshThemeVideos(BaseItem item, MetadataRefreshOptions options, IEnumerable<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
         {
             var newThemeVideos = LoadThemeVideos(fileSystemChildren, options.DirectoryService);
@@ -2775,17 +2833,17 @@ namespace MediaBrowser.Controller.Entities
 
         public IEnumerable<BaseItem> GetExtras()
         {
-            return ThemeVideoIds.Select(LibraryManager.GetItemById).Where(i => i.ExtraType.Equals(Model.Entities.ExtraType.ThemeVideo)).OrderBy(i => i.SortName);
+            return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null).OrderBy(i => i.SortName);
         }
 
-        public IEnumerable<BaseItem> GetExtras(ExtraType[] unused)
+        public IEnumerable<BaseItem> GetExtras(ExtraType[] extraTypes)
         {
-            return GetExtras();
+            return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null && extraTypes.Contains(i.ExtraType.Value)).OrderBy(i => i.SortName);
         }
 
         public IEnumerable<BaseItem> GetDisplayExtras()
         {
-            return GetExtras();
+            return GetExtras(DisplayExtraTypes);
         }
 
         public virtual bool IsHD => Height >= 720;
@@ -2798,8 +2856,10 @@ namespace MediaBrowser.Controller.Entities
         {
             return RunTimeTicks ?? 0;
         }
-        // what does this do?
-        public static ExtraType[] DisplayExtraTypes = new[] { Model.Entities.ExtraType.ThemeSong, Model.Entities.ExtraType.ThemeVideo };
+
+        // Possible types of extra videos
+        public static ExtraType[] DisplayExtraTypes = new[] { Model.Entities.ExtraType.BehindTheScenes, Model.Entities.ExtraType.Clip, Model.Entities.ExtraType.DeletedScene, Model.Entities.ExtraType.Interview, Model.Entities.ExtraType.Sample, Model.Entities.ExtraType.Scene };
+
         public virtual bool SupportsExternalTransfer => false;
     }
 }