|
|
@@ -1,7 +1,10 @@
|
|
|
+#pragma warning disable RS0030 // Do not use banned APIs
|
|
|
+
|
|
|
using System;
|
|
|
using System.Linq;
|
|
|
using System.Linq.Expressions;
|
|
|
using Jellyfin.Data.Enums;
|
|
|
+using Jellyfin.Database.Implementations;
|
|
|
using Jellyfin.Database.Implementations.Entities;
|
|
|
using MediaBrowser.Controller.Entities;
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
@@ -18,39 +21,50 @@ public static class OrderMapper
|
|
|
/// </summary>
|
|
|
/// <param name="sortBy">Item property to sort by.</param>
|
|
|
/// <param name="query">Context Query.</param>
|
|
|
+ /// <param name="jellyfinDbContext">Context.</param>
|
|
|
/// <returns>Func to be executed later for sorting query.</returns>
|
|
|
- public static Expression<Func<BaseItemEntity, object?>> MapOrderByField(ItemSortBy sortBy, InternalItemsQuery query)
|
|
|
+ public static Expression<Func<BaseItemEntity, object?>> MapOrderByField(ItemSortBy sortBy, InternalItemsQuery query, JellyfinDbContext jellyfinDbContext)
|
|
|
{
|
|
|
- return sortBy switch
|
|
|
+ return (sortBy, query.User) switch
|
|
|
{
|
|
|
- ItemSortBy.AirTime => e => e.SortName, // TODO
|
|
|
- ItemSortBy.Runtime => e => e.RunTimeTicks,
|
|
|
- ItemSortBy.Random => e => EF.Functions.Random(),
|
|
|
- ItemSortBy.DatePlayed => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.LastPlayedDate,
|
|
|
- ItemSortBy.PlayCount => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.PlayCount,
|
|
|
- ItemSortBy.IsFavoriteOrLiked => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.IsFavorite,
|
|
|
- ItemSortBy.IsFolder => e => e.IsFolder,
|
|
|
- ItemSortBy.IsPlayed => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
|
|
|
- ItemSortBy.IsUnplayed => e => !e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
|
|
|
- ItemSortBy.DateLastContentAdded => e => e.DateLastMediaAdded,
|
|
|
- ItemSortBy.Artist => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Artist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
- ItemSortBy.AlbumArtist => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.AlbumArtist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
- ItemSortBy.Studio => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Studios).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
- ItemSortBy.OfficialRating => e => e.InheritedParentalRatingValue,
|
|
|
- // ItemSortBy.SeriesDatePlayed => "(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where Played=1 and B.SeriesPresentationUniqueKey=A.PresentationUniqueKey)",
|
|
|
- ItemSortBy.SeriesSortName => e => e.SeriesName,
|
|
|
+ (ItemSortBy.AirTime, _) => e => e.SortName, // TODO
|
|
|
+ (ItemSortBy.Runtime, _) => e => e.RunTimeTicks,
|
|
|
+ (ItemSortBy.Random, _) => e => EF.Functions.Random(),
|
|
|
+ (ItemSortBy.DatePlayed, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.LastPlayedDate,
|
|
|
+ (ItemSortBy.PlayCount, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.PlayCount,
|
|
|
+ (ItemSortBy.IsFavoriteOrLiked, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.IsFavorite,
|
|
|
+ (ItemSortBy.IsFolder, _) => e => e.IsFolder,
|
|
|
+ (ItemSortBy.IsPlayed, _) => e => e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
|
|
|
+ (ItemSortBy.IsUnplayed, _) => e => !e.UserData!.FirstOrDefault(f => f.UserId.Equals(query.User!.Id))!.Played,
|
|
|
+ (ItemSortBy.DateLastContentAdded, _) => e => e.DateLastMediaAdded,
|
|
|
+ (ItemSortBy.Artist, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Artist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
+ (ItemSortBy.AlbumArtist, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.AlbumArtist).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
+ (ItemSortBy.Studio, _) => e => e.ItemValues!.Where(f => f.ItemValue.Type == ItemValueType.Studios).Select(f => f.ItemValue.CleanValue).FirstOrDefault(),
|
|
|
+ (ItemSortBy.OfficialRating, _) => e => e.InheritedParentalRatingValue,
|
|
|
+ (ItemSortBy.SeriesSortName, _) => e => e.SeriesName,
|
|
|
+ (ItemSortBy.Album, _) => e => e.Album,
|
|
|
+ (ItemSortBy.DateCreated, _) => e => e.DateCreated,
|
|
|
+ (ItemSortBy.PremiereDate, _) => e => (e.PremiereDate ?? (e.ProductionYear.HasValue ? DateTime.MinValue.AddYears(e.ProductionYear.Value - 1) : null)),
|
|
|
+ (ItemSortBy.StartDate, _) => e => e.StartDate,
|
|
|
+ (ItemSortBy.Name, _) => e => e.CleanName,
|
|
|
+ (ItemSortBy.CommunityRating, _) => e => e.CommunityRating,
|
|
|
+ (ItemSortBy.ProductionYear, _) => e => e.ProductionYear,
|
|
|
+ (ItemSortBy.CriticRating, _) => e => e.CriticRating,
|
|
|
+ (ItemSortBy.VideoBitRate, _) => e => e.TotalBitrate,
|
|
|
+ (ItemSortBy.ParentIndexNumber, _) => e => e.ParentIndexNumber,
|
|
|
+ (ItemSortBy.IndexNumber, _) => e => e.IndexNumber,
|
|
|
+ (ItemSortBy.SeriesDatePlayed, not null) => e =>
|
|
|
+ jellyfinDbContext.BaseItems
|
|
|
+ .Where(w => w.SeriesPresentationUniqueKey == e.PresentationUniqueKey)
|
|
|
+ .Join(jellyfinDbContext.UserData.Where(w => w.UserId == query.User.Id && w.Played), f => f.Id, f => f.ItemId, (item, userData) => userData.LastPlayedDate)
|
|
|
+ .Max(f => f),
|
|
|
+ (ItemSortBy.SeriesDatePlayed, null) => e => jellyfinDbContext.BaseItems.Where(w => w.SeriesPresentationUniqueKey == e.PresentationUniqueKey)
|
|
|
+ .Join(jellyfinDbContext.UserData.Where(w => w.Played), f => f.Id, f => f.ItemId, (item, userData) => userData.LastPlayedDate)
|
|
|
+ .Max(f => f),
|
|
|
+ // ItemSortBy.SeriesDatePlayed => e => jellyfinDbContext.UserData
|
|
|
+ // .Where(u => u.Item!.SeriesPresentationUniqueKey == e.PresentationUniqueKey && u.Played)
|
|
|
+ // .Max(f => f.LastPlayedDate),
|
|
|
// ItemSortBy.AiredEpisodeOrder => "AiredEpisodeOrder",
|
|
|
- ItemSortBy.Album => e => e.Album,
|
|
|
- ItemSortBy.DateCreated => e => e.DateCreated,
|
|
|
- ItemSortBy.PremiereDate => e => (e.PremiereDate ?? (e.ProductionYear.HasValue ? DateTime.MinValue.AddYears(e.ProductionYear.Value - 1) : null)),
|
|
|
- ItemSortBy.StartDate => e => e.StartDate,
|
|
|
- ItemSortBy.Name => e => e.CleanName,
|
|
|
- ItemSortBy.CommunityRating => e => e.CommunityRating,
|
|
|
- ItemSortBy.ProductionYear => e => e.ProductionYear,
|
|
|
- ItemSortBy.CriticRating => e => e.CriticRating,
|
|
|
- ItemSortBy.VideoBitRate => e => e.TotalBitrate,
|
|
|
- ItemSortBy.ParentIndexNumber => e => e.ParentIndexNumber,
|
|
|
- ItemSortBy.IndexNumber => e => e.IndexNumber,
|
|
|
_ => e => e.SortName
|
|
|
};
|
|
|
}
|