2016-10-25 12:02:04 -07:00
|
|
|
|
using MediaBrowser.Model.Serialization;
|
2015-08-14 18:44:30 -07:00
|
|
|
|
using MediaBrowser.Controller.Providers;
|
2014-09-01 13:10:54 -07:00
|
|
|
|
using MediaBrowser.Model.Library;
|
|
|
|
|
using MediaBrowser.Model.Querying;
|
2014-03-05 22:17:13 -07:00
|
|
|
|
using System;
|
2014-02-10 13:11:46 -07:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2014-06-03 20:34:36 -07:00
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2013-02-20 18:33:05 -07:00
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Controller.Entities
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Special class used for User Roots. Children contain actual ones defined for this user
|
|
|
|
|
/// PLUS the virtual folders from the physical root (added by plug-ins).
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class UserRootFolder : Folder
|
|
|
|
|
{
|
2016-08-13 13:54:29 -07:00
|
|
|
|
private List<Guid> _childrenIds = null;
|
|
|
|
|
private readonly object _childIdsLock = new object();
|
2017-06-03 00:36:32 -07:00
|
|
|
|
protected override List<BaseItem> LoadChildren()
|
2016-08-14 09:39:23 -07:00
|
|
|
|
{
|
|
|
|
|
lock (_childIdsLock)
|
|
|
|
|
{
|
|
|
|
|
if (_childrenIds == null)
|
|
|
|
|
{
|
2017-08-24 12:52:19 -07:00
|
|
|
|
var list = base.LoadChildren();
|
2016-08-14 09:39:23 -07:00
|
|
|
|
_childrenIds = list.Select(i => i.Id).ToList();
|
|
|
|
|
return list;
|
|
|
|
|
}
|
2016-08-13 13:54:29 -07:00
|
|
|
|
|
2016-08-14 09:39:23 -07:00
|
|
|
|
return _childrenIds.Select(LibraryManager.GetItemById).Where(i => i != null).ToList();
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-08-13 13:54:29 -07:00
|
|
|
|
|
2017-06-29 12:10:58 -07:00
|
|
|
|
[IgnoreDataMember]
|
|
|
|
|
public override bool SupportsInheritedParentImages
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-10 23:46:59 -07:00
|
|
|
|
[IgnoreDataMember]
|
|
|
|
|
public override bool SupportsPlayedStatus
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-15 17:22:59 -07:00
|
|
|
|
private void ClearCache()
|
2016-08-13 13:54:29 -07:00
|
|
|
|
{
|
|
|
|
|
lock (_childIdsLock)
|
|
|
|
|
{
|
|
|
|
|
_childrenIds = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-25 23:48:54 -07:00
|
|
|
|
protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
|
2014-09-01 13:10:54 -07:00
|
|
|
|
{
|
2014-10-06 16:58:46 -07:00
|
|
|
|
if (query.Recursive)
|
|
|
|
|
{
|
2016-03-19 23:46:51 -07:00
|
|
|
|
return QueryRecursive(query);
|
2014-10-06 16:58:46 -07:00
|
|
|
|
}
|
|
|
|
|
|
2017-05-25 23:48:54 -07:00
|
|
|
|
var result = UserViewManager.GetUserViews(new UserViewQuery
|
2014-09-01 13:10:54 -07:00
|
|
|
|
{
|
2016-03-01 11:42:39 -07:00
|
|
|
|
UserId = query.User.Id.ToString("N"),
|
|
|
|
|
PresetViews = query.PresetViews
|
2014-09-01 13:10:54 -07:00
|
|
|
|
|
2017-05-25 23:48:54 -07:00
|
|
|
|
}, CancellationToken.None).Result;
|
2014-09-01 13:10:54 -07:00
|
|
|
|
|
2016-03-19 23:46:51 -07:00
|
|
|
|
var user = query.User;
|
|
|
|
|
Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager);
|
2017-05-25 23:48:54 -07:00
|
|
|
|
|
2016-08-17 13:52:16 -07:00
|
|
|
|
return PostFilterAndSort(result.Where(filter), query, true, true);
|
2014-09-01 13:10:54 -07:00
|
|
|
|
}
|
|
|
|
|
|
2016-06-16 06:24:12 -07:00
|
|
|
|
public override int GetChildCount(User user)
|
|
|
|
|
{
|
2017-08-19 12:43:35 -07:00
|
|
|
|
return GetChildren(user, true).Count;
|
2016-06-16 06:24:12 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-08-14 18:44:30 -07:00
|
|
|
|
[IgnoreDataMember]
|
|
|
|
|
protected override bool SupportsShortcutChildren
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[IgnoreDataMember]
|
2014-09-06 16:06:14 -07:00
|
|
|
|
public override bool IsPreSorted
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-30 09:40:47 -07:00
|
|
|
|
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
|
|
|
|
|
{
|
2015-11-02 21:34:47 -07:00
|
|
|
|
var list = base.GetEligibleChildrenForRecursiveChildren(user).ToList();
|
|
|
|
|
list.AddRange(LibraryManager.RootFolder.VirtualChildren);
|
|
|
|
|
|
|
|
|
|
return list;
|
2015-10-30 09:40:47 -07:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-12 22:11:54 -07:00
|
|
|
|
public override bool BeforeMetadataRefresh()
|
2014-02-10 13:11:46 -07:00
|
|
|
|
{
|
2016-08-15 17:22:59 -07:00
|
|
|
|
ClearCache();
|
2016-08-13 13:54:29 -07:00
|
|
|
|
|
2014-02-12 22:11:54 -07:00
|
|
|
|
var hasChanges = base.BeforeMetadataRefresh();
|
2014-02-10 13:11:46 -07:00
|
|
|
|
|
2014-03-05 22:17:13 -07:00
|
|
|
|
if (string.Equals("default", Name, StringComparison.OrdinalIgnoreCase))
|
2014-02-10 13:11:46 -07:00
|
|
|
|
{
|
2014-02-20 22:04:11 -07:00
|
|
|
|
Name = "Media Folders";
|
2014-02-12 22:11:54 -07:00
|
|
|
|
hasChanges = true;
|
2014-02-10 13:11:46 -07:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-12 22:11:54 -07:00
|
|
|
|
return hasChanges;
|
2014-02-10 13:11:46 -07:00
|
|
|
|
}
|
2014-06-03 20:34:36 -07:00
|
|
|
|
|
2016-08-15 17:22:59 -07:00
|
|
|
|
protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
|
|
|
|
|
{
|
|
|
|
|
ClearCache();
|
|
|
|
|
|
|
|
|
|
return base.GetNonCachedChildren(directoryService);
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-03 20:34:36 -07:00
|
|
|
|
protected override async Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
|
|
|
|
|
{
|
2016-08-15 17:22:59 -07:00
|
|
|
|
ClearCache();
|
2016-08-13 13:54:29 -07:00
|
|
|
|
|
2014-06-03 20:34:36 -07:00
|
|
|
|
await base.ValidateChildrenInternal(progress, cancellationToken, recursive, refreshChildMetadata, refreshOptions, directoryService)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
2016-08-15 17:22:59 -07:00
|
|
|
|
ClearCache();
|
|
|
|
|
|
2014-06-03 20:34:36 -07:00
|
|
|
|
// Not the best way to handle this, but it solves an issue
|
|
|
|
|
// CollectionFolders aren't always getting saved after changes
|
|
|
|
|
// This means that grabbing the item by Id may end up returning the old one
|
|
|
|
|
// Fix is in two places - make sure the folder gets saved
|
|
|
|
|
// And here to remedy it for affected users.
|
|
|
|
|
// In theory this can be removed eventually.
|
|
|
|
|
foreach (var item in Children)
|
|
|
|
|
{
|
|
|
|
|
LibraryManager.RegisterItem(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-02-20 18:33:05 -07:00
|
|
|
|
}
|
|
|
|
|
}
|