aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/UserViewBuilder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities/UserViewBuilder.cs')
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs113
1 files changed, 88 insertions, 25 deletions
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 0e602dabe..1672bda92 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -50,6 +50,16 @@ namespace MediaBrowser.Controller.Entities
{
var user = query.User;
+ if (query.IncludeItemTypes != null &&
+ query.IncludeItemTypes.Length == 1 &&
+ string.Equals(query.IncludeItemTypes[0], "Playlist", StringComparison.OrdinalIgnoreCase))
+ {
+ if (!string.Equals(viewType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase))
+ {
+ return await FindPlaylists(queryParent, user, query).ConfigureAwait(false);
+ }
+ }
+
switch (viewType)
{
case CollectionType.Channels:
@@ -107,13 +117,10 @@ namespace MediaBrowser.Controller.Entities
case CollectionType.LiveTv:
{
- var result = await GetLiveTvFolders(user).ConfigureAwait(false);
-
- return GetResult(result, queryParent, query);
+ return await GetLiveTvView(queryParent, user, query).ConfigureAwait(false);
}
case CollectionType.Books:
- case CollectionType.Photos:
case CollectionType.HomeVideos:
case CollectionType.MusicVideos:
return GetResult(queryParent.GetChildren(user, true), queryParent, query);
@@ -130,6 +137,9 @@ namespace MediaBrowser.Controller.Entities
case CollectionType.BoxSets:
return await GetBoxsetView(queryParent, user, query).ConfigureAwait(false);
+ case CollectionType.Photos:
+ return await GetPhotosView(queryParent, user, query).ConfigureAwait(false);
+
case CollectionType.TvShows:
return await GetTvView(queryParent, user, query).ConfigureAwait(false);
@@ -205,6 +215,9 @@ namespace MediaBrowser.Controller.Entities
case SpecialFolder.MusicLatest:
return GetMusicLatest(queryParent, user, query);
+ case SpecialFolder.MusicPlaylists:
+ return await GetMusicPlaylists(queryParent, user, query).ConfigureAwait(false);
+
case SpecialFolder.MusicAlbums:
return GetMusicAlbums(queryParent, user, query);
@@ -236,10 +249,29 @@ namespace MediaBrowser.Controller.Entities
return GetFavoriteSongs(queryParent, user, query);
default:
- return GetResult(GetMediaFolders(user).SelectMany(i => i.GetChildren(user, true)), queryParent, query);
+ {
+ if (queryParent is UserView)
+ {
+ return GetResult(GetMediaFolders(user).SelectMany(i => i.GetChildren(user, true)), queryParent, query);
+ }
+ else
+ {
+ return GetResult(queryParent.GetChildren(user, true), queryParent, query);
+ }
+ }
}
}
+ private async Task<QueryResult<BaseItem>> FindPlaylists(Folder parent, User user, InternalItemsQuery query)
+ {
+ var collectionFolders = user.RootFolder.GetChildren(user, true).Select(i => i.Id).ToList();
+
+ var list = _playlistManager.GetPlaylists(user.Id.ToString("N"))
+ .Where(i => i.GetChildren(user, true).Any(media => _libraryManager.GetCollectionFolders(media).Select(c => c.Id).Any(collectionFolders.Contains)));
+
+ return GetResult(list, parent, query);
+ }
+
private int GetSpecialItemsLimit()
{
return 50;
@@ -257,12 +289,13 @@ namespace MediaBrowser.Controller.Entities
var list = new List<BaseItem>();
list.Add(await GetUserView(SpecialFolder.MusicLatest, user, "0", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicAlbums, user, "1", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, user, "2", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicArtists, user, "3", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicSongs, user, "4", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicGenres, user, "5", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.MusicFavorites, user, "6", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicPlaylists, user, "1", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicAlbums, user, "2", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, user, "3", parent).ConfigureAwait(false));
+ //list.Add(await GetUserView(SpecialFolder.MusicArtists, user, "4", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicSongs, user, "5", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicGenres, user, "6", parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.MusicFavorites, user, "7", parent).ConfigureAwait(false));
return GetResult(list, parent, query);
}
@@ -283,7 +316,7 @@ namespace MediaBrowser.Controller.Entities
var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.SelectMany(i => i.Genres)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -313,7 +346,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase))
.OfType<IHasAlbumArtist>()
.SelectMany(i => i.AlbumArtists)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -337,7 +370,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>()
.SelectMany(i => i.AlbumArtists)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -361,7 +394,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => !i.IsFolder)
.OfType<IHasArtist>()
.SelectMany(i => i.Artists)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -385,7 +418,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>()
.SelectMany(i => i.AlbumArtists)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -403,6 +436,14 @@ namespace MediaBrowser.Controller.Entities
return GetResult(artists, parent, query);
}
+ private Task<QueryResult<BaseItem>> GetMusicPlaylists(Folder parent, User user, InternalItemsQuery query)
+ {
+ query.IncludeItemTypes = new[] { "Playlist" };
+ query.Recursive = true;
+
+ return parent.GetItems(query);
+ }
+
private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, InternalItemsQuery query)
{
var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }, i => (i is MusicAlbum) && FilterItem(i, query));
@@ -552,7 +593,7 @@ namespace MediaBrowser.Controller.Entities
var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty })
.Where(i => i is Movie)
.SelectMany(i => i.Genres)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -606,6 +647,19 @@ namespace MediaBrowser.Controller.Entities
}), parent, query);
}
+ private async Task<QueryResult<BaseItem>> GetPhotosView(Folder queryParent, User user, InternalItemsQuery query)
+ {
+ if (query.Recursive)
+ {
+ var mediaTypes = new[] { MediaType.Video, MediaType.Photo };
+ var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.Photos, string.Empty }, i => (i is PhotoAlbum || mediaTypes.Contains(i.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) && FilterItem(i, query));
+
+ return PostFilterAndSort(items, queryParent, null, query);
+ }
+
+ return GetResult(queryParent.GetChildren(user, true), queryParent, query);
+ }
+
private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
{
if (query.Recursive)
@@ -724,7 +778,7 @@ namespace MediaBrowser.Controller.Entities
var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty })
.OfType<Series>()
.SelectMany(i => i.Genres)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -776,7 +830,7 @@ namespace MediaBrowser.Controller.Entities
var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Games })
.OfType<Game>()
.SelectMany(i => i.Genres)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ .DistinctNames()
.Select(i =>
{
try
@@ -1749,17 +1803,26 @@ namespace MediaBrowser.Controller.Entities
return parent.GetRecursiveChildren(user, filter);
}
- private async Task<IEnumerable<BaseItem>> GetLiveTvFolders(User user)
+ private async Task<QueryResult<BaseItem>> GetLiveTvView(Folder queryParent, User user, InternalItemsQuery query)
{
- var list = new List<BaseItem>();
+ if (query.Recursive)
+ {
+ return await _liveTvManager.GetInternalRecordings(new RecordingQuery
+ {
+ IsInProgress = false,
+ Status = RecordingStatus.Completed,
+ UserId = user.Id.ToString("N")
- var parent = user.RootFolder;
+ }, CancellationToken.None).ConfigureAwait(false);
+ }
+
+ var list = new List<BaseItem>();
//list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.LiveTvChannels, user, string.Empty, parent).ConfigureAwait(false));
- list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, user, string.Empty, parent).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.LiveTvChannels, user, string.Empty, user.RootFolder).ConfigureAwait(false));
+ list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, user, string.Empty, user.RootFolder).ConfigureAwait(false));
- return list;
+ return GetResult(list, queryParent, query);
}
private async Task<UserView> GetUserView(string name, string type, User user, string sortName, BaseItem parent)