Update ofdl dl.go
This commit is contained in:
parent
a8ee5e9648
commit
376dde3665
302
ofdl dl.go
302
ofdl dl.go
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue