Merge pull request #17456 from Shadowghost/fix-extras

Fix extras naming and version assignment
This commit is contained in:
Cody Robibero
2026-08-02 14:25:00 -04:00
committed by GitHub
9 changed files with 562 additions and 59 deletions
@@ -1113,16 +1113,23 @@ public sealed partial class BaseItemRepository
: baseQuery.WhereNeitherItemNorDescendantMatches(context, isPlaceHolder);
}
// An extra is owned by the single version of an item it is named after, so an extra on any
// version counts for the item itself
IQueryable<Guid> WithPrimaryVersions(IQueryable<Guid> ownerIds)
=> ownerIds.Concat(context.BaseItems
.Where(version => version.PrimaryVersionId != null && ownerIds.Contains(version.Id))
.Select(version => version.PrimaryVersionId!.Value));
if (filter.HasSpecialFeature.HasValue)
{
var itemsWithExtras = context.BaseItems
var itemsWithExtras = WithPrimaryVersions(context.BaseItems
.Where(extra => extra.OwnerId != null
&& extra.ExtraType != null
&& extra.ExtraType != BaseItemExtraType.Unknown
&& extra.ExtraType != BaseItemExtraType.Trailer
&& extra.ExtraType != BaseItemExtraType.ThemeSong
&& extra.ExtraType != BaseItemExtraType.ThemeVideo)
.Select(extra => extra.OwnerId!.Value)
.Select(extra => extra.OwnerId!.Value))
.Distinct();
Expression<Func<BaseItemEntity, bool>> hasExtras = e => itemsWithExtras.Contains(e.Id);
@@ -1134,9 +1141,9 @@ public sealed partial class BaseItemRepository
if (filter.HasTrailer.HasValue)
{
var trailerOwnerIds = context.BaseItems
var trailerOwnerIds = WithPrimaryVersions(context.BaseItems
.Where(extra => extra.ExtraType == BaseItemExtraType.Trailer && extra.OwnerId != null)
.Select(extra => extra.OwnerId!.Value);
.Select(extra => extra.OwnerId!.Value));
Expression<Func<BaseItemEntity, bool>> hasTrailer = e => trailerOwnerIds.Contains(e.Id);
@@ -1147,9 +1154,9 @@ public sealed partial class BaseItemRepository
if (filter.HasThemeSong.HasValue)
{
var themeSongOwnerIds = context.BaseItems
var themeSongOwnerIds = WithPrimaryVersions(context.BaseItems
.Where(extra => extra.ExtraType == BaseItemExtraType.ThemeSong && extra.OwnerId != null)
.Select(extra => extra.OwnerId!.Value);
.Select(extra => extra.OwnerId!.Value));
Expression<Func<BaseItemEntity, bool>> hasThemeSong = e => themeSongOwnerIds.Contains(e.Id);
@@ -1160,9 +1167,9 @@ public sealed partial class BaseItemRepository
if (filter.HasThemeVideo.HasValue)
{
var themeVideoOwnerIds = context.BaseItems
var themeVideoOwnerIds = WithPrimaryVersions(context.BaseItems
.Where(extra => extra.ExtraType == BaseItemExtraType.ThemeVideo && extra.OwnerId != null)
.Select(extra => extra.OwnerId!.Value);
.Select(extra => extra.OwnerId!.Value));
Expression<Func<BaseItemEntity, bool>> hasThemeVideo = e => themeVideoOwnerIds.Contains(e.Id);