Display extras with an unknown type

This commit is contained in:
Mark Monteiro 2020-03-28 13:40:56 +01:00
parent bd4269cb59
commit 5fcbedc194
3 changed files with 56 additions and 23 deletions

View File

@ -1056,30 +1056,19 @@ namespace Emby.Server.Implementations.Dto
if (options.ContainsField(ItemFields.SpecialFeatureCount)) if (options.ContainsField(ItemFields.SpecialFeatureCount))
{ {
if (allExtras == null) allExtras = item.GetExtras().ToArray();
{ dto.SpecialFeatureCount = allExtras.Count(i => i.HasExtraType(BaseItem.DisplayExtraTypes, true));
allExtras = item.GetExtras().ToArray();
}
dto.SpecialFeatureCount = allExtras.Count(i => i.ExtraType.HasValue && BaseItem.DisplayExtraTypes.Contains(i.ExtraType.Value));
} }
if (options.ContainsField(ItemFields.LocalTrailerCount)) if (options.ContainsField(ItemFields.LocalTrailerCount))
{ {
int trailerCount = 0; allExtras = allExtras ?? item.GetExtras().ToArray();
if (allExtras == null) dto.LocalTrailerCount = allExtras.Count(i => i.HasExtraType(new[] { ExtraType.Trailer }, false));
{
allExtras = item.GetExtras().ToArray();
}
trailerCount += allExtras.Count(i => i.ExtraType.HasValue && i.ExtraType.Value == ExtraType.Trailer);
if (item is IHasTrailers hasTrailers) if (item is IHasTrailers hasTrailers)
{ {
trailerCount += hasTrailers.GetTrailerCount(); dto.LocalTrailerCount += hasTrailers.GetTrailerCount();
} }
dto.LocalTrailerCount = trailerCount;
} }
// Add EpisodeInfo // Add EpisodeInfo

View File

@ -380,7 +380,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoOptions = GetDtoOptions(_authContext, request); var dtoOptions = GetDtoOptions(_authContext, request);
var dtosExtras = item.GetExtras(new[] { ExtraType.Trailer }) var dtosExtras = item.GetExtras(new[] { ExtraType.Trailer }, false)
.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)) .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item))
.ToArray(); .ToArray();

View File

@ -2878,14 +2878,30 @@ namespace MediaBrowser.Controller.Entities
/// <value>The remote trailers.</value> /// <value>The remote trailers.</value>
public IReadOnlyList<MediaUrl> RemoteTrailers { get; set; } public IReadOnlyList<MediaUrl> RemoteTrailers { get; set; }
/// <summary>
/// Get all extras associated with this item, sorted by <see cref="SortName"/>.
/// </summary>
/// <returns>An enumerable containing the items.</returns>
public IEnumerable<BaseItem> GetExtras() public IEnumerable<BaseItem> GetExtras()
{ {
return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null).OrderBy(i => i.SortName); return ExtraIds
.Select(LibraryManager.GetItemById)
.Where(i => i != null)
.OrderBy(i => i.SortName);
} }
public IEnumerable<BaseItem> GetExtras(IReadOnlyCollection<ExtraType> extraTypes) /// <summary>
/// Get all extras with specific types that are associated with this item.
/// </summary>
/// <param name="extraTypes">The types of extras to retrieve.</param>
/// <param name="includeUnknownTypes">If true, include extras whose type could not be determined.</param>
/// <returns>An enumerable containing the extras.</returns>
public IEnumerable<BaseItem> GetExtras(IReadOnlyCollection<ExtraType> extraTypes, bool includeUnknownTypes)
{ {
return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i?.ExtraType != null && extraTypes.Contains(i.ExtraType.Value)); return ExtraIds
.Select(LibraryManager.GetItemById)
.Where(i => i != null)
.Where(i => i.HasExtraType(extraTypes, includeUnknownTypes));
} }
public IEnumerable<BaseItem> GetTrailers() public IEnumerable<BaseItem> GetTrailers()
@ -2896,9 +2912,27 @@ namespace MediaBrowser.Controller.Entities
return Array.Empty<BaseItem>(); return Array.Empty<BaseItem>();
} }
/// <summary>
/// Get all extras associated with this item that should be displayed as "Special Features" in the UI. This is
/// all extras with either an unknown type, or a type contained in <see cref="DisplayExtraTypes"/>.
/// </summary>
/// <returns>An IEnumerable containing the extra items.</returns>
public IEnumerable<BaseItem> GetDisplayExtras() public IEnumerable<BaseItem> GetDisplayExtras()
{ {
return GetExtras(DisplayExtraTypes); return GetExtras(DisplayExtraTypes, true);
}
/// <summary>
/// Check if this item is an extra with a type that matches a given set.
/// </summary>
/// <param name="extraTypes">The types of extras to match with.</param>
/// <param name="includeUnknownTypes">If true, include extras whose type could not be determined.</param>
/// <returns>True if this item matches, otherwise false.</returns>
public bool HasExtraType(IReadOnlyCollection<ExtraType> extraTypes, bool includeUnknownTypes)
{
return
(includeUnknownTypes && (ExtraType == null || ExtraType == 0))
|| (ExtraType.HasValue && extraTypes.Contains(ExtraType.Value));
} }
public virtual bool IsHD => Height >= 720; public virtual bool IsHD => Height >= 720;
@ -2918,8 +2952,18 @@ namespace MediaBrowser.Controller.Entities
return RunTimeTicks ?? 0; return RunTimeTicks ?? 0;
} }
// Possible types of extra videos /// <summary>
public static readonly IReadOnlyCollection<ExtraType> DisplayExtraTypes = new[] { Model.Entities.ExtraType.BehindTheScenes, Model.Entities.ExtraType.Clip, Model.Entities.ExtraType.DeletedScene, Model.Entities.ExtraType.Interview, Model.Entities.ExtraType.Sample, Model.Entities.ExtraType.Scene }; /// Extra types that should be counted and displayed as "Special Features" in the UI.
/// </summary>
public static readonly IReadOnlyCollection<ExtraType> DisplayExtraTypes = new HashSet<ExtraType>
{
Model.Entities.ExtraType.BehindTheScenes,
Model.Entities.ExtraType.Clip,
Model.Entities.ExtraType.DeletedScene,
Model.Entities.ExtraType.Interview,
Model.Entities.ExtraType.Sample,
Model.Entities.ExtraType.Scene
};
public virtual bool SupportsExternalTransfer => false; public virtual bool SupportsExternalTransfer => false;