From 0eae46636864af0e345a0305e3503b956e2f2944 Mon Sep 17 00:00:00 2001 From: Melithine Date: Sat, 13 Dec 2025 18:48:30 -0800 Subject: [PATCH] Add additional logging for ffmpeg and prevent NRE errors from obscuring the actual errors from ffmpeg. --- OF DL/Helpers/DownloadHelper.cs | 43 +++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/OF DL/Helpers/DownloadHelper.cs b/OF DL/Helpers/DownloadHelper.cs index e936b77..77460bf 100644 --- a/OF DL/Helpers/DownloadHelper.cs +++ b/OF DL/Helpers/DownloadHelper.cs @@ -630,7 +630,36 @@ public class DownloadHelper : IDownloadHelper // break; //} - string parameters = $"-cenc_decryption_key {decKey} -headers \"Cookie:CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}; {sess} Origin: https://onlyfans.com Referer: https://onlyfans.com User-Agent: {user_agent}\" -y -i \"{url}\" -map 0:v:{streamIndex} -map 0:a? -codec copy \"{tempFilename}\""; + // Configure ffmpeg log level and optional report file location + bool ffmpegDebugLogging = Log.IsEnabled(Serilog.Events.LogEventLevel.Debug); + + string logLevelArgs = ffmpegDebugLogging || downloadConfig.LoggingLevel is LoggingLevel.Verbose or LoggingLevel.Debug + ? "-loglevel debug -report" + : downloadConfig.LoggingLevel switch + { + LoggingLevel.Information => "-loglevel info", + LoggingLevel.Warning => "-loglevel warning", + LoggingLevel.Error => "-loglevel error", + LoggingLevel.Fatal => "-loglevel fatal", + _ => string.Empty + }; + + if (logLevelArgs.Contains("-report", StringComparison.OrdinalIgnoreCase)) + { + // Direct ffmpeg report files into the same logs directory Serilog uses (relative to current working directory) + string logDir = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, "logs")); + Directory.CreateDirectory(logDir); + string ffReportPath = Path.Combine(logDir, "ffmpeg-%p-%t.log"); // ffmpeg will replace %p/%t + Environment.SetEnvironmentVariable("FFREPORT", $"file={ffReportPath}:level=32"); + Log.Debug("FFREPORT enabled at: {FFREPORT} (cwd: {Cwd})", Environment.GetEnvironmentVariable("FFREPORT"), Environment.CurrentDirectory); + } + else + { + Environment.SetEnvironmentVariable("FFREPORT", null); + Log.Debug("FFREPORT disabled (cwd: {Cwd})", Environment.CurrentDirectory); + } + + string parameters = $"{logLevelArgs} -cenc_decryption_key {decKey} -headers \"Cookie:CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}; {sess} Origin: https://onlyfans.com Referer: https://onlyfans.com User-Agent: {user_agent}\" -y -i \"{url}\" -map 0:v:{streamIndex} -map 0:a? -codec copy \"{tempFilename}\"".Trim(); Log.Debug($"Calling FFMPEG with Parameters: {parameters}"); @@ -965,10 +994,20 @@ public class DownloadHelper : IDownloadHelper private void OnError(object sender, ConversionErrorEventArgs e) { - Log.Debug("[{0} => {1}]: Error: {2}\n{3}", e.Input.Name, e.Output.Name, e.Exception.ExitCode, e.Exception.InnerException); + // Guard all fields to avoid NullReference exceptions from FFmpeg.NET + var input = e?.Input?.Name ?? ""; + var output = e?.Output?.Name ?? ""; + var exitCode = e?.Exception?.ExitCode.ToString() ?? ""; + var message = e?.Exception?.Message ?? ""; + var inner = e?.Exception?.InnerException?.Message ?? ""; + + Log.Error("FFmpeg failed. Input={Input} Output={Output} ExitCode={ExitCode} Message={Message} Inner={Inner}", + input, output, exitCode, message, inner); + _completionSource?.TrySetResult(false); } + #region drm posts public async Task DownloadMessageDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, ProgressTask task, string? filenameFormat, Messages.List? messageInfo, Messages.Medium? messageMedia, Messages.FromUser? fromUser, Dictionary users) { -- 2.43.0