Skip to content

Commit

Permalink
v2.7.4
Browse files Browse the repository at this point in the history
支持ddyun m3u8解密
  • Loading branch information
nilaoda committed Sep 20, 2020
1 parent 1a722e8 commit c862f23
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 7 deletions.
41 changes: 41 additions & 0 deletions N_m3u8DL-CLI/DecodeDdyun.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
36 changes: 36 additions & 0 deletions N_m3u8DL-CLI/DecodeNfmovies.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
4 changes: 2 additions & 2 deletions N_m3u8DL-CLI/Global.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
24 changes: 19 additions & 5 deletions N_m3u8DL-CLI/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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))
Expand Down
3 changes: 3 additions & 0 deletions N_m3u8DL-CLI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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解密
/// </summary>
///

Expand Down

0 comments on commit c862f23

Please sign in to comment.