emby-toolbox/EmbyToolbox/Services/BulkTrackSettingsService.cs
Emby Toolbox 6264b487fe Initial commit: Emby Toolbox (conversion scroll fix, bulk Del for tracks).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 21:33:47 +05:00

75 lines
2.4 KiB
C#

using EmbyToolbox.Models;
namespace EmbyToolbox.Services;
public sealed class BulkTrackSettingsService
{
private readonly TrackStructureComparer _comparer = new();
public BulkTrackSelectionAnalysis Analyze(IReadOnlyList<ConversionQueueItem> selected)
{
var candidates = selected
.Where(i => i.MediaAnalysis is not null && i.TaskOverride.TrackOverrides.Count > 0)
.ToList();
if (candidates.Count < 2)
{
return BulkTrackSelectionAnalysis.Empty;
}
var groups = candidates
.GroupBy(i => _comparer.BuildSignature(i.TaskOverride.TrackOverrides))
.Select(g => new { Signature = g.Key, Items = g.OrderBy(i => i.OrderNumber).ToList() })
.OrderByDescending(g => g.Items.Count)
.ThenBy(g => g.Items[0].OrderNumber)
.ToList();
if (groups.Count == 0)
{
return BulkTrackSelectionAnalysis.Empty;
}
var top = groups[0];
if (groups.Count > 1 && groups[1].Items.Count == top.Items.Count)
{
return new BulkTrackSelectionAnalysis(null, [], candidates.OrderBy(i => i.OrderNumber).ToList(), false);
}
var skipped = candidates.Except(top.Items).OrderBy(i => i.OrderNumber).ToList();
return new BulkTrackSelectionAnalysis(top.Signature, top.Items, skipped, true);
}
public void ApplyBulkEdits(
IReadOnlyList<ConversionQueueItem> targets,
IReadOnlyList<TrackOverrideEntry> editedTemplateTracks)
{
foreach (var item in targets)
{
if (item.TaskOverride.TrackOverrides.Count != editedTemplateTracks.Count)
{
continue;
}
for (var i = 0; i < editedTemplateTracks.Count; i++)
{
var dst = item.TaskOverride.TrackOverrides[i];
var src = editedTemplateTracks[i];
dst.Action = src.Action;
dst.AudioBitrateKbps = src.AudioBitrateKbps;
dst.Default = src.Default;
dst.Language = src.Language;
dst.Title = src.Title;
}
}
}
}
public sealed record BulkTrackSelectionAnalysis(
string? MajoritySignature,
IReadOnlyList<ConversionQueueItem> MajorityItems,
IReadOnlyList<ConversionQueueItem> SkippedItems,
bool HasMajority)
{
public static BulkTrackSelectionAnalysis Empty { get; } = new(null, [], [], false);
}