Compare commits

..

3 Commits

2 changed files with 139 additions and 132 deletions

View File

@ -630,7 +630,36 @@ public class DownloadHelper : IDownloadHelper
// break; // 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}"); Log.Debug($"Calling FFMPEG with Parameters: {parameters}");
@ -965,10 +994,20 @@ public class DownloadHelper : IDownloadHelper
private void OnError(object sender, ConversionErrorEventArgs e) 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 ?? "<none>";
var output = e?.Output?.Name ?? "<none>";
var exitCode = e?.Exception?.ExitCode.ToString() ?? "<unknown>";
var message = e?.Exception?.Message ?? "<no message>";
var inner = e?.Exception?.InnerException?.Message ?? "<no inner>";
Log.Error("FFmpeg failed. Input={Input} Output={Output} ExitCode={ExitCode} Message={Message} Inner={Inner}",
input, output, exitCode, message, inner);
_completionSource?.TrySetResult(false); _completionSource?.TrySetResult(false);
} }
#region drm posts #region drm posts
public async Task<bool> 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<string, long> users) public async Task<bool> 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<string, long> users)
{ {

View File

@ -131,6 +131,10 @@ public class Program
if (jsonConfig != null) if (jsonConfig != null)
{ {
var hoconConfig = new StringBuilder(); var hoconConfig = new StringBuilder();
hoconConfig.AppendLine("# Auth");
hoconConfig.AppendLine("Auth {");
hoconConfig.AppendLine($" DisableBrowserAuth = \"{jsonConfig.DisableBrowserAuth.ToString().ToLower()}\"");
hoconConfig.AppendLine("}");
hoconConfig.AppendLine("# External Tools"); hoconConfig.AppendLine("# External Tools");
hoconConfig.AppendLine("External {"); hoconConfig.AppendLine("External {");
hoconConfig.AppendLine($" FFmpegPath = \"{jsonConfig.FFmpegPath}\""); hoconConfig.AppendLine($" FFmpegPath = \"{jsonConfig.FFmpegPath}\"");
@ -255,7 +259,7 @@ public class Program
config = new Entities.Config config = new Entities.Config
{ {
//Auth //Auth
DisableBrowserAuth = hoconConfig.GetBoolean("DisableBrowserAuth"), DisableBrowserAuth = hoconConfig.GetBoolean("Auth.DisableBrowserAuth"),
// FFmpeg Settings // FFmpeg Settings
FFmpegPath = hoconConfig.GetString("External.FFmpegPath"), FFmpegPath = hoconConfig.GetString("External.FFmpegPath"),
@ -375,7 +379,9 @@ public class Program
Entities.Config jsonConfig = new Entities.Config(); Entities.Config jsonConfig = new Entities.Config();
var hoconConfig = new StringBuilder(); var hoconConfig = new StringBuilder();
hoconConfig.AppendLine("# Auth"); hoconConfig.AppendLine("# Auth");
hoconConfig.AppendLine($"DisableBrowserAuth = {jsonConfig.DisableBrowserAuth.ToString().ToLower()}"); hoconConfig.AppendLine("Auth {");
hoconConfig.AppendLine($" DisableBrowserAuth = \"{jsonConfig.DisableBrowserAuth.ToString().ToLower()}\"");
hoconConfig.AppendLine("}");
hoconConfig.AppendLine("# External Tools"); hoconConfig.AppendLine("# External Tools");
hoconConfig.AppendLine("External {"); hoconConfig.AppendLine("External {");
hoconConfig.AppendLine($" FFmpegPath = \"{jsonConfig.FFmpegPath}\""); hoconConfig.AppendLine($" FFmpegPath = \"{jsonConfig.FFmpegPath}\"");
@ -2698,10 +2704,7 @@ public class Program
{ {
totalSize = post.SinglePosts.Count; totalSize = post.SinglePosts.Count;
} }
bool isNew = false;
bool anyNew = false;
bool anyExisting = false;
bool anyFailed = false;
await AnsiConsole.Progress() await AnsiConsole.Progress()
.Columns(GetProgressColumns(downloadContext.DownloadConfig.ShowScrapeSize)) .Columns(GetProgressColumns(downloadContext.DownloadConfig.ShowScrapeSize))
.StartAsync(async ctx => .StartAsync(async ctx =>
@ -2741,7 +2744,7 @@ public class Program
SinglePost.Medium mediaInfo = post.SinglePostMedia.FirstOrDefault(m => m.id == postKVP.Key); SinglePost.Medium mediaInfo = post.SinglePostMedia.FirstOrDefault(m => m.id == postKVP.Key);
SinglePost postInfo = post.SinglePostObjects.FirstOrDefault(p => p?.media?.Contains(mediaInfo) == true); SinglePost postInfo = post.SinglePostObjects.FirstOrDefault(p => p?.media?.Contains(mediaInfo) == true);
bool downloaded = await downloadContext.DownloadHelper.DownloadPostDRMVideo( isNew = await downloadContext.DownloadHelper.DownloadPostDRMVideo(
policy: policy, policy: policy,
signature: signature, signature: signature,
kvp: kvp, kvp: kvp,
@ -2757,23 +2760,6 @@ public class Program
postMedia: mediaInfo, postMedia: mediaInfo,
author: postInfo?.author, author: postInfo?.author,
users: users); users: users);
if (downloaded)
{
anyNew = true;
}
else
{
bool recorded = await downloadContext.DBHelper.CheckDownloaded(path, postKVP.Key, "Posts");
if (recorded)
{
anyExisting = true;
}
else
{
anyFailed = true;
Log.Error("Failed to download DRM media {MediaId} for post {PostId}; not marked downloaded", postKVP.Key, post_id);
}
}
} }
else else
{ {
@ -2782,7 +2768,7 @@ public class Program
SinglePost.Medium? mediaInfo = post.SinglePostMedia.FirstOrDefault(m => (m?.id == postKVP.Key) == true); SinglePost.Medium? mediaInfo = post.SinglePostMedia.FirstOrDefault(m => (m?.id == postKVP.Key) == true);
SinglePost? postInfo = post.SinglePostObjects.FirstOrDefault(p => p?.media?.Contains(mediaInfo) == true); SinglePost? postInfo = post.SinglePostObjects.FirstOrDefault(p => p?.media?.Contains(mediaInfo) == true);
bool downloaded = await downloadContext.DownloadHelper.DownloadPostMedia( isNew = await downloadContext.DownloadHelper.DownloadPostMedia(
url: postKVP.Value, url: postKVP.Value,
folder: path, folder: path,
media_id: postKVP.Key, media_id: postKVP.Key,
@ -2793,23 +2779,6 @@ public class Program
postMedia: mediaInfo, postMedia: mediaInfo,
author: postInfo?.author, author: postInfo?.author,
users: users); users: users);
if (downloaded)
{
anyNew = true;
}
else
{
bool recorded = await downloadContext.DBHelper.CheckDownloaded(path, postKVP.Key, "Posts");
if (recorded)
{
anyExisting = true;
}
else
{
anyFailed = true;
Log.Error("Failed to download media {MediaId} for post {PostId}; not marked downloaded", postKVP.Key, post_id);
}
}
} }
catch catch
{ {
@ -2819,21 +2788,16 @@ public class Program
} }
task.StopTask(); task.StopTask();
}); });
if (anyNew) if (isNew)
{ {
AnsiConsole.Markup($"[red]Post {post_id} downloaded\n[/]"); AnsiConsole.Markup($"[red]Post {post_id} downloaded\n[/]");
Log.Debug($"Post {post_id} downloaded"); Log.Debug($"Post {post_id} downloaded");
} }
else if (anyExisting && !anyFailed) else
{ {
AnsiConsole.Markup($"[red]Post {post_id} already downloaded\n[/]"); AnsiConsole.Markup($"[red]Post {post_id} already downloaded\n[/]");
Log.Debug($"Post {post_id} already downloaded"); Log.Debug($"Post {post_id} already downloaded");
} }
else
{
AnsiConsole.Markup($"[red]Post {post_id} failed to download; no media marked as downloaded\n[/]");
Log.Error("Post {PostId} failed to download; no media marked as downloaded", post_id);
}
} }
public static async Task<(bool IsExit, Dictionary<string, long>? selectedUsers, Entities.Config? updatedConfig)> HandleUserSelection(APIHelper apiHelper, Entities.Config currentConfig, Dictionary<string, long> users, Dictionary<string, long> lists) public static async Task<(bool IsExit, Dictionary<string, long>? selectedUsers, Entities.Config? updatedConfig)> HandleUserSelection(APIHelper apiHelper, Entities.Config currentConfig, Dictionary<string, long> users, Dictionary<string, long> lists)
@ -2992,7 +2956,9 @@ public class Program
var hoconConfig = new StringBuilder(); var hoconConfig = new StringBuilder();
hoconConfig.AppendLine("# Auth"); hoconConfig.AppendLine("# Auth");
hoconConfig.AppendLine($"DisableBrowserAuth = {newConfig.DisableBrowserAuth.ToString().ToLower()}"); hoconConfig.AppendLine("Auth {");
hoconConfig.AppendLine($" DisableBrowserAuth = \"{newConfig.DisableBrowserAuth.ToString().ToLower()}\"");
hoconConfig.AppendLine("}");
hoconConfig.AppendLine("# External Tools"); hoconConfig.AppendLine("# External Tools");
hoconConfig.AppendLine("External {"); hoconConfig.AppendLine("External {");
hoconConfig.AppendLine($" FFmpegPath = \"{newConfig.FFmpegPath}\""); hoconConfig.AppendLine($" FFmpegPath = \"{newConfig.FFmpegPath}\"");
@ -3152,7 +3118,9 @@ public class Program
var hoconConfig = new StringBuilder(); var hoconConfig = new StringBuilder();
hoconConfig.AppendLine("# Auth"); hoconConfig.AppendLine("# Auth");
hoconConfig.AppendLine($"DisableBrowserAuth = {newConfig.DisableBrowserAuth.ToString().ToLower()}"); hoconConfig.AppendLine("Auth {");
hoconConfig.AppendLine($" DisableBrowserAuth = \"{newConfig.DisableBrowserAuth.ToString().ToLower()}\"");
hoconConfig.AppendLine("}");
hoconConfig.AppendLine("# External Tools"); hoconConfig.AppendLine("# External Tools");
hoconConfig.AppendLine("External {"); hoconConfig.AppendLine("External {");
hoconConfig.AppendLine($" FFmpegPath = \"{newConfig.FFmpegPath}\""); hoconConfig.AppendLine($" FFmpegPath = \"{newConfig.FFmpegPath}\"");