| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 | using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Library;using System;using System.Collections.Generic;using System.Linq;namespace MediaBrowser.Api.Reports{    /// <summary> A report stat builder. </summary>    /// <seealso cref="T:MediaBrowser.Api.Reports.ReportBuilderBase"/>    public class ReportStatBuilder : ReportBuilderBase    {        #region [Constructors]        /// <summary>        /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportStatBuilder class. </summary>        /// <param name="libraryManager"> Manager for library. </param>        public ReportStatBuilder(ILibraryManager libraryManager)            : base(libraryManager)        {        }        #endregion        #region [Public Methods]        /// <summary> Gets report stat result. </summary>        /// <param name="items"> The items. </param>        /// <param name="reportIncludeItemTypes"> List of types of the report include items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The report stat result. </returns>        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.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]        /// <summary> Gets the headers. </summary>        /// <typeparam name="H"> Type of the header. </typeparam>        /// <param name="request"> The request. </param>        /// <returns> The headers. </returns>        /// <seealso cref="M:MediaBrowser.Api.Reports.ReportBuilderBase.GetHeaders{H}(H)"/>        protected internal override List<ReportHeader> GetHeaders<H>(H request)        {            throw new NotImplementedException();        }        #endregion        #region [Private Methods]        /// <summary> Gets the groups. </summary>        /// <param name="result"> The result. </param>        /// <param name="header"> The header. </param>        /// <param name="topItem"> The top item. </param>        /// <param name="top"> The top. </param>        private void GetGroups(ReportStatResult result, string header, int topItem, IEnumerable<ReportStatItem> top)        {            if (top != null && top.Count() > 0)            {                var group = new ReportStatGroup { Header = ReportStatGroup.FormatedHeader(header, topItem) };                group.Items.AddRange(top);                result.Groups.Add(group);            }        }        /// <summary> Gets result community ratings. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result community ratings. </returns>        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;        }        /// <summary> Gets result genres. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result genres. </returns>        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;        }        /// <summary> Gets result parental ratings. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result parental ratings. </returns>        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;        }        /// <summary> Gets result persons. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result persons. </returns>        private ReportStatResult GetResultPersons(ReportStatResult result, BaseItem[] items, int topItem = 5)        {            List<HeaderMetadata> t = new List<HeaderMetadata>             {                 HeaderMetadata.Actor,                 HeaderMetadata.Composer,                 HeaderMetadata.Director,                 HeaderMetadata.GuestStar,                 HeaderMetadata.Producer,                HeaderMetadata.Writer,                 HeaderMetadata.Artist,                 HeaderMetadata.AlbumArtist            };            foreach (var item in t)            {                var ps = items.SelectMany(x => _libraryManager.GetPeople(x))                                .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;        }        /// <summary> Gets result production years. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result production years. </returns>        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;        }        /// <summary> Gets result studios. </summary>        /// <param name="result"> The result. </param>        /// <param name="items"> The items. </param>        /// <param name="topItem"> The top item. </param>        /// <returns> The result studios. </returns>        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    }}
 |