From 587fc3a98ffab2c0856a6cd970fb1c83e3356c4f Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sun, 22 Jan 2023 12:34:42 -0600 Subject: [PATCH] release memory after extracting embedded subtitles (#1128) --- .../ExtractEmbeddedSubtitlesHandler.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs b/ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs index e63a384da..94c99cdbf 100644 --- a/ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs +++ b/ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs @@ -1,8 +1,10 @@ using System.Security.Cryptography; using System.Text; +using System.Threading.Channels; using CliWrap; using CliWrap.Buffered; using CliWrap.Builders; +using ErsatzTV.Application.Maintenance; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Extensions; @@ -21,6 +23,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler _dbContextFactory; private readonly IEmbyPathReplacementService _embyPathReplacementService; + private readonly ChannelWriter _workerChannel; private readonly IJellyfinPathReplacementService _jellyfinPathReplacementService; private readonly ILocalFileSystem _localFileSystem; private readonly ILogger _logger; @@ -32,6 +35,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler workerChannel, ILogger logger) { _dbContextFactory = dbContextFactory; @@ -39,6 +43,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler validation = await FFmpegPathMustExist(dbContext); return await validation.Match( - ffmpegPath => ExtractAll(dbContext, request, ffmpegPath, cancellationToken), + async ffmpegPath => + { + Either result = await ExtractAll(dbContext, request, ffmpegPath, cancellationToken); + await _workerChannel.WriteAsync(new ReleaseMemory(false), cancellationToken); + return result; + }, error => Task.FromResult>(error.Join())); } @@ -68,6 +78,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler requestedPlayout = await dbContext.Playouts + .AsNoTracking() .Filter( p => p.Channel.SubtitleMode != ChannelSubtitleMode.None || p.ProgramSchedule.Items.Any(psi => psi.SubtitleMode != ChannelSubtitleMode.None)) @@ -79,6 +90,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler p.Channel.SubtitleMode != ChannelSubtitleMode.None || p.ProgramSchedule.Items.Any(psi => psi.SubtitleMode != ChannelSubtitleMode.None)) @@ -104,6 +116,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler playoutItems = await dbContext.PlayoutItems + .AsNoTracking() .Filter(pi => playoutIdsToCheck.Contains(pi.PlayoutId)) .Filter(pi => pi.Finish >= DateTime.UtcNow) .Filter(pi => pi.Start <= until) @@ -170,6 +183,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler episodeIds = await dbContext.EpisodeMetadata + .AsNoTracking() .Filter(em => mediaItemIds.Contains(em.EpisodeId)) .Filter( em => em.Subtitles.Any( @@ -180,6 +194,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler movieIds = await dbContext.MovieMetadata + .AsNoTracking() .Filter(mm => mediaItemIds.Contains(mm.MovieId)) .Filter( mm => mm.Subtitles.Any( @@ -190,6 +205,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler musicVideoIds = await dbContext.MusicVideoMetadata + .AsNoTracking() .Filter(mm => mediaItemIds.Contains(mm.MusicVideoId)) .Filter( mm => mm.Subtitles.Any( @@ -200,6 +216,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler otherVideoIds = await dbContext.OtherVideoMetadata + .AsNoTracking() .Filter(ovm => mediaItemIds.Contains(ovm.OtherVideoId)) .Filter( ovm => ovm.Subtitles.Any(