aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-06-04 22:32:40 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-06-04 22:32:40 -0400
commit7049ad66f47f4de3a62e0cc10ca8911f1dc454a7 (patch)
tree1984bb5f9780b0c413bbb62dcc66d91d2cb1d27e /MediaBrowser.Controller
parent39547de1f8ece19e609fe248514684c2f394ac2b (diff)
added library grouping settings.
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs7
-rw-r--r--MediaBrowser.Controller/Entities/User.cs8
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs93
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs67
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj1
5 files changed, 173 insertions, 3 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 5b5747b8f1..87b1cc7a3d 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -790,6 +790,11 @@ namespace MediaBrowser.Controller.Entities
return hasLinkedChildren ? list.DistinctBy(i => i.Id).ToList() : list;
}
+ protected virtual IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
+ {
+ return Children;
+ }
+
/// <summary>
/// Adds the children to list.
/// </summary>
@@ -803,7 +808,7 @@ namespace MediaBrowser.Controller.Entities
{
var hasLinkedChildren = false;
- foreach (var child in Children)
+ foreach (var child in GetEligibleChildrenForRecursiveChildren(user))
{
if (child.IsVisible(user))
{
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index 0a34b80168..a2803d2cec 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Serialization;
using System;
+using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Threading;
@@ -182,7 +183,7 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The configuration directory path.</value>
[IgnoreDataMember]
- private string ConfigurationDirectoryPath
+ internal string ConfigurationDirectoryPath
{
get
{
@@ -246,5 +247,10 @@ namespace MediaBrowser.Controller.Entities
Configuration = config;
SaveConfiguration();
}
+
+ public IEnumerable<Folder> GetViews()
+ {
+ return ((UserRootFolder)RootFolder).GetViews(this, CancellationToken.None).Result;
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index e5a8135c2d..ec7c02cfa3 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -1,6 +1,12 @@
-using MediaBrowser.Controller.Providers;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -51,5 +57,90 @@ namespace MediaBrowser.Controller.Entities
LibraryManager.RegisterItem(item);
}
}
+
+ public async Task<IEnumerable<Folder>> GetViews(User user, CancellationToken cancellationToken)
+ {
+ var folders = user.RootFolder
+ .GetChildren(user, true)
+ .OfType<Folder>()
+ .ToList();
+
+ var list = new List<Folder>();
+
+ var excludeFolderIds = user.Configuration.ExcludeFoldersFromGrouping.Select(i => new Guid(i)).ToList();
+
+ var standaloneFolders = folders.Where(i => UserView.IsExcludedFromGrouping(i) || excludeFolderIds.Contains(i.Id)).ToList();
+
+ list.AddRange(standaloneFolders);
+
+ var recursiveChildren = folders
+ .Except(standaloneFolders)
+ .SelectMany(i => i.GetRecursiveChildren(user, false))
+ .ToList();
+
+ if (recursiveChildren.OfType<Series>().Any())
+ {
+ list.Add(await GetUserView(CollectionType.TvShows, user, cancellationToken).ConfigureAwait(false));
+ }
+
+ if (recursiveChildren.OfType<MusicAlbum>().Any() ||
+ recursiveChildren.OfType<MusicVideo>().Any())
+ {
+ list.Add(await GetUserView(CollectionType.Music, user, cancellationToken).ConfigureAwait(false));
+ }
+
+ if (recursiveChildren.OfType<Movie>().Any())
+ {
+ list.Add(await GetUserView(CollectionType.Movies, user, cancellationToken).ConfigureAwait(false));
+ }
+
+ if (recursiveChildren.OfType<Game>().Any())
+ {
+ list.Add(await GetUserView(CollectionType.Games, user, cancellationToken).ConfigureAwait(false));
+ }
+
+ if (recursiveChildren.OfType<BoxSet>().Any())
+ {
+ list.Add(await GetUserView(CollectionType.BoxSets, user, cancellationToken).ConfigureAwait(false));
+ }
+
+ return list.OrderBy(i => i.SortName);
+ }
+
+ // Use this to force new entity creation, as needed
+ private const string DataVersion = "5";
+ private async Task<UserView> GetUserView(string type, User user, CancellationToken cancellationToken)
+ {
+ var name = LocalizationManager.GetLocalizedString("ViewType" + type);
+
+ var id = "view" + name + DataVersion + user.Id.ToString("N");
+ var guid = id.GetMD5();
+
+ var item = LibraryManager.GetItemById(guid) as UserView;
+
+ if (item == null)
+ {
+ var path = System.IO.Path.Combine(user.ConfigurationDirectoryPath,
+ "views",
+ FileSystem.GetValidFilename(name));
+
+ Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
+
+ item = new UserView
+ {
+ Path = path,
+ Id = guid,
+ DateCreated = DateTime.UtcNow,
+ Name = name,
+ ViewType = type
+ };
+
+ await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
+
+ await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
+ }
+
+ return item;
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
new file mode 100644
index 0000000000..ce188554cd
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -0,0 +1,67 @@
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MediaBrowser.Controller.Entities
+{
+ public class UserView : Folder
+ {
+ public string ViewType { get; set; }
+
+ public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
+ {
+ var mediaFolders = GetMediaFolders(user);
+
+ switch (ViewType)
+ {
+ case CollectionType.Games:
+ return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<GameSystem>();
+ case CollectionType.BoxSets:
+ return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<BoxSet>();
+ case CollectionType.TvShows:
+ return mediaFolders.SelectMany(i => i.GetRecursiveChildren(user, includeLinkedChildren)).OfType<Series>();
+ default:
+ return mediaFolders.SelectMany(i => i.GetChildren(user, includeLinkedChildren));
+ }
+ }
+
+ protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
+ {
+ return GetChildren(user, false);
+ }
+
+ private IEnumerable<Folder> GetMediaFolders(User user)
+ {
+ var excludeFolderIds = user.Configuration.ExcludeFoldersFromGrouping.Select(i => new Guid(i)).ToList();
+
+ return user.RootFolder
+ .GetChildren(user, true)
+ .OfType<Folder>()
+ .Where(i => !excludeFolderIds.Contains(i.Id) && !IsExcludedFromGrouping(i));
+ }
+
+ public static bool IsExcludedFromGrouping(Folder folder)
+ {
+ var standaloneTypes = new List<string>
+ {
+ CollectionType.AdultVideos,
+ CollectionType.Books,
+ CollectionType.HomeVideos,
+ CollectionType.Photos,
+ CollectionType.Trailers
+ };
+
+ var collectionFolder = folder as CollectionFolder;
+
+ if (collectionFolder == null)
+ {
+ return false;
+ }
+
+ return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty);
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 1d3c007a70..38db9e8816 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -144,6 +144,7 @@
<Compile Include="Entities\MusicVideo.cs" />
<Compile Include="Entities\IHasAwards.cs" />
<Compile Include="Entities\Photo.cs" />
+ <Compile Include="Entities\UserView.cs" />
<Compile Include="FileOrganization\IFileOrganizationService.cs" />
<Compile Include="Library\DeleteOptions.cs" />
<Compile Include="Library\ILibraryPostScanTask.cs" />