using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MediaBrowser.Api.Reports { /// A report stat builder. /// public class ReportStatBuilder : ReportBuilderBase { /// /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportStatBuilder class. /// Manager for library. public ReportStatBuilder(ILibraryManager libraryManager) : base(libraryManager) { } /// Gets report stat result. /// The items. /// Type of the report row. /// The top item. /// The report stat result. public ReportStatResult GetReportStatResult(BaseItem[] items, ReportViewType reportRowType, int topItem = 5) { ReportStatResult result = new ReportStatResult(); result = this.GetResultGenres(result, items, topItem); result = this.GetResultStudios(result, items, topItem); result = this.GetResultPersons(result, items, topItem); result = this.GetResultProductionYears(result, items, topItem); result = this.GetResulProductionLocations(result, items, topItem); result = this.GetResultCommunityRatings(result, items, topItem); result = this.GetResultParentalRatings(result, items, topItem); switch (reportRowType) { case ReportViewType.Season: case ReportViewType.Series: case ReportViewType.MusicAlbum: case ReportViewType.MusicArtist: case ReportViewType.Game: break; case ReportViewType.Movie: case ReportViewType.BoxSet: break; case ReportViewType.Book: case ReportViewType.Episode: case ReportViewType.Video: case ReportViewType.MusicVideo: case ReportViewType.Trailer: case ReportViewType.Audio: case ReportViewType.BaseItem: default: break; } result.Groups = result.Groups.OrderByDescending(n => n.Items.Count()).ToList(); return result; } private ReportStatResult GetResultGenres(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("HeaderGenres"), topItem, items.SelectMany(x => x.Genres) .GroupBy(x => x) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key, Value = x.Count().ToString(), Id = GetGenreID(x.Key) })); return result; } private ReportStatResult GetResultStudios(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("HeaderStudios"), topItem, items.SelectMany(x => x.Studios) .GroupBy(x => x) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key, Value = x.Count().ToString(), Id = GetStudioID(x.Key) }) ); return result; } private ReportStatResult GetResultPersons(ReportStatResult result, BaseItem[] items, int topItem = 5) { List t = new List { PersonType.Actor, PersonType.Composer, PersonType.Director, PersonType.GuestStar, PersonType.Producer, PersonType.Writer, "Artist", "AlbumArtist" }; foreach (var item in t) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("Option" + item), topItem, items.SelectMany(x => _libraryManager.GetPeople(x)) .Where(n => n.Type == item) .GroupBy(x => x.Name) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key, Value = x.Count().ToString(), Id = GetPersonID(x.Key) }) ); } return result; } private ReportStatResult GetResultCommunityRatings(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("LabelCommunityRating"), topItem, items.Where(x => x.CommunityRating != null && x.CommunityRating > 0) .GroupBy(x => x.CommunityRating) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key.ToString(), Value = x.Count().ToString() }) ); return result; } private ReportStatResult GetResultParentalRatings(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("HeaderParentalRatings"), topItem, items.Where(x => x.OfficialRating != null) .GroupBy(x => x.OfficialRating) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key.ToString(), Value = x.Count().ToString() }) ); return result; } private ReportStatResult GetResultProductionYears(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("HeaderYears"), topItem, items.Where(x => x.ProductionYear != null && x.ProductionYear > 0) .GroupBy(x => x.ProductionYear) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key.ToString(), Value = x.Count().ToString() }) ); return result; } private ReportStatResult GetResulProductionLocations(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, ReportHelper.GetServerLocalizedString("HeaderCountries"), topItem, items.OfType() .Where(x => x.ProductionLocations != null) .SelectMany(x => x.ProductionLocations) .GroupBy(x => x) .OrderByDescending(x => x.Count()) .Take(topItem) .Select(x => new ReportStatItem { Name = x.Key.ToString(), Value = x.Count().ToString() }) ); return result; } /// Gets the groups. /// The result. /// The header. /// The top item. /// The top. private void GetGroups(ReportStatResult result, string header, int topItem, IEnumerable top) { if (top.Count() > 0) { var group = new ReportStatGroup { Header = ReportStatGroup.FormatedHeader(header, topItem) }; group.Items.AddRange(top); result.Groups.Add(group); } } } }