mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-19 12:44:19 +01:00
added library grouping settings.
This commit is contained in:
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
67
MediaBrowser.Controller/Entities/UserView.cs
Normal file
67
MediaBrowser.Controller/Entities/UserView.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user