no dupplicate recordings
Some checks failed
🏗️ Build Plugin / build (push) Failing after 28s
🧪 Test Plugin / test (push) Failing after 39s
🚀 Release Plugin / build-and-release (push) Failing after 38s

This commit is contained in:
Duncan Tourolle 2026-03-07 16:25:01 +01:00
parent fb539d6a32
commit 0a2d6a558c

View File

@ -34,6 +34,7 @@ public class RecordingService : IRecordingService, IDisposable
private readonly ConcurrentDictionary<string, Process> _activeProcesses = new();
private static readonly JsonSerializerOptions _jsonOptions = new() { WriteIndented = true };
private readonly SemaphoreSlim _persistLock = new(1, 1);
private readonly SemaphoreSlim _processLock = new(1, 1);
private List<RecordingEntry> _recordings = new();
private bool _loaded;
private bool _disposed;
@ -305,6 +306,25 @@ public class RecordingService : IRecordingService, IDisposable
/// <inheritdoc />
public async Task ProcessRecordingsAsync(CancellationToken cancellationToken)
{
// Prevent overlapping scheduler runs from spawning duplicate ffmpeg processes
if (!await _processLock.WaitAsync(0).ConfigureAwait(false))
{
_logger.LogDebug("ProcessRecordingsAsync already running, skipping");
return;
}
try
{
await ProcessRecordingsCoreAsync(cancellationToken).ConfigureAwait(false);
}
finally
{
_processLock.Release();
}
}
private async Task ProcessRecordingsCoreAsync(CancellationToken cancellationToken)
{
await LoadRecordingsAsync().ConfigureAwait(false);
@ -515,6 +535,7 @@ public class RecordingService : IRecordingService, IDisposable
}
_persistLock.Dispose();
_processLock.Dispose();
}
_disposed = true;