1
mirror of https://github.com/nilaoda/N_m3u8DL-CLI synced 2025-09-15 02:00:49 +02:00

Compare commits

...

22 Commits
2.8.8 ... 2.9.2

Author SHA1 Message Date
nilaoda
4a4bfae5ab 优化MPD下载行为 2021-01-18 02:00:19 +08:00
nilaoda
d586dddfcd Update changelog.txt 2021-01-18 01:59:31 +08:00
nilaoda
fca6b3ff6c Update changelog.txt 2020-12-29 23:19:39 +08:00
nilaoda
5d75626a36 Update Global.cs 2020-12-29 23:18:16 +08:00
nilaoda
a94271c244 mpd - xigua 2020-12-20 18:53:40 +08:00
nilaoda
c51118dce7 解密huke88 2020-12-20 18:53:02 +08:00
nilaoda
81b2e87bf7 处理同一ID分散在不同Period的情况 2020-12-12 02:07:41 +08:00
nilaoda
71a9878aaa Update changelog.txt 2020-12-06 21:32:48 +08:00
nilaoda
769fe4e926 Update Global.cs 2020-12-06 21:32:38 +08:00
nilaoda
1f57ba7c09 Update Parser.cs 2020-12-06 21:32:29 +08:00
nilaoda
71282bda30 Update N_m3u8DL-CLI.csproj 2020-12-02 20:35:44 +08:00
nilaoda
41ee8aebdf update project 2020-12-02 20:31:44 +08:00
nilaoda
a4537bc093 del xml 2020-12-02 20:23:50 +08:00
nilaoda
b8a60b3917 Update packages.config 2020-12-02 20:23:36 +08:00
nilaoda
8091dd290f Update N_m3u8DL-CLI.csproj 2020-12-02 20:15:29 +08:00
nilaoda
d48e84e611 Update FodyWeavers.xml 2020-12-02 20:10:29 +08:00
nilaoda
9f5423a437 Costura.Fody 2020-12-02 19:56:20 +08:00
nilaoda
ce7e38770a Update N_m3u8DL-CLI.csproj 2020-12-02 19:51:29 +08:00
nilaoda
8fdb2e918e Update packages.config 2020-12-02 19:49:10 +08:00
nilaoda
d4b7d240c1 修正多语言识别问题 2020-12-02 11:56:46 +08:00
nilaoda
484d2941ed Update Global.cs 2020-12-02 11:56:17 +08:00
nilaoda
a0f2b66575 Update changelog.txt 2020-12-02 11:56:04 +08:00
9 changed files with 190 additions and 41 deletions

View File

@@ -0,0 +1,53 @@
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace N_m3u8DL_CLI
{
//https://js.huke88.com/assets/revision/js/plugins/tcplayer/tcplayer.v4.1.min.js?v=930
//https://js.huke88.com/assets/revision/js/plugins/tcplayer/libs/hls.min.0.13.2m.js?v=930
class DecodeHuke88Key
{
private static string[] GetOverlayInfo(string url)
{
var enc = new Regex("eyJ\\w{100,}").Match(url).Value;
var json = Encoding.UTF8.GetString(Convert.FromBase64String(enc));
JObject jObject = JObject.Parse(json);
var key = jObject["overlayKey"].ToString();
var iv = jObject["overlayIv"].ToString();
return new string[] { key, iv };
}
public static string DecodeKey(string url, byte[] data)
{
var info = GetOverlayInfo(url);
var overlayKey = info[0];
var overlayIv = info[1];
var l = new List<byte>();
var c = new List<byte>();
for (int h = 0; h < 16; h++)
{
var f = overlayKey.Substring(2 * h, 2);
var g = overlayIv.Substring(2 * h, 2);
l.Add(Convert.ToByte(f, 16));
c.Add(Convert.ToByte(g, 16));
}
var _lastCipherblock = c.ToArray();
var t = new byte[data.Length];
var r = data;
r = Decrypter.AES128Decrypt(data, l.ToArray(), Decrypter.HexStringToBytes("00000000000000000000000000000000"), CipherMode.CBC, PaddingMode.Zeros);
for (var o = 0; o < 16; o++)
t[o] = (byte)(r[o] ^ _lastCipherblock[o]);
var key = Convert.ToBase64String(t);
return key;
}
}
}

