aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgnattu <gnattu@users.noreply.github.com>2024-09-18 21:22:53 +0800
committerGitHub <noreply@github.com>2024-09-18 07:22:53 -0600
commit97d2f778f8490d12d4171acfcfd873a36587da8d (patch)
treea4ba70f59fcf926b5a64cfe0a9032412092b7c65
parent901573473d0f1b2e6b852ba6f92110b9d7bb2c0f (diff)
Only sort item by width when they have the same path (#12626)
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs7
-rw-r--r--MediaBrowser.Controller/Entities/MediaSourceWidthComparator.cs56
2 files changed, 57 insertions, 6 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 05a7b7896..414488853 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1087,12 +1087,7 @@ namespace MediaBrowser.Controller.Entities
return 1;
}).ThenBy(i => i.Video3DFormat.HasValue ? 1 : 0)
- .ThenByDescending(i =>
- {
- var stream = i.VideoStream;
-
- return stream is null || stream.Width is null ? 0 : stream.Width.Value;
- })
+ .ThenByDescending(i => i, new MediaSourceWidthComparator())
.ToList();
}
diff --git a/MediaBrowser.Controller/Entities/MediaSourceWidthComparator.cs b/MediaBrowser.Controller/Entities/MediaSourceWidthComparator.cs
new file mode 100644
index 000000000..0224577a4
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/MediaSourceWidthComparator.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Intrinsics.X86;
+using MediaBrowser.Model.Dto;
+
+namespace MediaBrowser.Controller.Entities;
+
+/// <summary>
+/// Compare MediaSource of the same file by Video width <see cref="IComparer{T}" />.
+/// </summary>
+public class MediaSourceWidthComparator : IComparer<MediaSourceInfo>
+{
+ /// <inheritdoc />
+ public int Compare(MediaSourceInfo? x, MediaSourceInfo? y)
+ {
+ if (x is null && y is null)
+ {
+ return 0;
+ }
+
+ if (x is null)
+ {
+ return -1;
+ }
+
+ if (y is null)
+ {
+ return 1;
+ }
+
+ if (string.Equals(x.Path, y.Path, StringComparison.OrdinalIgnoreCase))
+ {
+ if (x.VideoStream is null && y.VideoStream is null)
+ {
+ return 0;
+ }
+
+ if (x.VideoStream is null)
+ {
+ return -1;
+ }
+
+ if (y.VideoStream is null)
+ {
+ return 1;
+ }
+
+ var xWidth = x.VideoStream.Width ?? 0;
+ var yWidth = y.VideoStream.Width ?? 0;
+
+ return xWidth - yWidth;
+ }
+
+ return 0;
+ }
+}