added library grouping settings.

This commit is contained in:
Luke Pulverenti
2014-06-04 22:32:40 -04:00
parent 39547de1f8
commit 7049ad66f4
64 changed files with 842 additions and 146 deletions

View File

@@ -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))
{

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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" />