aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Reports/Data/ReportBuilder.cs')
-rw-r--r--MediaBrowser.Api/Reports/Data/ReportBuilder.cs800
1 files changed, 385 insertions, 415 deletions
diff --git a/MediaBrowser.Api/Reports/Data/ReportBuilder.cs b/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
index 00ce18317..6232018f1 100644
--- a/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
+++ b/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
@@ -17,162 +17,89 @@ using System.Threading.Tasks;
namespace MediaBrowser.Api.Reports
{
- /// <summary> A report builder. </summary>
- /// <seealso cref="T:MediaBrowser.Api.Reports.ReportBuilderBase"/>
- public class ReportBuilder : ReportBuilderBase
- {
-
- /// <summary>
- /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportBuilder class. </summary>
- /// <param name="libraryManager"> Manager for library. </param>
- public ReportBuilder(ILibraryManager libraryManager)
- : base(libraryManager)
- {
- }
-
- private Func<bool, string> GetBoolString = s => s == true ? "x" : "";
-
- public ReportResult GetReportResult(BaseItem[] items, ReportViewType reportRowType, BaseReportRequest request)
- {
- List<HeaderMetadata> headersMetadata = this.GetFilteredReportHeaderMetadata(reportRowType, request);
-
- var headers = GetReportHeaders(reportRowType, headersMetadata);
- var rows = GetReportRows(items, headersMetadata);
-
- ReportResult result = new ReportResult { Headers = headers };
- HeaderMetadata groupBy = ReportHelper.GetHeaderMetadataType(request.GroupBy);
- int i = headers.FindIndex(x => x.FieldName == groupBy);
- if (groupBy != HeaderMetadata.None && i > 0)
- {
- var rowsGroup = rows.SelectMany(x => x.Columns[i].Name.Split(';'), (x, g) => new { Genre = g.Trim(), Rows = x })
- .GroupBy(x => x.Genre)
- .OrderBy(x => x.Key)
- .Select(x => new ReportGroup { Name = x.Key, Rows = x.Select(r => r.Rows).ToList() });
-
- result.Groups = rowsGroup.ToList();
- result.IsGrouped = true;
- }
- else
- {
- result.Rows = rows;
- result.IsGrouped = false;
- }
-
- return result;
- }
-
- public List<ReportHeader> GetReportHeaders(ReportViewType reportRowType, BaseReportRequest request)
- {
- List<ReportHeader> headersMetadata = this.GetReportHeaders(reportRowType);
- if (request != null && !string.IsNullOrEmpty(request.ReportColumns))
- {
- List<HeaderMetadata> headersMetadataFiltered = this.GetFilteredReportHeaderMetadata(reportRowType, request);
- foreach (ReportHeader reportHeader in headersMetadata)
- {
- if (!headersMetadataFiltered.Contains(reportHeader.FieldName))
- {
- reportHeader.Visible = false;
- }
- }
-
-
- }
-
- return headersMetadata;
- }
-
- public List<ReportHeader> GetReportHeaders(ReportViewType reportRowType, List<HeaderMetadata> headersMetadata = null)
- {
- if (headersMetadata == null)
- headersMetadata = this.GetDefaultReportHeaderMetadata(reportRowType);
-
- List<ReportOptions<BaseItem>> options = new List<ReportOptions<BaseItem>>();
- foreach (HeaderMetadata header in headersMetadata)
- {
- options.Add(GetReportOption(header));
- }
-
-
- List<ReportHeader> headers = new List<ReportHeader>();
- foreach (ReportOptions<BaseItem> option in options)
- {
- headers.Add(option.Header);
- }
- return headers;
- }
-
- private List<ReportRow> GetReportRows(IEnumerable<BaseItem> items, List<HeaderMetadata> headersMetadata)
- {
- List<ReportOptions<BaseItem>> options = new List<ReportOptions<BaseItem>>();
- foreach (HeaderMetadata header in headersMetadata)
- {
- options.Add(GetReportOption(header));
- }
-
- var rows = new List<ReportRow>();
-
- foreach (BaseItem item in items)
- {
- ReportRow rRow = GetRow(item);
- foreach (ReportOptions<BaseItem> option in options)
- {
- object itemColumn = option.Column != null ? option.Column(item, rRow) : "";
- object itemId = option.ItemID != null ? option.ItemID(item) : "";
- ReportItem rItem = new ReportItem
- {
- Name = ReportHelper.ConvertToString(itemColumn, option.Header.HeaderFieldType),
- Id = ReportHelper.ConvertToString(itemId, ReportFieldType.Object)
- };
- rRow.Columns.Add(rItem);
- }
-
- rows.Add(rRow);
- }
-
- return rows;
- }
-
- /// <summary> Gets a row. </summary>
- /// <param name="item"> The item. </param>
- /// <returns> The row. </returns>
- private ReportRow GetRow(BaseItem item)
- {
- var hasTrailers = item as IHasTrailers;
- var hasSpecialFeatures = item as IHasSpecialFeatures;
- var video = item as Video;
- ReportRow rRow = new ReportRow
- {
- Id = item.Id.ToString("N"),
- HasLockData = item.IsLocked,
- IsUnidentified = item.IsUnidentified,
- HasLocalTrailer = hasTrailers != null ? hasTrailers.GetTrailerIds().Count() > 0 : false,
- HasImageTagsPrimary = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Primary) > 0),
- HasImageTagsBackdrop = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Backdrop) > 0),
- HasImageTagsLogo = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Logo) > 0),
- HasSpecials = hasSpecialFeatures != null ? hasSpecialFeatures.SpecialFeatureIds.Count > 0 : false,
- HasSubtitles = video != null ? video.HasSubtitles : false,
- RowType = ReportHelper.GetRowType(item.GetClientTypeName())
- };
- return rRow;
- }
- public List<HeaderMetadata> GetFilteredReportHeaderMetadata(ReportViewType reportRowType, BaseReportRequest request)
- {
- if (request != null && !string.IsNullOrEmpty(request.ReportColumns))
- {
- var s = request.ReportColumns.Split('|').Select(x => ReportHelper.GetHeaderMetadataType(x)).Where(x => x != HeaderMetadata.None);
- return s.ToList();
- }
- else
- return this.GetDefaultReportHeaderMetadata(reportRowType);
-
- }
-
- public List<HeaderMetadata> GetDefaultReportHeaderMetadata(ReportViewType reportRowType)
- {
- switch (reportRowType)
- {
- case ReportViewType.Season:
- return new List<HeaderMetadata>
+ /// <summary> A report builder. </summary>
+ /// <seealso cref="T:MediaBrowser.Api.Reports.ReportBuilderBase"/>
+ public class ReportBuilder : ReportBuilderBase
+ {
+
+ #region [Constructors]
+
+ /// <summary>
+ /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportBuilder class. </summary>
+ /// <param name="libraryManager"> Manager for library. </param>
+ public ReportBuilder(ILibraryManager libraryManager)
+ : base(libraryManager)
+ {
+ }
+
+ #endregion
+
+ #region [Public Methods]
+
+ /// <summary> Gets report result. </summary>
+ /// <param name="items"> The items. </param>
+ /// <param name="request"> The request. </param>
+ /// <returns> The report result. </returns>
+ public ReportResult GetResult(BaseItem[] items, IReportsQuery request)
+ {
+ ReportIncludeItemTypes reportRowType = ReportHelper.GetRowType(request.IncludeItemTypes);
+ List<ReportOptions<BaseItem>> options = this.GetReportOptions<BaseItem>(request,
+ () => this.GetDefaultHeaderMetadata(reportRowType),
+ (hm) => this.GetOption(hm)).Where(x => x.Header.Visible == true).ToList();
+
+ var headers = GetHeaders<BaseItem>(options);
+ var rows = GetReportRows(items, options);
+
+ ReportResult result = new ReportResult { Headers = headers };
+ HeaderMetadata groupBy = ReportHelper.GetHeaderMetadataType(request.GroupBy);
+ int i = headers.FindIndex(x => x.FieldName == groupBy);
+ if (groupBy != HeaderMetadata.None && i >= 0)
+ {
+ var rowsGroup = rows.SelectMany(x => x.Columns[i].Name.Split(';'), (x, g) => new { Group = g.Trim(), Rows = x })
+ .GroupBy(x => x.Group)
+ .OrderBy(x => x.Key)
+ .Select(x => new ReportGroup { Name = x.Key, Rows = x.Select(r => r.Rows).ToList() });
+
+ result.Groups = rowsGroup.ToList();
+ result.IsGrouped = true;
+ }
+ else
+ {
+ result.Rows = rows;
+ result.IsGrouped = false;
+ }
+
+ 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)
+ {
+ ReportIncludeItemTypes reportRowType = ReportHelper.GetRowType(request.IncludeItemTypes);
+ return this.GetHeaders<BaseItem>(request, () => this.GetDefaultHeaderMetadata(reportRowType), (hm) => this.GetOption(hm));
+ }
+
+ #endregion
+
+ #region [Private Methods]
+
+ /// <summary> Gets default report header metadata. </summary>
+ /// <param name="reportIncludeItemTypes"> Type of the report row. </param>
+ /// <returns> The default report header metadata. </returns>
+ private List<HeaderMetadata> GetDefaultHeaderMetadata(ReportIncludeItemTypes reportIncludeItemTypes)
+ {
+ switch (reportIncludeItemTypes)
+ {
+ case ReportIncludeItemTypes.Season:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Series,
@@ -183,8 +110,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Genres
};
- case ReportViewType.Series:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Series:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -199,8 +126,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Specials
};
- case ReportViewType.MusicAlbum:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.MusicAlbum:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -212,8 +139,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Genres
};
- case ReportViewType.MusicArtist:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.MusicArtist:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.MusicArtist,
@@ -223,8 +150,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Genres
};
- case ReportViewType.Game:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Game:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -239,8 +166,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Trailers
};
- case ReportViewType.Movie:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Movie:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -259,8 +186,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Specials
};
- case ReportViewType.Book:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Book:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -272,8 +199,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.CommunityRating
};
- case ReportViewType.BoxSet:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.BoxSet:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -286,8 +213,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Trailers
};
- case ReportViewType.Audio:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Audio:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -305,8 +232,8 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Audio
};
- case ReportViewType.Episode:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Episode:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -327,12 +254,12 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Specials
};
- case ReportViewType.Video:
- case ReportViewType.MusicVideo:
- case ReportViewType.Trailer:
- case ReportViewType.BaseItem:
- default:
- return new List<HeaderMetadata>
+ case ReportIncludeItemTypes.Video:
+ case ReportIncludeItemTypes.MusicVideo:
+ case ReportIncludeItemTypes.Trailer:
+ case ReportIncludeItemTypes.BaseItem:
+ default:
+ return new List<HeaderMetadata>
{
HeaderMetadata.StatusImage,
HeaderMetadata.Name,
@@ -351,239 +278,282 @@ namespace MediaBrowser.Api.Reports
HeaderMetadata.Specials
};
- }
-
- }
-
- /// <summary> Gets report option. </summary>
- /// <param name="header"> The header. </param>
- /// <param name="sortField"> The sort field. </param>
- /// <returns> The report option. </returns>
- private ReportOptions<BaseItem> GetReportOption(HeaderMetadata header, string sortField = "")
- {
- ReportHeader reportHeader = new ReportHeader
- {
- HeaderFieldType = ReportFieldType.String,
- SortField = sortField,
- Type = "",
- ItemViewType = ItemViewType.None
- };
-
- Func<BaseItem, ReportRow, object> column = null;
- Func<BaseItem, object> itemId = null;
- HeaderMetadata internalHeader = header;
-
- switch (header)
- {
- case HeaderMetadata.StatusImage:
- reportHeader.ItemViewType = ItemViewType.StatusImage;
- internalHeader = HeaderMetadata.Status;
- reportHeader.CanGroup = false;
- break;
-
- case HeaderMetadata.Name:
- column = (i, r) => i.Name;
- reportHeader.ItemViewType = ItemViewType.Detail;
- reportHeader.SortField = "SortName";
- break;
-
- case HeaderMetadata.DateAdded:
- column = (i, r) => i.DateCreated;
- reportHeader.SortField = "DateCreated,SortName";
- reportHeader.HeaderFieldType = ReportFieldType.DateTime;
- reportHeader.Type = "";
- break;
-
- case HeaderMetadata.PremiereDate:
- case HeaderMetadata.ReleaseDate:
- column = (i, r) => i.PremiereDate;
- reportHeader.HeaderFieldType = ReportFieldType.DateTime;
- reportHeader.SortField = "ProductionYear,PremiereDate,SortName";
- break;
-
- case HeaderMetadata.Runtime:
- column = (i, r) => this.GetRuntimeDateTime(i.RunTimeTicks);
- reportHeader.HeaderFieldType = ReportFieldType.Minutes;
- reportHeader.SortField = "Runtime,SortName";
- break;
-
- case HeaderMetadata.PlayCount:
- reportHeader.HeaderFieldType = ReportFieldType.Int;
- break;
-
- case HeaderMetadata.Season:
- column = (i, r) => this.GetEpisode(i);
- reportHeader.ItemViewType = ItemViewType.Detail;
- reportHeader.SortField = "SortName";
- break;
-
- case HeaderMetadata.SeasonNumber:
- column = (i, r) => this.GetObject<Season, string>(i, (x) => x.IndexNumber == null ? "" : x.IndexNumber.ToString());
- reportHeader.SortField = "IndexNumber";
- reportHeader.HeaderFieldType = ReportFieldType.Int;
- break;
-
- case HeaderMetadata.Series:
- column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
- reportHeader.ItemViewType = ItemViewType.Detail;
- reportHeader.SortField = "SeriesSortName,SortName";
- break;
-
- case HeaderMetadata.EpisodeSeries:
- column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
- reportHeader.ItemViewType = ItemViewType.Detail;
- itemId = (i) =>
- {
- Series series = this.GetObject<Episode, Series>(i, (x) => x.Series);
- if (series == null)
- return string.Empty;
- return series.Id;
- };
- reportHeader.SortField = "SeriesSortName,SortName";
- internalHeader = HeaderMetadata.Series;
- break;
-
- case HeaderMetadata.EpisodeSeason:
- column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
- reportHeader.ItemViewType = ItemViewType.Detail;
- itemId = (i) =>
- {
- Season season = this.GetObject<Episode, Season>(i, (x) => x.Season);
- if (season == null)
- return string.Empty;
- return season.Id;
- };
- reportHeader.SortField = "SortName";
- internalHeader = HeaderMetadata.Season;
- break;
-
- case HeaderMetadata.Network:
- column = (i, r) => this.GetListAsString(i.Studios);
- itemId = (i) => this.GetStudioID(i.Studios.FirstOrDefault());
- reportHeader.ItemViewType = ItemViewType.ItemByNameDetails;
- reportHeader.SortField = "Studio,SortName";
- break;
-
- case HeaderMetadata.Year:
- column = (i, r) => this.GetSeriesProductionYear(i);
- reportHeader.SortField = "ProductionYear,PremiereDate,SortName";
- break;
-
- case HeaderMetadata.ParentalRating:
- column = (i, r) => i.OfficialRating;
- reportHeader.SortField = "OfficialRating,SortName";
- break;
-
- case HeaderMetadata.CommunityRating:
- column = (i, r) => i.CommunityRating;
- reportHeader.SortField = "CommunityRating,SortName";
- break;
-
- case HeaderMetadata.Trailers:
- column = (i, r) => this.GetBoolString(r.HasLocalTrailer);
- reportHeader.ItemViewType = ItemViewType.TrailersImage;
- break;
-
- case HeaderMetadata.Specials:
- column = (i, r) => this.GetBoolString(r.HasSpecials);
- reportHeader.ItemViewType = ItemViewType.SpecialsImage;
- break;
-
- case HeaderMetadata.GameSystem:
- column = (i, r) => this.GetObject<Game, string>(i, (x) => x.GameSystem);
- reportHeader.SortField = "GameSystem,SortName";
- break;
-
- case HeaderMetadata.Players:
- column = (i, r) => this.GetObject<Game, int?>(i, (x) => x.PlayersSupported);
- reportHeader.SortField = "Players,GameSystem,SortName";
- break;
-
- case HeaderMetadata.AlbumArtist:
- column = (i, r) => this.GetObject<MusicAlbum, string>(i, (x) => x.AlbumArtist);
- itemId = (i) => this.GetPersonID(this.GetObject<MusicAlbum, string>(i, (x) => x.AlbumArtist));
- reportHeader.ItemViewType = ItemViewType.Detail;
- reportHeader.SortField = "AlbumArtist,Album,SortName";
-
- break;
- case HeaderMetadata.MusicArtist:
- column = (i, r) => this.GetObject<MusicArtist, string>(i, (x) => x.GetLookupInfo().Name);
- reportHeader.ItemViewType = ItemViewType.Detail;
- reportHeader.SortField = "AlbumArtist,Album,SortName";
- internalHeader = HeaderMetadata.AlbumArtist;
- break;
- case HeaderMetadata.AudioAlbumArtist:
- column = (i, r) => this.GetListAsString(this.GetObject<Audio, List<string>>(i, (x) => x.AlbumArtists));
- reportHeader.SortField = "AlbumArtist,Album,SortName";
- internalHeader = HeaderMetadata.AlbumArtist;
- break;
-
- case HeaderMetadata.AudioAlbum:
- column = (i, r) => this.GetObject<Audio, string>(i, (x) => x.Album);
- reportHeader.SortField = "Album,SortName";
- internalHeader = HeaderMetadata.Album;
- break;
-
- case HeaderMetadata.Countries:
- column = (i, r) => this.GetListAsString(this.GetObject<IHasProductionLocations, List<string>>(i, (x) => x.ProductionLocations));
- break;
-
- case HeaderMetadata.Disc:
- column = (i, r) => i.ParentIndexNumber;
- break;
-
- case HeaderMetadata.Track:
- column = (i, r) => i.IndexNumber;
- break;
-
- case HeaderMetadata.Tracks:
- column = (i, r) => this.GetObject<MusicAlbum, List<Audio>>(i, (x) => x.Tracks.ToList(), new List<Audio>()).Count();
- break;
-
- case HeaderMetadata.Audio:
- column = (i, r) => this.GetAudioStream(i);
- break;
-
- case HeaderMetadata.EmbeddedImage:
- break;
-
- case HeaderMetadata.Video:
- column = (i, r) => this.GetVideoStream(i);
- break;
-
- case HeaderMetadata.Resolution:
- column = (i, r) => this.GetVideoResolution(i);
- break;
-
- case HeaderMetadata.Subtitles:
- column = (i, r) => this.GetBoolString(r.HasSubtitles);
- reportHeader.ItemViewType = ItemViewType.SubtitleImage;
- break;
-
- case HeaderMetadata.Genres:
- column = (i, r) => this.GetListAsString(i.Genres);
- break;
-
- }
-
- string headerName = "";
- if (internalHeader != HeaderMetadata.None)
- {
- string localHeader = "Header" + internalHeader.ToString();
- headerName = internalHeader != HeaderMetadata.None ? ReportHelper.GetJavaScriptLocalizedString(localHeader) : "";
- if (string.Compare(localHeader, headerName, StringComparison.CurrentCultureIgnoreCase) == 0)
- headerName = ReportHelper.GetServerLocalizedString(localHeader);
- }
-
- reportHeader.Name = headerName;
- reportHeader.FieldName = header;
- ReportOptions<BaseItem> option = new ReportOptions<BaseItem>()
- {
- Header = reportHeader,
- Column = column,
- ItemID = itemId
- };
- return option;
- }
- }
+ }
+
+ }
+
+ /// <summary> Gets report option. </summary>
+ /// <param name="header"> The header. </param>
+ /// <param name="sortField"> The sort field. </param>
+ /// <returns> The report option. </returns>
+ private ReportOptions<BaseItem> GetOption(HeaderMetadata header, string sortField = "")
+ {
+ HeaderMetadata internalHeader = header;
+
+ ReportOptions<BaseItem> option = new ReportOptions<BaseItem>()
+ {
+ Header = new ReportHeader
+ {
+ HeaderFieldType = ReportFieldType.String,
+ SortField = sortField,
+ Type = "",
+ ItemViewType = ItemViewType.None
+ }
+ };
+
+ switch (header)
+ {
+ case HeaderMetadata.StatusImage:
+ option.Header.ItemViewType = ItemViewType.StatusImage;
+ internalHeader = HeaderMetadata.Status;
+ option.Header.CanGroup = false;
+ break;
+
+ case HeaderMetadata.Name:
+ option.Column = (i, r) => i.Name;
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.Header.SortField = "SortName";
+ break;
+
+ case HeaderMetadata.DateAdded:
+ option.Column = (i, r) => i.DateCreated;
+ option.Header.SortField = "DateCreated,SortName";
+ option.Header.HeaderFieldType = ReportFieldType.DateTime;
+ option.Header.Type = "";
+ break;
+
+ case HeaderMetadata.PremiereDate:
+ case HeaderMetadata.ReleaseDate:
+ option.Column = (i, r) => i.PremiereDate;
+ option.Header.HeaderFieldType = ReportFieldType.DateTime;
+ option.Header.SortField = "ProductionYear,PremiereDate,SortName";
+ break;
+
+ case HeaderMetadata.Runtime:
+ option.Column = (i, r) => this.GetRuntimeDateTime(i.RunTimeTicks);
+ option.Header.HeaderFieldType = ReportFieldType.Minutes;
+ option.Header.SortField = "Runtime,SortName";
+ break;
+
+ case HeaderMetadata.PlayCount:
+ option.Header.HeaderFieldType = ReportFieldType.Int;
+ break;
+
+ case HeaderMetadata.Season:
+ option.Column = (i, r) => this.GetEpisode(i);
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.Header.SortField = "SortName";
+ break;
+
+ case HeaderMetadata.SeasonNumber:
+ option.Column = (i, r) => this.GetObject<Season, string>(i, (x) => x.IndexNumber == null ? "" : x.IndexNumber.ToString());
+ option.Header.SortField = "IndexNumber";
+ option.Header.HeaderFieldType = ReportFieldType.Int;
+ break;
+
+ case HeaderMetadata.Series:
+ option.Column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.Header.SortField = "SeriesSortName,SortName";
+ break;
+
+ case HeaderMetadata.EpisodeSeries:
+ option.Column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.ItemID = (i) =>
+ {
+ Series series = this.GetObject<Episode, Series>(i, (x) => x.Series);
+ if (series == null)
+ return string.Empty;
+ return series.Id;
+ };
+ option.Header.SortField = "SeriesSortName,SortName";
+ internalHeader = HeaderMetadata.Series;
+ break;
+
+ case HeaderMetadata.EpisodeSeason:
+ option.Column = (i, r) => this.GetObject<IHasSeries, string>(i, (x) => x.SeriesName);
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.ItemID = (i) =>
+ {
+ Season season = this.GetObject<Episode, Season>(i, (x) => x.Season);
+ if (season == null)
+ return string.Empty;
+ return season.Id;
+ };
+ option.Header.SortField = "SortName";
+ internalHeader = HeaderMetadata.Season;
+ break;
+
+ case HeaderMetadata.Network:
+ option.Column = (i, r) => this.GetListAsString(i.Studios);
+ option.ItemID = (i) => this.GetStudioID(i.Studios.FirstOrDefault());
+ option.Header.ItemViewType = ItemViewType.ItemByNameDetails;
+ option.Header.SortField = "Studio,SortName";
+ break;
+
+ case HeaderMetadata.Year:
+ option.Column = (i, r) => this.GetSeriesProductionYear(i);
+ option.Header.SortField = "ProductionYear,PremiereDate,SortName";
+ break;
+
+ case HeaderMetadata.ParentalRating:
+ option.Column = (i, r) => i.OfficialRating;
+ option.Header.SortField = "OfficialRating,SortName";
+ break;
+
+ case HeaderMetadata.CommunityRating:
+ option.Column = (i, r) => i.CommunityRating;
+ option.Header.SortField = "CommunityRating,SortName";
+ break;
+
+ case HeaderMetadata.Trailers:
+ option.Column = (i, r) => this.GetBoolString(r.HasLocalTrailer);
+ option.Header.ItemViewType = ItemViewType.TrailersImage;
+ break;
+
+ case HeaderMetadata.Specials:
+ option.Column = (i, r) => this.GetBoolString(r.HasSpecials);
+ option.Header.ItemViewType = ItemViewType.SpecialsImage;
+ break;
+
+ case HeaderMetadata.GameSystem:
+ option.Column = (i, r) => this.GetObject<Game, string>(i, (x) => x.GameSystem);
+ option.Header.SortField = "GameSystem,SortName";
+ break;
+
+ case HeaderMetadata.Players:
+ option.Column = (i, r) => this.GetObject<Game, int?>(i, (x) => x.PlayersSupported);
+ option.Header.SortField = "Players,GameSystem,SortName";
+ break;
+
+ case HeaderMetadata.AlbumArtist:
+ option.Column = (i, r) => this.GetObject<MusicAlbum, string>(i, (x) => x.AlbumArtist);
+ option.ItemID = (i) => this.GetPersonID(this.GetObject<MusicAlbum, string>(i, (x) => x.AlbumArtist));
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.Header.SortField = "AlbumArtist,Album,SortName";
+
+ break;
+ case HeaderMetadata.MusicArtist:
+ option.Column = (i, r) => this.GetObject<MusicArtist, string>(i, (x) => x.GetLookupInfo().Name);
+ option.Header.ItemViewType = ItemViewType.Detail;
+ option.Header.SortField = "AlbumArtist,Album,SortName";
+ internalHeader = HeaderMetadata.AlbumArtist;
+ break;
+ case HeaderMetadata.AudioAlbumArtist:
+ option.Column = (i, r) => this.GetListAsString(this.GetObject<Audio, List<string>>(i, (x) => x.AlbumArtists));
+ option.Header.SortField = "AlbumArtist,Album,SortName";
+ internalHeader = HeaderMetadata.AlbumArtist;
+ break;
+
+ case HeaderMetadata.AudioAlbum:
+ option.Column = (i, r) => this.GetObject<Audio, string>(i, (x) => x.Album);
+ option.Header.SortField = "Album,SortName";
+ internalHeader = HeaderMetadata.Album;
+ break;
+
+ case HeaderMetadata.Countries:
+ option.Column = (i, r) => this.GetListAsString(this.GetObject<IHasProductionLocations, List<string>>(i, (x) => x.ProductionLocations));
+ break;
+
+ case HeaderMetadata.Disc:
+ option.Column = (i, r) => i.ParentIndexNumber;
+ break;
+
+ case HeaderMetadata.Track:
+ option.Column = (i, r) => i.IndexNumber;
+ break;
+
+ case HeaderMetadata.Tracks:
+ option.Column = (i, r) => this.GetObject<MusicAlbum, List<Audio>>(i, (x) => x.Tracks.ToList(), new List<Audio>()).Count();
+ break;
+
+ case HeaderMetadata.Audio:
+ option.Column = (i, r) => this.GetAudioStream(i);
+ break;
+
+ case HeaderMetadata.EmbeddedImage:
+ break;
+
+ case HeaderMetadata.Video:
+ option.Column = (i, r) => this.GetVideoStream(i);
+ break;
+
+ case HeaderMetadata.Resolution:
+ option.Column = (i, r) => this.GetVideoResolution(i);
+ break;
+
+ case HeaderMetadata.Subtitles:
+ option.Column = (i, r) => this.GetBoolString(r.HasSubtitles);
+ option.Header.ItemViewType = ItemViewType.SubtitleImage;
+ break;
+
+ case HeaderMetadata.Genres:
+ option.Column = (i, r) => this.GetListAsString(i.Genres);
+ break;
+
+ }
+
+ option.Header.Name = GetLocalizedHeader(internalHeader);
+ option.Header.FieldName = header;
+
+ return option;
+ }
+
+ /// <summary> Gets report rows. </summary>
+ /// <param name="items"> The items. </param>
+ /// <param name="options"> Options for controlling the operation. </param>
+ /// <returns> The report rows. </returns>
+ private List<ReportRow> GetReportRows(IEnumerable<BaseItem> items, List<ReportOptions<BaseItem>> options)
+ {
+ var rows = new List<ReportRow>();
+
+ foreach (BaseItem item in items)
+ {
+ ReportRow rRow = GetRow(item);
+ foreach (ReportOptions<BaseItem> option in options)
+ {
+ object itemColumn = option.Column != null ? option.Column(item, rRow) : "";
+ object itemId = option.ItemID != null ? option.ItemID(item) : "";
+ ReportItem rItem = new ReportItem
+ {
+ Name = ReportHelper.ConvertToString(itemColumn, option.Header.HeaderFieldType),
+ Id = ReportHelper.ConvertToString(itemId, ReportFieldType.Object)
+ };
+ rRow.Columns.Add(rItem);
+ }
+
+ rows.Add(rRow);
+ }
+
+ return rows;
+ }
+
+ /// <summary> Gets a row. </summary>
+ /// <param name="item"> The item. </param>
+ /// <returns> The row. </returns>
+ private ReportRow GetRow(BaseItem item)
+ {
+ var hasTrailers = item as IHasTrailers;
+ var hasSpecialFeatures = item as IHasSpecialFeatures;
+ var video = item as Video;
+ ReportRow rRow = new ReportRow
+ {
+ Id = item.Id.ToString("N"),
+ HasLockData = item.IsLocked,
+ IsUnidentified = item.IsUnidentified,
+ HasLocalTrailer = hasTrailers != null ? hasTrailers.GetTrailerIds().Count() > 0 : false,
+ HasImageTagsPrimary = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Primary) > 0),
+ HasImageTagsBackdrop = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Backdrop) > 0),
+ HasImageTagsLogo = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Logo) > 0),
+ HasSpecials = hasSpecialFeatures != null ? hasSpecialFeatures.SpecialFeatureIds.Count > 0 : false,
+ HasSubtitles = video != null ? video.HasSubtitles : false,
+ RowType = ReportHelper.GetRowType(item.GetClientTypeName())
+ };
+ return rRow;
+ }
+
+ #endregion
+
+ }
}