From c862f23a9c60d7623e3c068579b02903261b65a9 Mon Sep 17 00:00:00 2001 From: nilaoda Date: Sun, 20 Sep 2020 13:41:49 +0800 Subject: [PATCH] v2.7.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持ddyun m3u8解密 --- N_m3u8DL-CLI/DecodeDdyun.cs | 41 ++++++++++++++++++++++++++++++++++ N_m3u8DL-CLI/DecodeNfmovies.cs | 36 +++++++++++++++++++++++++++++ N_m3u8DL-CLI/Global.cs | 4 ++-- N_m3u8DL-CLI/Parser.cs | 24 +++++++++++++++----- N_m3u8DL-CLI/Program.cs | 3 +++ 5 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 N_m3u8DL-CLI/DecodeDdyun.cs create mode 100644 N_m3u8DL-CLI/DecodeNfmovies.cs diff --git a/N_m3u8DL-CLI/DecodeDdyun.cs b/N_m3u8DL-CLI/DecodeDdyun.cs new file mode 100644 index 0000000..e0284ee --- /dev/null +++ b/N_m3u8DL-CLI/DecodeDdyun.cs @@ -0,0 +1,41 @@ +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; + +namespace N_m3u8DL_CLI +{ + class DecodeDdyun + { + public static string DecryptM3u8(byte[] byteArray) + { + string tmp = DecodeNfmovies.DecryptM3u8(byteArray); + if (tmp.StartsWith("duoduo.key")) + { + tmp = Regex.Replace(tmp, @"#EXT-X-BYTERANGE:.*\s", ""); + tmp = tmp.Replace("https:", "jump/https:") + .Replace("inews.gtimg.com", "puui.qpic.cn"); + } + return tmp; + } + + //https://player.ddyunp.com/jQuery.min.js?v1.5 + public static string GetVaildM3u8Url(string url) + { + //url: https://hls.ddyunp.com/ddyun/id/1/key/playlist.m3u8 + string id = Regex.Match(url, @"\w{20,}").Value; + string tm = Global.GetTimeStamp(false); + string t = ((long.Parse(tm) / 0x186a0) * 0x64).ToString(); + string tmp = id + "duoduo" + "1" + t; + MD5 md5 = MD5.Create(); + byte[] bs = Encoding.UTF8.GetBytes(tmp); + byte[] hs = md5.ComputeHash(bs); + StringBuilder sb = new StringBuilder(); + foreach (byte b in hs) + { + sb.Append(b.ToString("x2")); + } + string key = sb.ToString(); + return Regex.Replace(url, @"1/\w{20,}", "1/" + key); + } + } +} diff --git a/N_m3u8DL-CLI/DecodeNfmovies.cs b/N_m3u8DL-CLI/DecodeNfmovies.cs new file mode 100644 index 0000000..ee2361b --- /dev/null +++ b/N_m3u8DL-CLI/DecodeNfmovies.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; + +namespace N_m3u8DL_CLI +{ + class DecodeNfmovies + { + //https://jx.nfmovies.com/hls.min.js + public static string DecryptM3u8(byte[] byteArray) + { + var t = byteArray; + var decrypt = ""; + if (137 == t[0] && 80 == t[1] && 130 == t[354] && 96 == t[353]) t = t.Skip(355).ToArray(); + else + { + if (137 != t[0] || 80 != t[1] || 130 != t[394] || 96 != t[393]) + { + for (var i = 0; i < t.Length; i++) decrypt += Convert.ToChar(t[i]); + return decrypt; + } + t = t.Skip(395).ToArray(); + } + using (var zipStream = + new System.IO.Compression.GZipStream(new MemoryStream(t), System.IO.Compression.CompressionMode.Decompress)) + { + using (StreamReader sr = new StreamReader(zipStream, Encoding.UTF8)) + { + decrypt = sr.ReadToEnd(); + } + } + return decrypt; + } + } +} diff --git a/N_m3u8DL-CLI/Global.cs b/N_m3u8DL-CLI/Global.cs index 21edffd..505ade0 100644 --- a/N_m3u8DL-CLI/Global.cs +++ b/N_m3u8DL-CLI/Global.cs @@ -30,8 +30,8 @@ class Global /*===============================================================================*/ - static string nowVer = "2.7.3"; - static string nowDate = "20200914"; + static string nowVer = "2.7.4"; + static string nowDate = "20200920"; public static void WriteInit() { Console.Clear(); diff --git a/N_m3u8DL-CLI/Parser.cs b/N_m3u8DL-CLI/Parser.cs index ea1bf45..b3320c3 100644 --- a/N_m3u8DL-CLI/Parser.cs +++ b/N_m3u8DL-CLI/Parser.cs @@ -96,7 +96,9 @@ public void Parse() if (M3u8Url.StartsWith("http")) { if (M3u8Url.Contains("nfmovies.com/hls")) - m3u8Content = DecryptNfmovies.DecryptM3u8(Global.HttpDownloadFileToBytes(M3u8Url, headers)); + m3u8Content = DecodeNfmovies.DecryptM3u8(Global.HttpDownloadFileToBytes(M3u8Url, headers)); + else if (M3u8Url.Contains("hls.ddyunp.com/ddyun")) + m3u8Content = DecodeDdyun.DecryptM3u8(Global.HttpDownloadFileToBytes(DecodeDdyun.GetVaildM3u8Url(M3u8Url), headers)); else m3u8Content = Global.GetWebSource(M3u8Url, headers); } @@ -264,11 +266,23 @@ public void Parse() else if (line.StartsWith(HLSTags.ext_x_version)) ; else if (line.StartsWith(HLSTags.ext_x_allow_cache)) ; //解析KEY - else if (line.StartsWith(HLSTags.ext_x_key) && string.IsNullOrEmpty(keyFile) && string.IsNullOrEmpty(keyBase64)) + else if (line.StartsWith(HLSTags.ext_x_key)) { - m3u8CurrentKey = ParseKey(line); - //存储为上一行的key信息 - lastKeyLine = line; + //自定义KEY情况 判断是否需要读取IV + if (!string.IsNullOrEmpty(keyFile) || !string.IsNullOrEmpty(keyBase64)) + { + if (m3u8CurrentKey[2] == "" && line.Contains("IV=0x")) + { + var temp = ParseKey(line); + m3u8CurrentKey[2] = temp[2]; //使用m3u8中的IV + } + } + else + { + m3u8CurrentKey = ParseKey(line); + //存储为上一行的key信息 + lastKeyLine = line; + } } //解析分片时长(暂时不考虑标题属性) else if (line.StartsWith(HLSTags.extinf)) diff --git a/N_m3u8DL-CLI/Program.cs b/N_m3u8DL-CLI/Program.cs index 98cad5c..3816f8a 100644 --- a/N_m3u8DL-CLI/Program.cs +++ b/N_m3u8DL-CLI/Program.cs @@ -287,6 +287,9 @@ namespace N_m3u8DL_CLI.NetCore /// - 支持nfmovies m3u8解密 /// - 支持自动去除PNG Header(https://puui.qpic.cn/newsapp_ls/0/12418116195/0) /// - 修复相对时间的vtt合并的一些错误逻辑(还存在问题) + /// 2020年9月19日 + /// - 在自定义KEY且未自定义IV情况下,自动读取m3u8中存在的IV + /// - 支持阿房影视等ddyun m3u8解密 /// ///