View File

@@ -1,16 +1,12 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace N_m3u8DL_CLI namespace N_m3u8DL_CLI
{ {
class Decrypter class Decrypter
{ {
public static byte[] AES128Decrypt(string filePath, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC) public static byte[] AES128Decrypt(string filePath, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{ {
FileStream fs = new FileStream(filePath, FileMode.Open); FileStream fs = new FileStream(filePath, FileMode.Open);
//获取文件大小 //获取文件大小
@@ -25,14 +21,14 @@ namespace N_m3u8DL_CLI
dcpt.Key = keyByte; dcpt.Key = keyByte;
dcpt.IV = ivByte; dcpt.IV = ivByte;
dcpt.Mode = mode; dcpt.Mode = mode;
dcpt.Padding = PaddingMode.PKCS7; dcpt.Padding = padding;
ICryptoTransform cTransform = dcpt.CreateDecryptor(); ICryptoTransform cTransform = dcpt.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length);
return resultArray; return resultArray;
} }
public static byte[] AES128Decrypt(byte[] encryptedBuff, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC) public static byte[] AES128Decrypt(byte[] encryptedBuff, byte[] keyByte, byte[] ivByte, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{ {
byte[] inBuff = encryptedBuff; byte[] inBuff = encryptedBuff;
@@ -42,7 +38,7 @@ namespace N_m3u8DL_CLI
dcpt.Key = keyByte; dcpt.Key = keyByte;
dcpt.IV = ivByte; dcpt.IV = ivByte;
dcpt.Mode = mode; dcpt.Mode = mode;
dcpt.Padding = PaddingMode.PKCS7; dcpt.Padding = padding;
ICryptoTransform cTransform = dcpt.CreateDecryptor(); ICryptoTransform cTransform = dcpt.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length); Byte[] resultArray = cTransform.TransformFinalBlock(inBuff, 0, inBuff.Length);
@@ -56,7 +52,7 @@ namespace N_m3u8DL_CLI
return new byte[0]; return new byte[0];
} }
if (hexStr.StartsWith("0x") || hexStr.StartsWith("0X")) if (hexStr.StartsWith("0x") || hexStr.StartsWith("0X"))
{ {
hexStr = hexStr.Remove(0, 2); hexStr = hexStr.Remove(0, 2);
} }

View File

@@ -32,7 +32,7 @@ namespace N_m3u8DL_CLI
/*===============================================================================*/ /*===============================================================================*/
static Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; static Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
static string nowVer = $"{ver.Major}.{ver.Minor}.{ver.Build}"; static string nowVer = $"{ver.Major}.{ver.Minor}.{ver.Build}";
static string nowDate = "20201126"; static string nowDate = "20210118";
public static void WriteInit() public static void WriteInit()
{ {
Console.Clear(); Console.Clear();

View File

@@ -61,14 +61,18 @@ namespace N_m3u8DL_CLI
void ExtractInitialization(XmlNode source) void ExtractInitialization(XmlNode source)
{ {
var initialization = source.SelectSingleNode("//ns:Initialization", nsMgr); var initialization = source.SelectSingleNode("ns:Initialization", nsMgr);
if (initialization != null) if (initialization != null)
{ {
MultisegmentInfo["InitializationUrl"] = ((XmlElement)initialization).GetAttribute("sourceURL"); MultisegmentInfo["InitializationUrl"] = ((XmlElement)initialization).GetAttribute("sourceURL");
if (((XmlElement)initialization).HasAttribute("range"))
{
MultisegmentInfo["InitializationUrl"] += "$$Range=" + ((XmlElement)initialization).GetAttribute("range");
}
} }
} }
var segmentList = Period.SelectSingleNode("//ns:SegmentList", nsMgr); var segmentList = Period.SelectSingleNode("ns:SegmentList", nsMgr);
if (segmentList != null) if (segmentList != null)
{ {
ExtractCommon(segmentList); ExtractCommon(segmentList);
@@ -77,7 +81,14 @@ namespace N_m3u8DL_CLI
MultisegmentInfo["SegmentUrls"] = new List<string>(); MultisegmentInfo["SegmentUrls"] = new List<string>();
foreach (XmlElement segment in segmentUrlsE) foreach (XmlElement segment in segmentUrlsE)
{ {
MultisegmentInfo["SegmentUrls"].Add(segment.GetAttribute("media")); if (segment.HasAttribute("mediaRange"))
{
MultisegmentInfo["SegmentUrls"].Add("$$Range=" + segment.GetAttribute("mediaRange"));
}
else
{
MultisegmentInfo["SegmentUrls"].Add(segment.GetAttribute("media"));
}
} }
} }
else else
@@ -116,6 +127,10 @@ namespace N_m3u8DL_CLI
/// <returns></returns> /// <returns></returns>
public static string Parse(string downDir, string mpdUrl, string mpdContent, string defaultBase = "") public static string Parse(string downDir, string mpdUrl, string mpdContent, string defaultBase = "")
{ {
//XiGua
if (mpdContent.Contains("<mas:") && !mpdContent.Contains("xmlns:mas"))
mpdContent = mpdContent.Replace("<MPD ", "<MPD xmlns:mas=\"urn:marlin:mas:1-0:services:schemas:mpd\" ");
XmlDocument mpdDoc = new XmlDocument(); XmlDocument mpdDoc = new XmlDocument();
mpdDoc.LoadXml(mpdContent); mpdDoc.LoadXml(mpdContent);
@@ -208,6 +223,7 @@ namespace N_m3u8DL_CLI
var bandwidth = IntOrNull(GetAttribute("bandwidth")); var bandwidth = IntOrNull(GetAttribute("bandwidth"));
var f = new Dictionary<string, dynamic> var f = new Dictionary<string, dynamic>
{ {
["ContentType"] = contentType,
["FormatId"] = representationId, ["FormatId"] = representationId,
["ManifestUrl"] = mpdUrl, ["ManifestUrl"] = mpdUrl,
["Width"] = IntOrNull(GetAttribute("width")), ["Width"] = IntOrNull(GetAttribute("width")),
@@ -432,6 +448,10 @@ namespace N_m3u8DL_CLI
if (representationMsInfo.ContainsKey("InitializationUrl")) if (representationMsInfo.ContainsKey("InitializationUrl"))
{ {
f["InitializationUrl"] = representationMsInfo["InitializationUrl"]; f["InitializationUrl"] = representationMsInfo["InitializationUrl"];
if (f["InitializationUrl"].StartsWith("$$Range"))
{
f["InitializationUrl"] = CombineURL(baseUrl, f["InitializationUrl"]);
}
f["Fragments"] = representationMsInfo["Fragments"]; f["Fragments"] = representationMsInfo["Fragments"];
} }
} }
@@ -447,7 +467,23 @@ namespace N_m3u8DL_CLI
}; };
} }
formatList.Add(f); //处理同一ID分散在不同Period的情况
if (formatList.Any(_f => _f["FormatId"] == f["FormatId"] && _f["Width"] == f["Width"] && _f["ContentType"] == f["ContentType"]))
{
for (int i = 0; i < formatList.Count; i++)
{
if (formatList[i]["FormatId"] == f["FormatId"] && formatList[i]["Width"] == f["Width"] && formatList[i]["ContentType"] == f["ContentType"])
{
formatList[i]["Fragments"].AddRange(f["Fragments"]);
break;
}
}
}
else
{
formatList.Add(f);
}
} }
} }
} }
@@ -466,14 +502,14 @@ namespace N_m3u8DL_CLI
var audioLangList = new List<string>(); var audioLangList = new List<string>();
formatList.ForEach(f => formatList.ForEach(f =>
{ {
if (f["Width"] == -1 && !audioLangList.Contains(f["Language"])) audioLangList.Add(f["Language"]); if (f["ContentType"] == "audio" && !audioLangList.Contains(f["Language"])) audioLangList.Add(f["Language"]);
}); });
if (audioLangList.Count > 1) if (audioLangList.Count > 1)
{ {
string Stringify(Dictionary<string, dynamic> f) string Stringify(Dictionary<string, dynamic> f)
{ {
var type = f["Width"] == -1 && f["Height"] == -1 ? "Audio" : "Video"; var type = f["ContentType"] == "aduio" ? "Audio" : "Video";
var res = type == "Video" ? $"[{f["Width"]}x{f["Height"]}]" : ""; var res = type == "Video" ? $"[{f["Width"]}x{f["Height"]}]" : "";
var id = $"[{f["FormatId"]}] "; var id = $"[{f["FormatId"]}] ";
var tbr = $"[{((int)f["Tbr"]).ToString().PadLeft(4)} Kbps] "; var tbr = $"[{((int)f["Tbr"]).ToString().PadLeft(4)} Kbps] ";
@@ -503,7 +539,7 @@ namespace N_m3u8DL_CLI
{ {
var n = 0; var n = 0;
int.TryParse(index, out n); int.TryParse(index, out n);
if (formatList[n]["Width"] == -1) if (formatList[n]["ContentType"] == "audio")
{ {
bestAudio = formatList[n]; bestAudio = formatList[n];
} }
@@ -605,7 +641,7 @@ namespace N_m3u8DL_CLI
sb.AppendLine("#CREATED-BY:N_m3u8DL-CLI"); sb.AppendLine("#CREATED-BY:N_m3u8DL-CLI");
//Video //Video
if (f["Width"] != -1 && f["Height"] != -1) if (f["ContentType"] != "audio")
{ {
sb.AppendLine($"#EXT-VIDEO-WIDTH:{f["Width"]}"); sb.AppendLine($"#EXT-VIDEO-WIDTH:{f["Width"]}");
sb.AppendLine($"#EXT-VIDEO-HEIGHT:{f["Height"]}"); sb.AppendLine($"#EXT-VIDEO-HEIGHT:{f["Height"]}");
@@ -615,7 +651,19 @@ namespace N_m3u8DL_CLI
sb.AppendLine($"#EXT-TBR:{f["Tbr"]}"); sb.AppendLine($"#EXT-TBR:{f["Tbr"]}");
if (f.ContainsKey("InitializationUrl")) if (f.ContainsKey("InitializationUrl"))
{ {
sb.AppendLine($"#EXT-X-MAP:URI=\"{f["InitializationUrl"]}\""); string initUrl = f["InitializationUrl"];
if (Regex.IsMatch(initUrl, "\\$\\$Range=(\\d+)-(\\d+)"))
{
var match = Regex.Match(initUrl, "\\$\\$Range=(\\d+)-(\\d+)");
string rangeStr = match.Value;
long start = Convert.ToInt64(match.Groups[1].Value);
long end = Convert.ToInt64(match.Groups[2].Value);
sb.AppendLine($"#EXT-X-MAP:URI=\"{initUrl.Replace(rangeStr, "")}\",BYTERANGE=\"{end}@{start}\"");
}
else
{
sb.AppendLine($"#EXT-X-MAP:URI=\"{initUrl}\"");
}
} }
sb.AppendLine("#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\"None\""); //使下载器使用二进制合并 sb.AppendLine("#EXT-X-KEY:METHOD=PLZ-KEEP-RAW,URI=\"None\""); //使下载器使用二进制合并
@@ -625,7 +673,19 @@ namespace N_m3u8DL_CLI
var dur = seg.ContainsKey("duration") ? seg["duration"] : 0.0; var dur = seg.ContainsKey("duration") ? seg["duration"] : 0.0;
var url = seg.ContainsKey("url") ? seg["url"] : seg["path"]; var url = seg.ContainsKey("url") ? seg["url"] : seg["path"];
sb.AppendLine($"#EXTINF:{dur.ToString("0.00")}"); sb.AppendLine($"#EXTINF:{dur.ToString("0.00")}");
sb.AppendLine(url); if (Regex.IsMatch(url, "\\$\\$Range=(\\d+)-(\\d+)"))
{
var match = Regex.Match(url, "\\$\\$Range=(\\d+)-(\\d+)");
string rangeStr = match.Value;
long start = Convert.ToInt64(match.Groups[1].Value);
long end = Convert.ToInt64(match.Groups[2].Value);
sb.AppendLine($"#EXT-X-BYTERANGE:{end + 1 - start}@{start}");
sb.AppendLine(url.Replace(rangeStr, ""));
}
else
{
sb.AppendLine(url);
}
} }
sb.AppendLine("#EXT-X-ENDLIST"); sb.AppendLine("#EXT-X-ENDLIST");
@@ -637,17 +697,19 @@ namespace N_m3u8DL_CLI
{ {
var best = new Dictionary<string, dynamic>() { ["Tbr"] = 0 }; var best = new Dictionary<string, dynamic>() { ["Tbr"] = 0 };
var bandwidth = best["Tbr"]; var bandwidth = best["Tbr"];
var width = 0;
foreach (var f in fs) foreach (var f in fs)
{ {
var w = f["Width"]; var w = f["Width"];
var h = f["Height"]; var h = f["Height"];
if (w != -1 && h != -1) if (f["ContentType"] == "video")
{ {
if (f["Tbr"] > bandwidth) if (f["Tbr"] > bandwidth && w > width)
{ {
best = f; best = f;
bandwidth = f["Tbr"]; bandwidth = f["Tbr"];
width = w;
} }
} }
} }
@@ -662,9 +724,7 @@ namespace N_m3u8DL_CLI
foreach (var f in fs) foreach (var f in fs)
{ {
var w = f["Width"]; if (f["ContentType"] == "audio")
var h = f["Height"];
if (w == -1 && h == -1)
{ {
if (f["Tbr"] > bandwidth) if (f["Tbr"] > bandwidth)
{ {
@@ -709,6 +769,10 @@ namespace N_m3u8DL_CLI
/// <returns></returns> /// <returns></returns>
static string CombineURL(string baseurl, string url) static string CombineURL(string baseurl, string url)
{ {
if (url.StartsWith("$$Range"))
{
return baseurl + url;
}
Uri uri1 = new Uri(baseurl); Uri uri1 = new Uri(baseurl);
Uri uri2 = new Uri(uri1, url); Uri uri2 = new Uri(uri1, url);
url = uri2.ToString(); url = uri2.ToString();

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -12,6 +13,8 @@
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile /> <TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
@@ -38,6 +41,9 @@
<ApplicationIcon>logo_3Iv_icon.ico</ApplicationIcon> <ApplicationIcon>logo_3Iv_icon.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
<HintPath>..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath>
</Reference>
<Reference Include="Microsoft.JScript" /> <Reference Include="Microsoft.JScript" />
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" /> <Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
@@ -64,6 +70,7 @@
<Compile Include="CommandLineArgumentParser.cs" /> <Compile Include="CommandLineArgumentParser.cs" />
<Compile Include="Decode51CtoKey.cs" /> <Compile Include="Decode51CtoKey.cs" />
<Compile Include="DecodeDdyun.cs" /> <Compile Include="DecodeDdyun.cs" />
<Compile Include="DecodeHuke88Key.cs" />
<Compile Include="DecodeImooc.cs" /> <Compile Include="DecodeImooc.cs" />
<Compile Include="DecodeNfmovies.cs" /> <Compile Include="DecodeNfmovies.cs" />
<Compile Include="Decrypter.cs" /> <Compile Include="Decrypter.cs" />
@@ -130,4 +137,12 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Fody.6.0.0\build\Fody.targets" Condition="Exists('..\packages\Fody.6.0.0\build\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Fody.6.0.0\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.0.0\build\Fody.targets'))" />
<Error Condition="!Exists('..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.4.1.0\build\Costura.Fody.props'))" />
</Target>
</Project> </Project>

View File

@@ -660,7 +660,7 @@ namespace N_m3u8DL_CLI
string keyUrl = key[1]; string keyUrl = key[1];
if (isQiQiuYun) if (isQiQiuYun)
{ {
string encKey = Encoding.Default.GetString(Global.HttpDownloadFileToBytes(keyUrl, Headers)); /*string encKey = Encoding.Default.GetString(Global.HttpDownloadFileToBytes(keyUrl, Headers));
var indexs = "0-1-2-3-4-5-6-7-8-10-11-12-14-15-16-18".Split('-'); var indexs = "0-1-2-3-4-5-6-7-8-10-11-12-14-15-16-18".Split('-');
if (encKey.Length == 20) if (encKey.Length == 20)
{ {
@@ -740,12 +740,30 @@ namespace N_m3u8DL_CLI
{ {
decKey += encKey[Convert.ToInt32(_i)]; decKey += encKey[Convert.ToInt32(_i)];
} }
key[1] = Convert.ToBase64String(Encoding.Default.GetBytes(decKey)); key[1] = Convert.ToBase64String(Encoding.Default.GetBytes(decKey));*/
key[1] = Convert.ToBase64String(Global.HttpDownloadFileToBytes(keyUrl, "User-Agent:Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; 15 Plus Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/9.4 Mobile Safari/537.36"));
} //气球云 } //气球云
else if (key[1].Contains("imooc.com/")) else if (key[1].Contains("imooc.com/"))
{ {
key[1] = DecodeImooc.DecodeKey(Global.GetWebSource(key[1], Headers)); key[1] = DecodeImooc.DecodeKey(Global.GetWebSource(key[1], Headers));
} }
else if (key[1] == "https://hls.ventunotech.com/m3u8/pc_videosecurevtnkey.key")
{
string temp = Global.GetWebSource(keyUrl, Headers);
LOGGER.PrintLine(temp);
byte[] tempKey = new byte[16];
for (int d = 0; d < 16; d++)
{
tempKey[d] = Convert.ToByte(temp.Substring(2 * d, 2), 16);
}
key[1] = Convert.ToBase64String(tempKey);
}
else if (key[1].Contains("drm.vod2.myqcloud.com/getlicense"))
{
var temp = Global.HttpDownloadFileToBytes(keyUrl, Headers);
key[1] = DecodeHuke88Key.DecodeKey(key[1], temp);
}
else else
{ {
if (keyUrl.Contains("https://keydeliver.linetv.tw/jurassicPark")) //linetv if (keyUrl.Contains("https://keydeliver.linetv.tw/jurassicPark")) //linetv

View File

@@ -51,20 +51,10 @@ namespace N_m3u8DL_CLI.NetCore
{ {
SetConsoleCtrlHandler(cancelHandler, true); SetConsoleCtrlHandler(cancelHandler, true);
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate; ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
string loc = "zh-CN"; string loc = "en-US";
string currLoc = Thread.CurrentThread.CurrentUICulture.Name; string currLoc = Thread.CurrentThread.CurrentUICulture.Name;
if (currLoc == "zh-TW" || currLoc == "zh-HK" || currLoc == "zh-MO") if (currLoc == "zh-TW" || currLoc == "zh-HK" || currLoc == "zh-MO") loc = "zh-TW";
{ else if (currLoc == "zh-CN" || currLoc == "zh-SG") loc = "zh-CN";
loc = "zh-TW";
}
else if (loc == "zh-CN" || loc == "zh-SG")
{
loc = "zh-CN";
}
else
{
loc = "en-US";
}
//设置语言 //设置语言
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(loc); CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(loc);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(loc); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(loc);

View File

@@ -297,4 +297,15 @@
- 修复BUG - 修复BUG
2020年11月26日 2020年11月26日
- 优化MPD识别方案 - 优化MPD识别方案
- 修复MPD情况下时间戳溢出问题 - 修复MPD情况下时间戳溢出问题
2020年12月2日
- FIX Language Bug
2020年12月6日
- 使用手机UA请求气球云密钥服务器
2020年12月12日
- 修复MPD下同一个ID分散在不同Period导致下载不完全问题
2020年12月20日
- 支持解密虎课网
2021年1月18日
- 完善MPD下载相关
- 重新打包多语言资源

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Fody" version="6.0.0" targetFramework="net46" developmentDependency="true" />
<package id="Costura.Fody" version="4.1.0" targetFramework="net46" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" /> <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" />
<package id="NiL.JS" version="2.5.1428" targetFramework="net46" /> <package id="NiL.JS" version="2.5.1428" targetFramework="net46" />
</packages> </packages>