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 { #region [Constructors] /// /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportStatBuilder class. /// Manager for library. public ReportStatBuilder(ILibraryManager libraryManager) : base(libraryManager) { } #endregion #region [Public Methods] /// Gets report stat result. /// The items. /// List of types of the report include items. /// The top item. /// The report stat result. public ReportStatResult GetResult(BaseItem[] items, ReportIncludeItemTypes reportIncludeItemTypes, 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 (reportIncludeItemTypes) { case ReportIncludeItemTypes.Season: case ReportIncludeItemTypes.Series: case ReportIncludeItemTypes.MusicAlbum: case ReportIncludeItemTypes.MusicArtist: case ReportIncludeItemTypes.Game: break; case ReportIncludeItemTypes.Movie: case ReportIncludeItemTypes.BoxSet: break; case ReportIncludeItemTypes.Book: case ReportIncludeItemTypes.Episode: case ReportIncludeItemTypes.Video: case ReportIncludeItemTypes.MusicVideo: case ReportIncludeItemTypes.Trailer: case ReportIncludeItemTypes.Audio: case ReportIncludeItemTypes.BaseItem: default: break; } result.Groups = result.Groups.OrderByDescending(n => n.Items.Count()).ToList(); return result; } #endregion #region [Protected Internal Methods] /// Gets the headers. /// Type of the header. /// The request. /// The headers. /// protected internal override List GetHeaders(H request) { throw new NotImplementedException(); } #endregion #region [Private Methods] /// 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 != null && top.Count() > 0) { var group = new ReportStatGroup { Header = ReportStatGroup.FormatedHeader(header, topItem) }; group.Items.AddRange(top); result.Groups.Add(group); } } /// Gets resul production locations. /// The result. /// The items. /// The top item. /// The resul production locations. private ReportStatResult GetResulProductionLocations(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.Countries), 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 result community ratings. /// The result. /// The items. /// The top item. /// The result community ratings. private ReportStatResult GetResultCommunityRatings(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.CommunityRating), 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; } /// Gets result genres. /// The result. /// The items. /// The top item. /// The result genres. private ReportStatResult GetResultGenres(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.Genres), 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; } /// Gets result parental ratings. /// The result. /// The items. /// The top item. /// The result parental ratings. private ReportStatResult GetResultParentalRatings(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.ParentalRatings), 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; } /// Gets result persons. /// The result. /// The items. /// The top item. /// The result persons. private ReportStatResult GetResultPersons(ReportStatResult result, BaseItem[] items, int topItem = 5) { List t = new List { HeaderMetadata.Actor, HeaderMetadata.Composer, HeaderMetadata.Director, HeaderMetadata.GuestStar, HeaderMetadata.Producer, HeaderMetadata.Writer, HeaderMetadata.Artist, HeaderMetadata.AlbumArtist }; foreach (var item in t) { var ps = items.Where(x => x.People != null && x.SupportsPeople).SelectMany(x => x.People) .Where(n => n.Type == item.ToString()) .GroupBy(x => x.Name) .OrderByDescending(x => x.Count()) .Take(topItem); if (ps != null && ps.Count() > 0) this.GetGroups(result, GetLocalizedHeader(item), topItem, ps.Select(x => new ReportStatItem { Name = x.Key, Value = x.Count().ToString(), Id = GetPersonID(x.Key) }) ); } return result; } /// Gets result production years. /// The result. /// The items. /// The top item. /// The result production years. private ReportStatResult GetResultProductionYears(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.Year), 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; } /// Gets result studios. /// The result. /// The items. /// The top item. /// The result studios. private ReportStatResult GetResultStudios(ReportStatResult result, BaseItem[] items, int topItem = 5) { this.GetGroups(result, GetLocalizedHeader(HeaderMetadata.Studios), 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; } #endregion } }