You've already forked N_m3u8DL-CLI
mirror of
https://github.com/nilaoda/N_m3u8DL-CLI
synced 2025-09-11 16:00:49 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e700edba56 | ||
![]() |
aad948da7c | ||
![]() |
14f7b20176 | ||
![]() |
a66a9a4096 | ||
![]() |
c862f23a9c | ||
![]() |
1a722e80de | ||
![]() |
eff43e8ac3 | ||
![]() |
7648f8f8dc |
30
.github/workflows/build_latest.yml
vendored
Normal file
30
.github/workflows/build_latest.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
name: Build_Latest
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
name: Checkout Code
|
||||
|
||||
- name: Setup MSBuild Path
|
||||
uses: warrenbuckley/Setup-MSBuild@v1
|
||||
|
||||
- name: Setup NuGet
|
||||
uses: NuGet/setup-nuget@v1.0.2
|
||||
|
||||
- name: Restore NuGet Packages
|
||||
run: nuget restore N_m3u8DL-CLI.sln
|
||||
|
||||
- name: Build
|
||||
run: msbuild N_m3u8DL-CLI.sln /p:Configuration=Release /p:DebugSymbols=false /p:DebugType=None
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v1.0.0
|
||||
with:
|
||||
name: N_m3u8DL-CLI_latest
|
||||
path: N_m3u8DL-CLI\bin\Release\
|
41
N_m3u8DL-CLI/DecodeDdyun.cs
Normal file
41
N_m3u8DL-CLI/DecodeDdyun.cs
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -5,7 +5,7 @@ using System.Text;
|
||||
|
||||
namespace N_m3u8DL_CLI
|
||||
{
|
||||
class DecryptNfmovies
|
||||
class DecodeNfmovies
|
||||
{
|
||||
//https://jx.nfmovies.com/hls.min.js
|
||||
public static string DecryptM3u8(byte[] byteArray)
|
@@ -10,6 +10,8 @@ namespace N_m3u8DL_CLI
|
||||
{
|
||||
class FFmpeg
|
||||
{
|
||||
public static string FFMPEG_PATH = "ffmpeg";
|
||||
|
||||
private static string outPutPath = string.Empty;
|
||||
private static string reportFile = string.Empty;
|
||||
private static bool useAACFilter = false; //是否启用滤镜
|
||||
@@ -83,7 +85,7 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
}
|
||||
|
||||
Run("ffmpeg", command, Path.GetDirectoryName(files[0]));
|
||||
Run(FFMPEG_PATH, command, Path.GetDirectoryName(files[0]));
|
||||
LOGGER.WriteLine(strings.ffmpegDone);
|
||||
//Console.WriteLine(command);
|
||||
}
|
||||
@@ -92,7 +94,7 @@ namespace N_m3u8DL_CLI
|
||||
{
|
||||
if (Global.VIDEO_TYPE == "H264")
|
||||
{
|
||||
Run("ffmpeg",
|
||||
Run(FFMPEG_PATH,
|
||||
"-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v h264_mp4toannexb \""
|
||||
+ Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"",
|
||||
Path.GetDirectoryName(file));
|
||||
@@ -104,7 +106,7 @@ namespace N_m3u8DL_CLI
|
||||
}
|
||||
else if (Global.VIDEO_TYPE == "H265")
|
||||
{
|
||||
Run("ffmpeg",
|
||||
Run(FFMPEG_PATH,
|
||||
"-loglevel quiet -i \"" + file + "\" -map 0 -c copy -copy_unknown -f mpegts -bsf:v hevc_mp4toannexb \""
|
||||
+ Path.GetFileNameWithoutExtension(file) + "[MPEGTS].ts\"",
|
||||
Path.GetDirectoryName(file));
|
||||
|
@@ -30,8 +30,8 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
|
||||
/*===============================================================================*/
|
||||
static string nowVer = "2.7.3";
|
||||
static string nowDate = "20200914";
|
||||
static string nowVer = "2.7.5";
|
||||
static string nowDate = "20201014";
|
||||
public static void WriteInit()
|
||||
{
|
||||
Console.Clear();
|
||||
|
@@ -40,8 +40,8 @@
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.JScript" />
|
||||
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>..\..\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NiL.JS, Version=2.5.1428.0, Culture=neutral, PublicKeyToken=fa941a7c2a4de689, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NiL.JS.2.5.1428\lib\net45\NiL.JS.dll</HintPath>
|
||||
@@ -63,9 +63,10 @@
|
||||
<Compile Include="CommandLineArgument.cs" />
|
||||
<Compile Include="CommandLineArgumentParser.cs" />
|
||||
<Compile Include="Decode51CtoKey.cs" />
|
||||
<Compile Include="DecodeDdyun.cs" />
|
||||
<Compile Include="DecodeImooc.cs" />
|
||||
<Compile Include="DecodeNfmovies.cs" />
|
||||
<Compile Include="Decrypter.cs" />
|
||||
<Compile Include="DecryptNfmovies.cs" />
|
||||
<Compile Include="FFmpeg.cs" />
|
||||
<Compile Include="Global.cs" />
|
||||
<Compile Include="HLSLiveDownloader.cs" />
|
||||
@@ -99,9 +100,6 @@
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="bin\Debug\Newtonsoft.Json.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<COMReference Include="Scripting">
|
||||
<Guid>{420B2830-E718-11CF-893D-00A0C9054228}</Guid>
|
||||
|
@@ -96,7 +96,9 @@ namespace N_m3u8DL_CLI
|
||||
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 @@ namespace N_m3u8DL_CLI
|
||||
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))
|
||||
@@ -370,6 +384,10 @@ namespace N_m3u8DL_CLI
|
||||
{
|
||||
segUrl += new Regex("\\?__gda__.*").Match(M3u8Url).Value;
|
||||
}
|
||||
if (M3u8Url.Contains("//dlsc.hcs.cmvideo.cn") && (segUrl.EndsWith(".ts") || segUrl.EndsWith(".mp4")))
|
||||
{
|
||||
segUrl += new Regex("\\?.*").Match(M3u8Url).Value;
|
||||
}
|
||||
segInfo.Add("segUri", segUrl);
|
||||
segments.Add(segInfo);
|
||||
segInfo = new JObject();
|
||||
|
@@ -287,6 +287,13 @@ 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解密
|
||||
/// 2020年10月14日
|
||||
/// - 咪咕分片链接后拼接m3u8_url参数
|
||||
/// - 修复文件名过长导致的BUG
|
||||
/// - 优化ffmpeg调用逻辑
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
@@ -352,7 +359,15 @@ namespace N_m3u8DL_CLI.NetCore
|
||||
string fileName = "";
|
||||
|
||||
//寻找ffmpeg.exe
|
||||
if (!File.Exists("ffmpeg.exe") && !File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "ffmpeg.exe")))
|
||||
if (File.Exists("ffmpeg.exe"))
|
||||
{
|
||||
FFmpeg.FFMPEG_PATH = Path.Combine(Environment.CurrentDirectory, "ffmpeg.exe");
|
||||
}
|
||||
else if (File.Exists(Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "ffmpeg.exe")))
|
||||
{
|
||||
FFmpeg.FFMPEG_PATH = Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "ffmpeg.exe");
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -360,7 +375,10 @@ namespace N_m3u8DL_CLI.NetCore
|
||||
foreach (var de in EnvironmentPath)
|
||||
{
|
||||
if (File.Exists(Path.Combine(de.Trim('\"').Trim(), "ffmpeg.exe")))
|
||||
{
|
||||
FFmpeg.FFMPEG_PATH = Path.Combine(de.Trim('\"').Trim(), "ffmpeg.exe");
|
||||
goto HasFFmpeg;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
@@ -374,8 +392,7 @@ namespace N_m3u8DL_CLI.NetCore
|
||||
Console.ResetColor(); //将控制台的前景色和背景色设为默认值
|
||||
Console.WriteLine(strings.ffmpegTip);
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("x86 https://ffmpeg.zeranoe.com/builds/win32/static/");
|
||||
Console.WriteLine("x64 https://ffmpeg.zeranoe.com/builds/win64/static/");
|
||||
Console.WriteLine("http://ffmpeg.org/download.html#build-windows");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine(strings.pressAnyKeyExit);
|
||||
Console.ReadKey();
|
||||
@@ -642,6 +659,20 @@ namespace N_m3u8DL_CLI.NetCore
|
||||
string m3u8Content = string.Empty;
|
||||
bool isVOD = true;
|
||||
|
||||
//避免文件路径过长
|
||||
if (workDir.Length >= 200)
|
||||
{
|
||||
//目录不能随便改 直接抛出异常
|
||||
throw new Exception("保存目录过长!");
|
||||
}
|
||||
else if (workDir.Length + fileName.Length >= 200)
|
||||
{
|
||||
//尝试缩短文件名
|
||||
while (workDir.Length + fileName.Length >= 200)
|
||||
{
|
||||
fileName = fileName.Substring(0, fileName.Length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
//开始解析
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" />
|
||||
<package id="NiL.JS" version="2.5.1428" targetFramework="net46" />
|
||||
</packages>
|
Reference in New Issue
Block a user