a7919b9bac
The user data cache and the item's in-memory rows were both filled once per replica and never invalidated, so a pod serving a playback tick read its own stale resume position and wrote it back over the position another pod had just saved, silently losing resume points, played state, favourites and ratings. - drop the user item data cache - read single and batched user data from the database on every query - prefetch user data for in-memory sorts and filters so each stays one query - cover the lost update against real PostgreSQL with two manager instances
69 lines
1.9 KiB
C#
69 lines
1.9 KiB
C#
#nullable disable
|
|
|
|
#pragma warning disable CS1591
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Jellyfin.Data.Enums;
|
|
using Jellyfin.Database.Implementations.Entities;
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Library;
|
|
using MediaBrowser.Controller.Sorting;
|
|
|
|
namespace Emby.Server.Implementations.Sorting
|
|
{
|
|
public class IsPlayedComparer : IUserBaseItemComparer
|
|
{
|
|
/// <summary>
|
|
/// Gets or sets the user.
|
|
/// </summary>
|
|
/// <value>The user.</value>
|
|
public User User { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets the name.
|
|
/// </summary>
|
|
/// <value>The name.</value>
|
|
public ItemSortBy Type => ItemSortBy.IsUnplayed;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the user data manager.
|
|
/// </summary>
|
|
/// <value>The user data manager.</value>
|
|
public IUserDataManager UserDataManager { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the user manager.
|
|
/// </summary>
|
|
/// <value>The user manager.</value>
|
|
public IUserManager UserManager { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the prefetched user data.
|
|
/// </summary>
|
|
/// <value>The prefetched user data.</value>
|
|
public IReadOnlyDictionary<Guid, UserItemData> PrefetchedUserData { get; set; }
|
|
|
|
/// <summary>
|
|
/// Compares the specified x.
|
|
/// </summary>
|
|
/// <param name="x">The x.</param>
|
|
/// <param name="y">The y.</param>
|
|
/// <returns>System.Int32.</returns>
|
|
public int Compare(BaseItem x, BaseItem y)
|
|
{
|
|
return GetValue(x).CompareTo(GetValue(y));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the date.
|
|
/// </summary>
|
|
/// <param name="x">The x.</param>
|
|
/// <returns>DateTime.</returns>
|
|
private int GetValue(BaseItem x)
|
|
{
|
|
return x.IsPlayed(User, this.GetUserData(x)) ? 0 : 1;
|
|
}
|
|
}
|
|
}
|