using System.Security.Cryptography;
public static class _configurationManager
public static string LLNWMediaVaultBaseURL = "https://cdn41.academy.ca";
public static string LLNWMediaVaultPathPattern = "/s/CSA.Film/PROD/{mediaId}.mp4/";
public static string LLNWMediaVaultManifest = "manifest.m3u8";
public static string LLNWMediaVaultSecret = "";
public static int LLNWMediaVaultTimeToLiveInMinutes = 720;
public static void Main()
url = GetLLNWMediaVaultStreamingLink(10378, DateTime.Parse("2018-10-30T17:21:31+00:00"));
Console.WriteLine($"Streaming URL is: {url}");
public static int ToUnixTimeSeconds(DateTime datTime)
return (int)datTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
private static string GetLLNWMediaVaultStreamingLink(int mediaId, DateTime dateTime)
var baseUrl = _configurationManager.LLNWMediaVaultBaseURL;
var path = _configurationManager.LLNWMediaVaultPathPattern.Replace("{mediaId}", mediaId.ToString());
var manifest = _configurationManager.LLNWMediaVaultManifest;
var hashSecret = _configurationManager.LLNWMediaVaultSecret;
var ttlInMinutes = _configurationManager.LLNWMediaVaultTimeToLiveInMinutes;
var e = ToUnixTimeSeconds(dateTime.AddMinutes(ttlInMinutes));
var cf = ToUnixTimeSeconds(dateTime.AddMinutes(ttlInMinutes));
var params_ = $"?p={(baseUrl + path).Length}&e={e}&cf={cf}";
var link = GenerateLLHWLink(baseUrl, params_, path, manifest, hashSecret);
private static string GenerateLLHWLink(string baseUrl, string param, string path, string mani, string secret)
var md5InputUrl = $"{secret}{baseUrl}{path}{param}";
var md5hash = CreateMD5(md5InputUrl);
var authUrl = $"{baseUrl}{path}{mani}{param}&h={md5hash}";
private static string CreateMD5(string input)
using (var md5 = MD5.Create())
var inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
var hashBytes = md5.ComputeHash(inputBytes);
return string.Join("", hashBytes.Select(x => x.ToString("x2")));