From d88cfa2cd3baa4bd1c6913dcbc3930f591eae5b1 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Wed, 9 Jul 2025 20:06:59 -0400 Subject: [PATCH] Fixes to video thumb generation --- AobaCore/Services/ThumbnailService.cs | 42 +++++++++++++++++---------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/AobaCore/Services/ThumbnailService.cs b/AobaCore/Services/ThumbnailService.cs index 8c473cd..4102c87 100644 --- a/AobaCore/Services/ThumbnailService.cs +++ b/AobaCore/Services/ThumbnailService.cs @@ -121,29 +121,39 @@ public class ThumbnailService(IMongoDatabase db, AobaService aobaService) public Maybe GenerateVideoThumbnail(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default) { var w = (int)size; - var source = new MemoryStream(); + var fn = ObjectId.GenerateNewId().ToString(); + var filePath = $"/tmp/{fn}.in"; + using var source = new FileStream(filePath, FileMode.CreateNew); data.CopyTo(source); - source.Position = 0; - var output = new MemoryStream(); - FFMpegArguments.FromPipeInput(new StreamPipeSource(source), opt => + source.Flush(); + source.Dispose(); + data.Dispose(); + try { - opt.WithCustomArgument("-t 5"); - }).OutputToPipe(new StreamPipeSink(output), opt => + var output = new MemoryStream(); + FFMpegArguments.FromFileInput(filePath, false, opt => + { + opt.WithCustomArgument("-t 5"); + }).OutputToPipe(new StreamPipeSink(output), opt => + { + opt.WithCustomArgument($"-vf \"crop='min(in_w,in_h)':'min(in_w,in_h)',scale={w}:{w}\" -loop 0 -r 15") + .ForceFormat("webp"); + }).ProcessSynchronously(); + output.Position = 0; + return output; + } + catch(Exception ex) { - opt.WithCustomArgument($"-vf \"crop='min(in_w,in_h)':'min(in_w,in_h)',scale={w}:{w}\" -loop 0 -r 15") - .ForceFormat("webp"); - }).Configure(cfg => + return ex; + } + finally { -#if !DEBUG - cfg.BinaryFolder = "/usr/bin"; -#endif - }).ProcessSynchronously(); - output.Position = 0; - return output; + File.Delete(filePath); + } } public async Task> GenerateDocumentThumbnailAsync(Stream data, ThumbnailSize size, CancellationToken cancellationToken = default) { return new NotImplementedException(); } -} \ No newline at end of file +}