From e329811d2d1fd35b50043b00777289e4ee25c77a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 15 Jul 2016 15:54:34 -0400 Subject: [PATCH] update reports --- MediaBrowser.Api/Reports/ReportsService.cs | 171 ++++++++++--------- MediaBrowser.Api/UserLibrary/ItemsService.cs | 4 +- 2 files changed, 93 insertions(+), 82 deletions(-) diff --git a/MediaBrowser.Api/Reports/ReportsService.cs b/MediaBrowser.Api/Reports/ReportsService.cs index 36a2a4b619..d0b6d6e787 100644 --- a/MediaBrowser.Api/Reports/ReportsService.cs +++ b/MediaBrowser.Api/Reports/ReportsService.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.Api.Reports /// Manager for library. private readonly ILibraryManager _libraryManager; ///< Manager for library - /// The localization. + /// The localization. private readonly ILocalizationManager _localization; ///< The localization @@ -58,10 +58,10 @@ namespace MediaBrowser.Api.Reports /// Gets the given request. /// The request. /// A Task<object> - public async Task Get(GetActivityLogs request) + public object Get(GetActivityLogs request) { request.DisplayType = "Screen"; - ReportResult result = await GetReportActivities(request).ConfigureAwait(false); + ReportResult result = GetReportActivities(request); return ToOptimizedResult(result); } @@ -104,7 +104,8 @@ namespace MediaBrowser.Api.Reports return null; request.DisplayType = "Screen"; - var reportResult = await GetReportResult(request); + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; + var reportResult = await GetReportResult(request, user); return ToOptimizedResult(reportResult); } @@ -117,7 +118,8 @@ namespace MediaBrowser.Api.Reports if (string.IsNullOrEmpty(request.IncludeItemTypes)) return null; request.DisplayType = "Screen"; - var reportResult = await GetReportStatistic(request); + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; + var reportResult = await GetReportStatistic(request, user); return ToOptimizedResult(reportResult); } @@ -150,6 +152,7 @@ namespace MediaBrowser.Api.Reports headers["Content-Disposition"] = string.Format("attachment; filename=\"{0}\"", filename); headers["Content-Encoding"] = "UTF-8"; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; ReportResult result = null; switch (reportViewType) { @@ -157,12 +160,12 @@ namespace MediaBrowser.Api.Reports case ReportViewType.ReportData: ReportIncludeItemTypes reportRowType = ReportHelper.GetRowType(request.IncludeItemTypes); ReportBuilder dataBuilder = new ReportBuilder(_libraryManager); - QueryResult queryResult = await GetQueryResult(request).ConfigureAwait(false); + QueryResult queryResult = await GetQueryResult(request, user).ConfigureAwait(false); result = dataBuilder.GetResult(queryResult.Items, request); result.TotalRecordCount = queryResult.TotalRecordCount; break; case ReportViewType.ReportActivities: - result = await GetReportActivities(request).ConfigureAwait(false); + result = GetReportActivities(request); break; } @@ -177,23 +180,15 @@ namespace MediaBrowser.Api.Reports break; } - object ro = ResultFactory.GetResult(returnResult, contentType, headers); - return ro; + return ResultFactory.GetResult(returnResult, contentType, headers); } #endregion - #region [Private Methods] - - /// Gets items query. - /// The request. - /// The user. - /// The items query. private InternalItemsQuery GetItemsQuery(BaseReportRequest request, User user) { - var query = new InternalItemsQuery + var query = new InternalItemsQuery(user) { - User = user, IsPlayed = request.IsPlayed, MediaTypes = request.GetMediaTypes(), IncludeItemTypes = request.GetIncludeItemTypes(), @@ -231,6 +226,7 @@ namespace MediaBrowser.Api.Reports Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), + GenreIds = request.GetGenreIds(), Studios = request.GetStudios(), StudioIds = request.GetStudioIds(), Person = request.Person, @@ -245,9 +241,11 @@ namespace MediaBrowser.Api.Reports MaxPlayers = request.MaxPlayers, MinCommunityRating = request.MinCommunityRating, MinCriticRating = request.MinCriticRating, + ParentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId), ParentIndexNumber = request.ParentIndexNumber, AiredDuringSeason = request.AiredDuringSeason, - AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater + AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater, + EnableTotalRecordCount = request.EnableTotalRecordCount }; if (!string.IsNullOrWhiteSpace(request.Ids)) @@ -357,98 +355,111 @@ namespace MediaBrowser.Api.Reports query.AlbumNames = request.Albums.Split('|'); } - if (request.HasQueryLimit == false) - { - query.StartIndex = null; - query.Limit = null; - } - return query; } - /// Gets query result. - /// The request. - /// The query result. - private async Task> GetQueryResult(BaseReportRequest request) + private async Task> GetQueryResult(BaseReportRequest request, User user) { - // Placeholder in case needed later + // all report queries currently need this because it's not being specified request.Recursive = true; - var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; - request.Fields = "MediaSources,DateCreated,Settings,Studios,SyncInfo,ItemCounts"; - - var parentItem = string.IsNullOrEmpty(request.ParentId) ? - (user == null ? _libraryManager.RootFolder : user.RootFolder) : - _libraryManager.GetItemById(request.ParentId); var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder : - parentItem; + _libraryManager.GetItemById(request.ParentId); - IEnumerable items; + if (string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase)) + { + //item = user == null ? _libraryManager.RootFolder : user.RootFolder; + } + else if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase)) + { + item = user == null ? _libraryManager.RootFolder : user.RootFolder; + } + + // Default list type = children + + var folder = item as Folder; + if (folder == null) + { + folder = user == null ? _libraryManager.RootFolder : _libraryManager.GetUserRootFolder(); + } + + if (!string.IsNullOrEmpty(request.Ids)) + { + request.Recursive = true; + var query = GetItemsQuery(request, user); + var result = await folder.GetItems(query).ConfigureAwait(false); + + if (string.IsNullOrWhiteSpace(request.SortBy)) + { + var ids = query.ItemIds.ToList(); + + // Try to preserve order + result.Items = result.Items.OrderBy(i => ids.IndexOf(i.Id.ToString("N"))).ToArray(); + } + + return result; + } if (request.Recursive) { - var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)).ConfigureAwait(false); - return result; + return await folder.GetItems(GetItemsQuery(request, user)).ConfigureAwait(false); } - else + + if (user == null) { - if (user == null) - { - var result = await ((Folder)item).GetItems(GetItemsQuery(request, null)).ConfigureAwait(false); - return result; - } - - var userRoot = item as UserRootFolder; - - if (userRoot == null) - { - var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)).ConfigureAwait(false); - - return result; - } - - items = ((Folder)item).GetChildren(user, true); + return await folder.GetItems(GetItemsQuery(request, null)).ConfigureAwait(false); } - return new QueryResult { Items = items.ToArray() }; + var userRoot = item as UserRootFolder; + if (userRoot == null) + { + return await folder.GetItems(GetItemsQuery(request, user)).ConfigureAwait(false); + } + + IEnumerable items = folder.GetChildren(user, true); + + var itemsArray = items.ToArray(); + + return new QueryResult + { + Items = itemsArray, + TotalRecordCount = itemsArray.Length + }; } + #region [Private Methods] + /// Gets report activities. /// The request. /// The report activities. - private Task GetReportActivities(IReportsDownload request) + private ReportResult GetReportActivities(IReportsDownload request) { - return Task.Run(() => - { - DateTime? minDate = string.IsNullOrWhiteSpace(request.MinDate) ? - (DateTime?)null : - DateTime.Parse(request.MinDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); + DateTime? minDate = string.IsNullOrWhiteSpace(request.MinDate) ? + (DateTime?)null : + DateTime.Parse(request.MinDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); - QueryResult queryResult; - if (request.HasQueryLimit) - queryResult = _repo.GetActivityLogEntries(minDate, request.StartIndex, request.Limit); - else - queryResult = _repo.GetActivityLogEntries(minDate, request.StartIndex, null); - //var queryResult = _activityManager.GetActivityLogEntries(minDate, request.StartIndex, request.Limit); - - ReportActivitiesBuilder builder = new ReportActivitiesBuilder(_libraryManager, _userManager); - var result = builder.GetResult(queryResult, request); - result.TotalRecordCount = queryResult.TotalRecordCount; - return result; - - }); + QueryResult queryResult; + if (request.HasQueryLimit) + queryResult = _repo.GetActivityLogEntries(minDate, request.StartIndex, request.Limit); + else + queryResult = _repo.GetActivityLogEntries(minDate, request.StartIndex, null); + //var queryResult = _activityManager.GetActivityLogEntries(minDate, request.StartIndex, request.Limit); + ReportActivitiesBuilder builder = new ReportActivitiesBuilder(_libraryManager, _userManager); + var result = builder.GetResult(queryResult, request); + result.TotalRecordCount = queryResult.TotalRecordCount; + return result; } /// Gets report result. /// The request. /// The report result. - private async Task GetReportResult(GetItemReport request) + private async Task GetReportResult(GetItemReport request, User user) { ReportBuilder reportBuilder = new ReportBuilder(_libraryManager); - QueryResult queryResult = await GetQueryResult(request).ConfigureAwait(false); + QueryResult queryResult = await GetQueryResult(request, user).ConfigureAwait(false); ReportResult reportResult = reportBuilder.GetResult(queryResult.Items, request); reportResult.TotalRecordCount = queryResult.TotalRecordCount; @@ -458,10 +469,10 @@ namespace MediaBrowser.Api.Reports /// Gets report statistic. /// The request. /// The report statistic. - private async Task GetReportStatistic(GetReportStatistics request) + private async Task GetReportStatistic(GetReportStatistics request, User user) { ReportIncludeItemTypes reportRowType = ReportHelper.GetRowType(request.IncludeItemTypes); - QueryResult queryResult = await GetQueryResult(request).ConfigureAwait(false); + QueryResult queryResult = await GetQueryResult(request, user).ConfigureAwait(false); ReportStatBuilder reportBuilder = new ReportStatBuilder(_libraryManager); ReportStatResult reportResult = reportBuilder.GetResult(queryResult.Items, ReportHelper.GetRowType(request.IncludeItemTypes), request.TopItems ?? 5); diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index a6f1d8b98f..57acb07ac8 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -101,7 +101,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; - var result = await GetItemsToSerialize(request, user).ConfigureAwait(false); + var result = await GetQueryResult(request, user).ConfigureAwait(false); if (result == null) { @@ -135,7 +135,7 @@ namespace MediaBrowser.Api.UserLibrary /// The request. /// The user. /// IEnumerable{BaseItem}. - private async Task> GetItemsToSerialize(GetItems request, User user) + private async Task> GetQueryResult(GetItems request, User user) { var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder :