aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/CollectionFolder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities/CollectionFolder.cs')
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs100
1 files changed, 100 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
new file mode 100644
index 000000000..5684f8e80
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -0,0 +1,100 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Logging;
+using MediaBrowser.Model.Tasks;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Entities
+{
+ /// <summary>
+ /// Specialized Folder class that points to a subset of the physical folders in the system.
+ /// It is created from the user-specific folders within the system root
+ /// </summary>
+ public class CollectionFolder : Folder, ICollectionFolder
+ {
+ /// <summary>
+ /// Gets a value indicating whether this instance is virtual folder.
+ /// </summary>
+ /// <value><c>true</c> if this instance is virtual folder; otherwise, <c>false</c>.</value>
+ [IgnoreDataMember]
+ public override bool IsVirtualFolder
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Allow different display preferences for each collection folder
+ /// </summary>
+ /// <value>The display prefs id.</value>
+ public override Guid DisplayPrefsId
+ {
+ get
+ {
+ return Id;
+ }
+ }
+
+ // Cache this since it will be used a lot
+ /// <summary>
+ /// The null task result
+ /// </summary>
+ private static readonly Task NullTaskResult = Task.FromResult<object>(null);
+
+ /// <summary>
+ /// Compare our current children (presumably just read from the repo) with the current state of the file system and adjust for any changes
+ /// ***Currently does not contain logic to maintain items that are unavailable in the file system***
+ /// </summary>
+ /// <param name="progress">The progress.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <param name="recursive">if set to <c>true</c> [recursive].</param>
+ /// <returns>Task.</returns>
+ protected override Task ValidateChildrenInternal(IProgress<TaskProgress> progress, CancellationToken cancellationToken, bool? recursive = null)
+ {
+ //we don't directly validate our children
+ //but we do need to clear out the index cache...
+ IndexCache = new ConcurrentDictionary<string, List<BaseItem>>(StringComparer.OrdinalIgnoreCase);
+
+ return NullTaskResult;
+ }
+
+ /// <summary>
+ /// Our children are actually just references to the ones in the physical root...
+ /// </summary>
+ /// <value>The actual children.</value>
+ protected override ConcurrentBag<BaseItem> ActualChildren
+ {
+ get
+ {
+ IEnumerable<Guid> folderIds;
+
+ try
+ {
+ // Accessing ResolveArgs could involve file system access
+ folderIds = ResolveArgs.PhysicalLocations.Select(f => (f.GetMBId(typeof(Folder))));
+ }
+ catch (IOException ex)
+ {
+ Logger.LogException("Error creating FolderIds for {0}", ex, Path);
+
+ folderIds = new Guid[] {};
+ }
+
+ var ourChildren =
+ Kernel.Instance.RootFolder.Children.OfType<Folder>()
+ .Where(i => folderIds.Contains(i.Id))
+ .SelectMany(c => c.Children);
+
+ return new ConcurrentBag<BaseItem>(ourChildren);
+ }
+ }
+ }
+}