Reduce duplicated code and simplify download media methods

This commit is contained in:
whimsical-c4lic0 2026-02-09 04:34:38 -06:00
parent a8b2acaad6
commit 44a9fb1fcd
3 changed files with 480 additions and 2239 deletions

View File

@ -1491,102 +1491,50 @@ public class Program(IServiceProvider serviceProvider)
foreach (KeyValuePair<long, string> purchasedPostKVP in purchasedPosts.PaidPosts) foreach (KeyValuePair<long, string> purchasedPostKVP in purchasedPosts.PaidPosts)
{ {
bool isNew; bool isNew;
MessageEntities.Medium? mediaInfo =
purchasedPosts?.PaidPostMedia?.FirstOrDefault(m => m.Id == purchasedPostKVP.Key);
PurchasedEntities.ListItem? postInfo = mediaInfo != null
? purchasedPosts?.PaidPostObjects?.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == purchasedPostKVP.Key) == true)
: null;
string filenameFormat = configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidPostFileNameFormat ?? "";
string paidPostPath = configService.CurrentConfig.FolderPerPaidPost && postInfo != null &&
postInfo?.Id is not null && postInfo?.PostedAt is not null
? $"/Posts/Paid/{postInfo.Id} {postInfo.PostedAt.Value:yyyy-MM-dd HH-mm-ss}"
: "/Posts/Paid";
if (purchasedPostKVP.Value.Contains("cdn3.onlyfans.com/dash/files")) if (purchasedPostKVP.Value.Contains("cdn3.onlyfans.com/dash/files"))
{ {
string[] messageUrlParsed = purchasedPostKVP.Value.Split(','); string[] parsed = purchasedPostKVP.Value.Split(',');
string mpdURL = messageUrlParsed[0]; (string decryptionKey, DateTime lastModified)? drmInfo =
string policy = messageUrlParsed[1]; await downloadService.GetDecryptionInfo(parsed[0], parsed[1], parsed[2], parsed[3],
string signature = messageUrlParsed[2]; parsed[4], parsed[5], "post", clientIdBlobMissing, devicePrivateKeyMissing);
string kvp = messageUrlParsed[3]; if (drmInfo == null)
string mediaId = messageUrlParsed[4];
string postId = messageUrlParsed[5];
string? licenseURL = null;
string? pssh = await apiService.GetDRMMPDPSSH(mpdURL, policy, signature, kvp);
if (pssh == null)
{ {
continue; continue;
} }
DateTime lastModified = await apiService.GetDRMMPDLastModified(mpdURL, policy, signature, kvp); isNew = await downloadService.DownloadDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0],
Dictionary<string, string> drmHeaders = drmInfo.Value.decryptionKey, path, drmInfo.Value.lastModified, purchasedPostKVP.Key,
apiService.GetDynamicHeaders($"/api2/v2/users/media/{mediaId}/drm/post/{postId}",
"?type=widevine");
string decryptionKey;
if (clientIdBlobMissing || devicePrivateKeyMissing)
{
decryptionKey = await apiService.GetDecryptionKeyOFDL(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/post/{postId}?type=widevine",
pssh);
}
else
{
decryptionKey = await apiService.GetDecryptionKeyCDM(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/post/{postId}?type=widevine",
pssh);
}
MessageEntities.Medium? mediaInfo =
purchasedPosts?.PaidPostMedia?.FirstOrDefault(m => m.Id == purchasedPostKVP.Key);
PurchasedEntities.ListItem? postInfo = mediaInfo != null
? purchasedPosts?.PaidPostObjects?.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == purchasedPostKVP.Key) == true)
: null;
isNew = await downloadService.DownloadPurchasedPostDRMVideo(
policy,
signature,
kvp,
mpdURL,
decryptionKey,
path,
lastModified,
purchasedPostKVP.Key,
"Posts", "Posts",
new SpectreProgressReporter(task), new SpectreProgressReporter(task), paidPostPath + "/Videos", filenameFormat,
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username) postInfo, mediaInfo, postInfo?.FromUser, users);
.PaidPostFileNameFormat ?? "",
postInfo,
mediaInfo,
postInfo?.FromUser,
users);
if (isNew)
{
newPaidPostCount++;
}
else
{
oldPaidPostCount++;
}
} }
else else
{ {
MessageEntities.Medium? mediaInfo = isNew = await downloadService.DownloadMedia(purchasedPostKVP.Value, path,
purchasedPosts?.PaidPostMedia?.FirstOrDefault(m => m.Id == purchasedPostKVP.Key); purchasedPostKVP.Key, "Posts", new SpectreProgressReporter(task),
PurchasedEntities.ListItem? postInfo = mediaInfo != null paidPostPath, filenameFormat, postInfo, mediaInfo, postInfo?.FromUser, users);
? purchasedPosts?.PaidPostObjects?.FirstOrDefault(p => }
p?.Media?.Any(m => m.Id == purchasedPostKVP.Key) == true)
: null;
isNew = await downloadService.DownloadPurchasedPostMedia( if (isNew)
purchasedPostKVP.Value, {
path, newPaidPostCount++;
purchasedPostKVP.Key, }
"Posts", else
new SpectreProgressReporter(task), {
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username) oldPaidPostCount++;
.PaidPostFileNameFormat ?? "",
postInfo,
mediaInfo,
postInfo?.FromUser,
users);
if (isNew)
{
newPaidPostCount++;
}
else
{
oldPaidPostCount++;
}
} }
} }
@ -1643,101 +1591,49 @@ public class Program(IServiceProvider serviceProvider)
foreach (KeyValuePair<long, string> paidMessageKVP in paidMessageCollection.PaidMessages) foreach (KeyValuePair<long, string> paidMessageKVP in paidMessageCollection.PaidMessages)
{ {
bool isNew; bool isNew;
MessageEntities.Medium? mediaInfo =
paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == paidMessageKVP.Key);
PurchasedEntities.ListItem? messageInfo =
paidMessageCollection.PaidMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
string filenameFormat = configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "";
string paidMsgPath = configService.CurrentConfig.FolderPerPaidMessage && messageInfo != null &&
messageInfo?.Id is not null && messageInfo?.CreatedAt is not null
? $"/Messages/Paid/{messageInfo.Id} {messageInfo.CreatedAt.Value:yyyy-MM-dd HH-mm-ss}"
: "/Messages/Paid";
if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files")) if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files"))
{ {
string[] messageUrlParsed = paidMessageKVP.Value.Split(','); string[] parsed = paidMessageKVP.Value.Split(',');
string mpdURL = messageUrlParsed[0]; (string decryptionKey, DateTime lastModified)? drmInfo =
string policy = messageUrlParsed[1]; await downloadService.GetDecryptionInfo(parsed[0], parsed[1], parsed[2], parsed[3],
string signature = messageUrlParsed[2]; parsed[4], parsed[5], "message", clientIdBlobMissing, devicePrivateKeyMissing);
string kvp = messageUrlParsed[3]; if (drmInfo == null)
string mediaId = messageUrlParsed[4];
string messageId = messageUrlParsed[5];
string? licenseURL = null;
string? pssh = await apiService.GetDRMMPDPSSH(mpdURL, policy, signature, kvp);
if (pssh != null)
{ {
DateTime lastModified = continue;
await apiService.GetDRMMPDLastModified(mpdURL, policy, signature, kvp);
Dictionary<string, string> drmHeaders =
apiService.GetDynamicHeaders(
$"/api2/v2/users/media/{mediaId}/drm/message/{messageId}", "?type=widevine");
string decryptionKey;
if (clientIdBlobMissing || devicePrivateKeyMissing)
{
decryptionKey = await apiService.GetDecryptionKeyOFDL(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
else
{
decryptionKey = await apiService.GetDecryptionKeyCDM(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
MessageEntities.Medium? mediaInfo =
paidMessageCollection.PaidMessageMedia.FirstOrDefault(m =>
m.Id == paidMessageKVP.Key);
PurchasedEntities.ListItem? messageInfo =
paidMessageCollection.PaidMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadPurchasedMessageDRMVideo(
policy,
signature,
kvp,
mpdURL,
decryptionKey,
path,
lastModified,
paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
users);
if (isNew)
{
newPaidMessagesCount++;
}
else
{
oldPaidMessagesCount++;
}
} }
isNew = await downloadService.DownloadDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0],
drmInfo.Value.decryptionKey, path, drmInfo.Value.lastModified, paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task), paidMsgPath + "/Videos", filenameFormat,
messageInfo, mediaInfo, messageInfo?.FromUser, users);
} }
else else
{ {
MessageEntities.Medium? mediaInfo = isNew = await downloadService.DownloadMedia(paidMessageKVP.Value, path,
paidMessageCollection.PaidMessageMedia.FirstOrDefault(m => m.Id == paidMessageKVP.Key); paidMessageKVP.Key, "Messages", new SpectreProgressReporter(task),
PurchasedEntities.ListItem messageInfo = paidMsgPath, filenameFormat, messageInfo, mediaInfo, messageInfo?.FromUser, users);
paidMessageCollection.PaidMessageObjects.FirstOrDefault(p => }
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadPurchasedMedia( if (isNew)
paidMessageKVP.Value, {
path, newPaidMessagesCount++;
paidMessageKVP.Key, }
"Messages", else
new SpectreProgressReporter(task), {
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username) oldPaidMessagesCount++;
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
users);
if (isNew)
{
newPaidMessagesCount++;
}
else
{
oldPaidMessagesCount++;
}
} }
} }
@ -1826,6 +1722,9 @@ public class Program(IServiceProvider serviceProvider)
IAPIService apiService = serviceProvider.GetRequiredService<IAPIService>(); IAPIService apiService = serviceProvider.GetRequiredService<IAPIService>();
IDownloadService downloadService = serviceProvider.GetRequiredService<IDownloadService>(); IDownloadService downloadService = serviceProvider.GetRequiredService<IDownloadService>();
string filenameFormat = configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "";
Log.Debug($"Calling DownloadPaidMessage - {username}"); Log.Debug($"Calling DownloadPaidMessage - {username}");
AnsiConsole.Markup("[red]Getting Paid Message\n[/]"); AnsiConsole.Markup("[red]Getting Paid Message\n[/]");
@ -1870,102 +1769,50 @@ public class Program(IServiceProvider serviceProvider)
.PreviewSingleMessages) .PreviewSingleMessages)
{ {
bool isNew; bool isNew;
MessageEntities.Medium? mediaInfo =
singlePaidMessageCollection.PreviewSingleMessageMedia.FirstOrDefault(m =>
m.Id == paidMessageKVP.Key);
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
string previewMsgPath = configService.CurrentConfig.FolderPerMessage && messageInfo != null &&
messageInfo?.Id is not null && messageInfo?.CreatedAt is not null
? $"/Messages/Free/{messageInfo.Id} {messageInfo.CreatedAt.Value:yyyy-MM-dd HH-mm-ss}"
: "/Messages/Free";
if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files")) if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files"))
{ {
string[] messageUrlParsed = paidMessageKVP.Value.Split(','); string[] parsed = paidMessageKVP.Value.Split(',');
string mpdURL = messageUrlParsed[0]; (string decryptionKey, DateTime lastModified)? drmInfo =
string policy = messageUrlParsed[1]; await downloadService.GetDecryptionInfo(parsed[0], parsed[1], parsed[2], parsed[3],
string signature = messageUrlParsed[2]; parsed[4], parsed[5], "message", clientIdBlobMissing, devicePrivateKeyMissing);
string kvp = messageUrlParsed[3]; if (drmInfo == null)
string mediaId = messageUrlParsed[4];
string messageId = messageUrlParsed[5];
string? licenseURL = null;
string? pssh = await apiService.GetDRMMPDPSSH(mpdURL, policy, signature, kvp);
if (pssh != null)
{ {
DateTime lastModified = continue;
await apiService.GetDRMMPDLastModified(mpdURL, policy, signature, kvp);
Dictionary<string, string> drmHeaders =
apiService.GetDynamicHeaders(
$"/api2/v2/users/media/{mediaId}/drm/message/{messageId}", "?type=widevine");
string decryptionKey;
if (clientIdBlobMissing || devicePrivateKeyMissing)
{
decryptionKey = await apiService.GetDecryptionKeyOFDL(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
else
{
decryptionKey = await apiService.GetDecryptionKeyCDM(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
MessageEntities.Medium? mediaInfo =
singlePaidMessageCollection.PreviewSingleMessageMedia.FirstOrDefault(m =>
m.Id == paidMessageKVP.Key);
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadSingleMessagePreviewDRMVideo(
policy,
signature,
kvp,
mpdURL,
decryptionKey,
path,
lastModified,
paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
hasSelectedUsersKVP.Value);
if (isNew)
{
newPreviewPaidMessagesCount++;
}
else
{
oldPreviewPaidMessagesCount++;
}
} }
isNew = await downloadService.DownloadDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0],
drmInfo.Value.decryptionKey, path, drmInfo.Value.lastModified, paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task), previewMsgPath + "/Videos", filenameFormat,
messageInfo, mediaInfo, messageInfo?.FromUser, hasSelectedUsersKVP.Value);
} }
else else
{ {
MessageEntities.Medium? mediaInfo = isNew = await downloadService.DownloadMedia(paidMessageKVP.Value, path,
singlePaidMessageCollection.PreviewSingleMessageMedia.FirstOrDefault(m => paidMessageKVP.Key, "Messages", new SpectreProgressReporter(task),
m.Id == paidMessageKVP.Key); previewMsgPath, filenameFormat, messageInfo, mediaInfo, messageInfo?.FromUser,
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadMessagePreviewMedia(
paidMessageKVP.Value,
path,
paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
hasSelectedUsersKVP.Value); hasSelectedUsersKVP.Value);
if (isNew) }
{
newPreviewPaidMessagesCount++; if (isNew)
} {
else newPreviewPaidMessagesCount++;
{ }
oldPreviewPaidMessagesCount++; else
} {
oldPreviewPaidMessagesCount++;
} }
} }
@ -2010,93 +1857,42 @@ public class Program(IServiceProvider serviceProvider)
foreach (KeyValuePair<long, string> paidMessageKVP in singlePaidMessageCollection.SingleMessages) foreach (KeyValuePair<long, string> paidMessageKVP in singlePaidMessageCollection.SingleMessages)
{ {
bool isNew; bool isNew;
MessageEntities.Medium? mediaInfo =
singlePaidMessageCollection.SingleMessageMedia.FirstOrDefault(m =>
m.Id == paidMessageKVP.Key);
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
string filenameFormat = configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "";
string singlePaidMsgPath = configService.CurrentConfig.FolderPerPaidMessage &&
messageInfo != null && messageInfo?.Id is not null &&
messageInfo?.CreatedAt is not null
? $"/Messages/Paid/{messageInfo.Id} {messageInfo.CreatedAt.Value:yyyy-MM-dd HH-mm-ss}"
: "/Messages/Paid";
if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files")) if (paidMessageKVP.Value.Contains("cdn3.onlyfans.com/dash/files"))
{ {
string[] messageUrlParsed = paidMessageKVP.Value.Split(','); string[] parsed = paidMessageKVP.Value.Split(',');
string mpdURL = messageUrlParsed[0]; (string decryptionKey, DateTime lastModified)? drmInfo =
string policy = messageUrlParsed[1]; await downloadService.GetDecryptionInfo(parsed[0], parsed[1], parsed[2], parsed[3],
string signature = messageUrlParsed[2]; parsed[4], parsed[5], "message", clientIdBlobMissing, devicePrivateKeyMissing);
string kvp = messageUrlParsed[3]; if (drmInfo == null)
string mediaId = messageUrlParsed[4];
string messageId = messageUrlParsed[5];
string? licenseURL = null;
string? pssh = await apiService.GetDRMMPDPSSH(mpdURL, policy, signature, kvp);
if (pssh != null)
{ {
DateTime lastModified = continue;
await apiService.GetDRMMPDLastModified(mpdURL, policy, signature, kvp);
Dictionary<string, string> drmHeaders =
apiService.GetDynamicHeaders(
$"/api2/v2/users/media/{mediaId}/drm/message/{messageId}", "?type=widevine");
string decryptionKey;
if (clientIdBlobMissing || devicePrivateKeyMissing)
{
decryptionKey = await apiService.GetDecryptionKeyOFDL(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
else
{
decryptionKey = await apiService.GetDecryptionKeyCDM(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/message/{messageId}?type=widevine",
pssh);
}
MessageEntities.Medium? mediaInfo =
singlePaidMessageCollection.SingleMessageMedia.FirstOrDefault(m =>
m.Id == paidMessageKVP.Key);
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadSinglePurchasedMessageDRMVideo(
policy,
signature,
kvp,
mpdURL,
decryptionKey,
path,
lastModified,
paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
hasSelectedUsersKVP.Value);
if (isNew)
{
newPaidMessagesCount++;
}
else
{
oldPaidMessagesCount++;
}
} }
isNew = await downloadService.DownloadDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0],
drmInfo.Value.decryptionKey, path, drmInfo.Value.lastModified, paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task), singlePaidMsgPath + "/Videos", filenameFormat,
messageInfo, mediaInfo, messageInfo?.FromUser, hasSelectedUsersKVP.Value);
} }
else else
{ {
MessageEntities.Medium? mediaInfo = isNew = await downloadService.DownloadMedia(paidMessageKVP.Value, path,
singlePaidMessageCollection.SingleMessageMedia.FirstOrDefault(m => paidMessageKVP.Key, "Messages", new SpectreProgressReporter(task),
m.Id == paidMessageKVP.Key); singlePaidMsgPath, filenameFormat, messageInfo, mediaInfo, messageInfo?.FromUser,
MessageEntities.SingleMessage? messageInfo =
singlePaidMessageCollection.SingleMessageObjects.FirstOrDefault(p =>
p?.Media?.Any(m => m.Id == paidMessageKVP.Key) == true);
isNew = await downloadService.DownloadSinglePurchasedMedia(
paidMessageKVP.Value,
path,
paidMessageKVP.Key,
"Messages",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PaidMessageFileNameFormat ?? "",
messageInfo,
mediaInfo,
messageInfo?.FromUser,
hasSelectedUsersKVP.Value); hasSelectedUsersKVP.Value);
if (isNew) if (isNew)
{ {
@ -2162,83 +1958,39 @@ public class Program(IServiceProvider serviceProvider)
task.StartTask(); task.StartTask();
foreach (KeyValuePair<long, string> postKVP in post.SinglePosts) foreach (KeyValuePair<long, string> postKVP in post.SinglePosts)
{ {
PostEntities.Medium? mediaInfo = post.SinglePostMedia.FirstOrDefault(m => m.Id == postKVP.Key);
PostEntities.SinglePost? postInfo =
post.SinglePostObjects.FirstOrDefault(p => p?.Media?.Contains(mediaInfo) == true);
string filenameFormat = configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PostFileNameFormat ?? "";
string postPath = configService.CurrentConfig.FolderPerPost && postInfo != null &&
postInfo?.Id is not null && postInfo?.PostedAt is not null
? $"/Posts/Free/{postInfo.Id} {postInfo.PostedAt:yyyy-MM-dd HH-mm-ss}"
: "/Posts/Free";
if (postKVP.Value.Contains("cdn3.onlyfans.com/dash/files")) if (postKVP.Value.Contains("cdn3.onlyfans.com/dash/files"))
{ {
string[] messageUrlParsed = postKVP.Value.Split(','); string[] parsed = postKVP.Value.Split(',');
string mpdURL = messageUrlParsed[0]; (string decryptionKey, DateTime lastModified)? drmInfo =
string policy = messageUrlParsed[1]; await downloadService.GetDecryptionInfo(parsed[0], parsed[1], parsed[2], parsed[3],
string signature = messageUrlParsed[2]; parsed[4], parsed[5], "post", clientIdBlobMissing, devicePrivateKeyMissing);
string kvp = messageUrlParsed[3]; if (drmInfo == null)
string mediaId = messageUrlParsed[4];
string postId = messageUrlParsed[5];
string? licenseURL = null;
string? pssh = await apiService.GetDRMMPDPSSH(mpdURL, policy, signature, kvp);
if (pssh == null)
{ {
continue; continue;
} }
DateTime lastModified = await apiService.GetDRMMPDLastModified(mpdURL, policy, signature, kvp); isNew = await downloadService.DownloadDRMVideo(parsed[1], parsed[2], parsed[3], parsed[0],
Dictionary<string, string> drmHeaders = drmInfo.Value.decryptionKey, path, drmInfo.Value.lastModified, postKVP.Key, "Posts",
apiService.GetDynamicHeaders($"/api2/v2/users/media/{mediaId}/drm/post/{postId}", new SpectreProgressReporter(task), postPath + "/Videos", filenameFormat,
"?type=widevine"); postInfo, mediaInfo, postInfo?.Author, users);
string decryptionKey;
if (clientIdBlobMissing || devicePrivateKeyMissing)
{
decryptionKey = await apiService.GetDecryptionKeyOFDL(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/post/{postId}?type=widevine",
pssh);
}
else
{
decryptionKey = await apiService.GetDecryptionKeyCDM(drmHeaders,
$"https://onlyfans.com/api2/v2/users/media/{mediaId}/drm/post/{postId}?type=widevine",
pssh);
}
PostEntities.Medium mediaInfo = post.SinglePostMedia.FirstOrDefault(m => m.Id == postKVP.Key);
PostEntities.SinglePost postInfo =
post.SinglePostObjects.FirstOrDefault(p => p?.Media?.Contains(mediaInfo) == true);
isNew = await downloadService.DownloadPostDRMVideo(
policy,
signature,
kvp,
mpdURL,
decryptionKey,
path,
lastModified,
postKVP.Key,
"Posts",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username).PostFileNameFormat ??
"",
postInfo,
mediaInfo,
postInfo?.Author,
users);
} }
else else
{ {
try try
{ {
PostEntities.Medium? mediaInfo = isNew = await downloadService.DownloadMedia(postKVP.Value, path,
post.SinglePostMedia.FirstOrDefault(m => m.Id == postKVP.Key); postKVP.Key, "Posts", new SpectreProgressReporter(task),
PostEntities.SinglePost? postInfo = postPath, filenameFormat, postInfo, mediaInfo, postInfo?.Author, users);
post.SinglePostObjects.FirstOrDefault(p => p?.Media?.Contains(mediaInfo) == true);
isNew = await downloadService.DownloadPostMedia(
postKVP.Value,
path,
postKVP.Key,
"Posts",
new SpectreProgressReporter(task),
configService.CurrentConfig.GetCreatorFileNameFormatConfig(username)
.PostFileNameFormat ?? "",
postInfo,
mediaInfo,
postInfo?.Author,
users);
} }
catch catch
{ {

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,5 @@
using OF_DL.Models; using OF_DL.Models;
using ArchivedEntities = OF_DL.Models.Entities.Archived; using ArchivedEntities = OF_DL.Models.Entities.Archived;
using CommonEntities = OF_DL.Models.Entities.Common;
using MessageEntities = OF_DL.Models.Entities.Messages; using MessageEntities = OF_DL.Models.Entities.Messages;
using PostEntities = OF_DL.Models.Entities.Posts; using PostEntities = OF_DL.Models.Entities.Posts;
using PurchasedEntities = OF_DL.Models.Entities.Purchased; using PurchasedEntities = OF_DL.Models.Entities.Purchased;
@ -15,105 +14,24 @@ public interface IDownloadService
Task<bool> ProcessMediaDownload(string folder, long media_id, string api_type, string url, string path, Task<bool> ProcessMediaDownload(string folder, long media_id, string api_type, string url, string path,
string serverFileName, string resolvedFileName, string extension, IProgressReporter progressReporter); string serverFileName, string resolvedFileName, string extension, IProgressReporter progressReporter);
Task<bool> DownloadArchivedMedia(string url, string folder, long media_id, string api_type, Task<bool> DownloadMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, ArchivedEntities.ListItem? messageInfo, IProgressReporter progressReporter, string path,
ArchivedEntities.Medium? messageMedia, CommonEntities.Author? author, string? filenameFormat, object? postInfo, object? postMedia,
Dictionary<string, long> users); object? author, Dictionary<string, long> users);
Task<bool> DownloadArchivedPostDRMVideo(string policy, string signature, string kvp, string url, Task<bool> DownloadDRMVideo(string policy, string signature, string kvp, string url,
string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type, string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, ArchivedEntities.ListItem? postInfo, IProgressReporter progressReporter, string path,
ArchivedEntities.Medium? postMedia, string? filenameFormat, object? postInfo, object? postMedia,
CommonEntities.Author? author, Dictionary<string, long> users); object? author, Dictionary<string, long> users);
Task<bool> DownloadPostDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey, Task<(string decryptionKey, DateTime lastModified)?> GetDecryptionInfo(
string folder, DateTime lastModified, long media_id, string api_type, IProgressReporter progressReporter, string mpdURL, string policy, string signature, string kvp,
string filenameFormat, PostEntities.SinglePost postInfo, PostEntities.Medium postMedia, string mediaId, string contentId, string drmType,
CommonEntities.Author author, bool clientIdBlobMissing, bool devicePrivateKeyMissing);
Dictionary<string, long> users);
Task<bool> DownloadPostDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey,
string folder, DateTime lastModified, long media_id, string api_type, IProgressReporter progressReporter,
string? filenameFormat, PostEntities.ListItem? postInfo, PostEntities.Medium? postMedia,
CommonEntities.Author? author,
Dictionary<string, long> users);
Task DownloadAvatarHeader(string? avatarUrl, string? headerUrl, string folder, string username); Task DownloadAvatarHeader(string? avatarUrl, string? headerUrl, string folder, string username);
Task<bool> DownloadMessageDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey,
string folder, DateTime lastModified, long media_id, string api_type, IProgressReporter progressReporter,
string? filenameFormat, MessageEntities.ListItem? messageInfo, MessageEntities.Medium? messageMedia,
CommonEntities.FromUser? fromUser,
Dictionary<string, long> users);
Task<bool> DownloadMessageMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, MessageEntities.ListItem? messageInfo,
MessageEntities.Medium? messageMedia, CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadPostMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PostEntities.ListItem? postInfo,
PostEntities.Medium? postMedia,
CommonEntities.Author? author, Dictionary<string, long> users);
Task<bool> DownloadPostMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PostEntities.SinglePost? postInfo,
PostEntities.Medium? postMedia,
CommonEntities.Author? author, Dictionary<string, long> users);
Task<bool> DownloadPurchasedMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo,
MessageEntities.Medium? messageMedia,
CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadSinglePurchasedMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, MessageEntities.SingleMessage? messageInfo,
MessageEntities.Medium? messageMedia, CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadPurchasedMessageDRMVideo(string policy, string signature, string kvp, string url,
string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo,
MessageEntities.Medium? messageMedia,
CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadSinglePurchasedMessageDRMVideo(string policy, string signature, string kvp, string url,
string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, MessageEntities.SingleMessage? messageInfo,
MessageEntities.Medium? messageMedia, CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadPurchasedPostDRMVideo(string policy, string signature, string kvp, string url,
string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? postInfo,
MessageEntities.Medium? postMedia,
CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadPurchasedPostMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, PurchasedEntities.ListItem? messageInfo,
MessageEntities.Medium? messageMedia,
CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadStoryMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter);
Task<bool> DownloadStreamMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, StreamEntities.ListItem? streamInfo,
StreamEntities.Medium? streamMedia, CommonEntities.Author? author,
Dictionary<string, long> users);
Task<bool> DownloadStreamsDRMVideo(string policy, string signature, string kvp, string url, string decryptionKey,
string folder, DateTime lastModified, long media_id, string api_type, IProgressReporter progressReporter,
string? filenameFormat, StreamEntities.ListItem? streamInfo, StreamEntities.Medium? streamMedia,
CommonEntities.Author? author,
Dictionary<string, long> users);
Task<bool> DownloadSingleMessagePreviewDRMVideo(string policy, string signature, string kvp, string url,
string decryptionKey, string folder, DateTime lastModified, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, MessageEntities.SingleMessage? messageInfo,
MessageEntities.Medium? messageMedia, CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<bool> DownloadMessagePreviewMedia(string url, string folder, long media_id, string api_type,
IProgressReporter progressReporter, string? filenameFormat, MessageEntities.SingleMessage? messageInfo,
MessageEntities.Medium? messageMedia, CommonEntities.FromUser? fromUser, Dictionary<string, long> users);
Task<DownloadResult> DownloadHighlights(string username, long userId, string path, HashSet<long> paidPostIds, Task<DownloadResult> DownloadHighlights(string username, long userId, string path, HashSet<long> paidPostIds,
IProgressReporter progressReporter); IProgressReporter progressReporter);