Update ofdl dl.go

This commit is contained in:
User24kld 2025-05-21 14:23:41 +00:00
parent a8ee5e9648
commit 376dde3665
1 changed files with 225 additions and 77 deletions

View File

@ -1,77 +1,225 @@
package main private static async Task<string?> GetDRMMPDPSSH(string mpdUrl, string policy, string signature, string kvp)
{
import ( try
"fmt" {
"os" HttpClient client = new HttpClient();
"strings" var request = new HttpRequestMessage
) {
RequestUri = new Uri(mpdUrl),
func fileExists(path string) bool { Method = HttpMethod.Get,
_, err := os.Stat(path) };
return err == nil request.Headers.Add("Accept", "application/dash+xml,video/vnd.mpeg.dash.mpd");
} request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
request.Headers.Add("Cookie", $"CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}");
func main() {
//needs changing to actual var response = await client.SendAsync(request);
paidMessageValue := "https://cdn3.onlyfans.com/dash/files,..." response.EnsureSuccessStatusCode();
paidMessageKey := "mediaId123"
path := "/path/to/download" string mpdContent = await response.Content.ReadAsStringAsync();
task := "download-task" XDocument mpdDoc = XDocument.Parse(mpdContent);
deviceFolder := "/path/to/device" XNamespace ns = "urn:mpeg:dash:schema:mpd:2011";
deviceName := "default" var psshElement = mpdDoc.Descendants(ns + "PSSH").FirstOrDefault();
hasSelectedUsers := true
return psshElement?.Value;
clientIdBlobMissing := !fileExists(fmt.Sprintf("%s/%s/device_client_id_blob", deviceFolder, deviceName)) }
devicePrivateKeyMissing := !fileExists(fmt.Sprintf("%s/%s/device_private_key", deviceFolder, deviceName)) catch (Exception ex)
{
if strings.Contains(paidMessageValue, "cdn3.onlyfans.com/dash/files") { Log.Error("Error getting PSSH: {0}", ex.Message);
parts := strings.Split(paidMessageValue, ",") return null;
if len(parts) < 6 { }
fmt.Println("Invalid media info string.") }
return
} private static async Task<DateTime> GetDRMMPDLastModified(string mpdUrl, string policy, string signature, string kvp)
{
mpdURL := parts[0] try
policy := parts[1] {
signature := parts[2] HttpClient client = new HttpClient();
kvp := parts[3] var request = new HttpRequestMessage
mediaId := parts[4] {
messageId := parts[5] RequestUri = new Uri(mpdUrl),
Method = HttpMethod.Head,
pssh, err := GetDRMMPDPSSH(mpdURL, policy, signature, kvp) };
if err != nil || pssh == "" { request.Headers.Add("Accept", "application/dash+xml,video/vnd.mpeg.dash.mpd");
fmt.Println("Failed to get PSSH") request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
return request.Headers.Add("Cookie", $"CloudFront-Policy={policy}; CloudFront-Signature={signature}; CloudFront-Key-Pair-Id={kvp}");
}
var response = await client.SendAsync(request);
lastModified, _ := GetDRMMPDLastModified(mpdURL, policy, signature, kvp) response.EnsureSuccessStatusCode();
drmHeaders := GetDynamicHeaders(fmt.Sprintf("/api2/v2/users/media/%s/drm/message/%s", mediaId, messageId), "?type=widevine") return response.Content.Headers.LastModified?.DateTime ?? DateTime.Now;
}
var decryptionKey string catch (Exception ex)
if clientIdBlobMissing || devicePrivateKeyMissing { {
decryptionKey, err = GetDecryptionKeyOFDL(drmHeaders, fmt.Sprintf("https://onlyfans.com/api2/v2/users/media/%s/drm/message/%s?type=widevine", mediaId, messageId), pssh) Log.Error("Error getting MPD last modified date: {0}", ex.Message);
} else { return DateTime.Now;
decryptionKey, err = GetDecryptionKeyCDM(drmHeaders, fmt.Sprintf("https://onlyfans.com/api2/v2/users/media/%s/drm/message/%s?type=widevine", mediaId, messageId), pssh) }
} }
if err != nil { private static Dictionary<string, string> GetDynamicHeaders(string url, string queryParams)
fmt.Println("Failed to get decryption key:", err) {
return var headers = new Dictionary<string, string>();
} try
{
err = DownloadPurchasedMessageDRMVideo(mpdURL, decryptionKey, path) headers = auth.GetDynamicHeaders(url, queryParams);
if err != nil { }
fmt.Println("Failed to download DRM video:", err) catch (Exception ex)
} {
} else { Log.Error("Error getting dynamic headers: {0}", ex.Message);
// Simulated. needs changing for our needs }
mediaInfo := "media-metadata" return headers;
messageInfo := "message-metadata" }
err := DownloadPurchasedMedia(paidMessageValue, path, paidMessageKey, "Messages", task, "filenameFormat", messageInfo, mediaInfo, hasSelectedUsers) private static async Task<string> GetDecryptionKeyOFDL(Dictionary<string, string> drmHeaders, string licenseUrl, string pssh)
if err != nil { {
fmt.Println("Failed to download regular media:", err) try
} {
} var client = new HttpClient();
} var request = new HttpRequestMessage(HttpMethod.Post, "https://ofdl.tools/wv")
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "license_url", licenseUrl },
{ "headers", JsonConvert.SerializeObject(drmHeaders) },
{ "pssh", pssh },
{ "build_identifier", "windows_software_widevinecdm_win_x86_64" },
{ { "proxy", "" }
})
};
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
var jsonResponse = JObject.Parse(responseContent);
return jsonResponse["keys"][0]["key"].ToString();
}
catch (Exception ex)
{
Log.Error("Error getting decryption key from OFDL: {0}", ex.Message);
throw;
}
}
private static async Task<string> GetDecryptionKeyCDM(Dictionary<string, string> drmHeaders, string licenseUrl, string pssh)
{
try
{
var client = new WidevineClient.Widevine.CDMClient();
return await client.GetContentKey(licenseUrl, drmHeaders, pssh);
}
catch (Exception ex)
{
Log.Error("Error getting decryption key from CDM: {0}", ex.Message);
throw;
}
}
private static async Task<bool> DownloadPurchasedMessageDRMVideo(
string policy,
string signature,
string kvp,
string url,
string decryptionKey,
string folder,
DateTime lastModified,
long media_id,
string api_type,
ProgressTask task,
string filenameFormat,
Purchased.List? messageInfo,
Medium? messageMedia,
User? fromUser,
Dictionary<string, int> users)
{
try
{
string filename = string.Empty;
string customFileName = string.Empty;
string path = string.Empty;
if (messageInfo != null && messageMedia != null && fromUser != null)
{
filename = await DownloadHelper.GenerateFilename(filenameFormat, "Messages", messageInfo, messageMedia, fromUser, users, api_type);
customFileName = filename.Split('.')[0];
path = Path.Combine(folder, filename);
}
else
{
filename = $"{media_id}.mp4";
path = Path.Combine(folder, filename);
}
if (File.Exists(path) && new FileInfo(path).Length > 0)
{
return false;
}
var downloader = new DownloadHelper.DRMVideoDownloader();
await downloader.DownloadDRMVideo(
url: url,
decryptionKey: decryptionKey,
folder: folder,
lastModified: lastModified,
policy: policy,
signature: signature,
kvp: kvp,
customFileName: customFileName,
task: task);
return true;
}
catch (Exception ex)
{
Log.Error("Error downloading DRM video: {0}", ex.Message);
return false;
}
}
private static async Task<bool> DownloadPurchasedMedia(
string url,
string folder,
long media_id,
string api_type,
ProgressTask task,
string filenameFormat,
Purchased.List? messageInfo,
Medium? messageMedia,
User? fromUser,
Dictionary<string, int> users)
{
try
{
string filename = string.Empty;
string path = string.Empty;
if (messageInfo != null && messageMedia != null && fromUser != null)
{
filename = await DownloadHelper.GenerateFilename(filenameFormat, "Messages", messageInfo, messageMedia, fromUser, users, api_type);
path = Path.Combine(folder, filename);
}
else
{
filename = $"{media_id}.mp4";
path = Path.Combine(folder, filename);
}
if (File.Exists(path) && new FileInfo(path).Length > 0)
{
return false;
}
var downloader = new DownloadHelper.MediaDownloader();
await downloader.DownloadMedia(
url: url,
folder: folder,
filename: filename,
task: task);
return true;
}
catch (Exception ex)
{
Log.Error("Error downloading media: {0}", ex.Message);
return false;
}
}