You've already forked N_m3u8DL-CLI
mirror of
https://github.com/nilaoda/N_m3u8DL-CLI
synced 2025-09-08 06:00:50 +02:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
16f705fe66 | ||
![]() |
d141cabc4a | ||
![]() |
adcf884a93 | ||
![]() |
9d903a025f |
@@ -11,25 +11,12 @@ namespace N_m3u8DL_CLI
|
||||
{
|
||||
class DownloadManager
|
||||
{
|
||||
private static int calcTime = 1; //计算文件夹大小的间隔
|
||||
private int stopCount = 0; //速度为零的停止
|
||||
private int timeOut = 10000; //超时设置
|
||||
private static double downloadedSize = 0; //已下载大小
|
||||
private static bool disableIntegrityCheck = false; //关闭完整性检查
|
||||
|
||||
private string jsonFile = string.Empty;
|
||||
private string headers = string.Empty;
|
||||
private string downDir = string.Empty;
|
||||
private string downName = string.Empty;
|
||||
private string muxSetJson = string.Empty;
|
||||
private int threads = 1;
|
||||
private int retryCount = 5;
|
||||
private static int count = 0;
|
||||
private static int partsCount = 0;
|
||||
private int total = 0;
|
||||
public static string partsPadZero = string.Empty;
|
||||
string segsPadZero = string.Empty;
|
||||
bool delAfterDone = false;
|
||||
private bool isVTT = false;
|
||||
bool externalAudio = false; //额外的音轨
|
||||
string externalAudioUrl = "";
|
||||
@@ -37,28 +24,56 @@ namespace N_m3u8DL_CLI
|
||||
string externalSubUrl = "";
|
||||
string fflogName = "_ffreport.log";
|
||||
public static bool BinaryMerge = false;
|
||||
private bool noMerge = false;
|
||||
private bool muxFastStart = true;
|
||||
private string muxFormat = "mp4";
|
||||
private static bool hasSetDir = false;
|
||||
|
||||
public int Threads { get => threads; set => threads = value; }
|
||||
public int RetryCount { get => retryCount; set => retryCount = value; }
|
||||
public string Headers { get => headers; set => headers = value; }
|
||||
public string DownDir { get => downDir; set => downDir = value; }
|
||||
public string DownName { get => downName; set => downName = value; }
|
||||
public bool DelAfterDone { get => delAfterDone; set => delAfterDone = value; }
|
||||
public string MuxFormat { get => muxFormat; set => muxFormat = value; }
|
||||
public bool MuxFastStart { get => muxFastStart; set => muxFastStart = value; }
|
||||
public string MuxSetJson { get => muxSetJson; set => muxSetJson = value; }
|
||||
public int TimeOut { get => timeOut; set => timeOut = value; }
|
||||
public static double DownloadedSize { get => downloadedSize; set => downloadedSize = value; }
|
||||
public static bool HasSetDir { get => hasSetDir; set => hasSetDir = value; }
|
||||
public bool NoMerge { get => noMerge; set => noMerge = value; }
|
||||
public static int CalcTime { get => calcTime; set => calcTime = value; }
|
||||
public static int Count { get => count; set => count = value; }
|
||||
public static int PartsCount { get => partsCount; set => partsCount = value; }
|
||||
public static bool DisableIntegrityCheck { get => disableIntegrityCheck; set => disableIntegrityCheck = value; }
|
||||
public int Threads { get; set; } = 1;
|
||||
public int RetryCount { get; set; } = 5;
|
||||
public string Headers { get; set; } = string.Empty;
|
||||
public string DownDir { get; set; } = string.Empty;
|
||||
public string DownName { get; set; } = string.Empty;
|
||||
public bool DelAfterDone { get; set; } = false;
|
||||
public string MuxFormat { get; set; } = "mp4";
|
||||
public bool MuxFastStart { get; set; } = true;
|
||||
public string MuxSetJson { get; set; } = string.Empty;
|
||||
public int TimeOut { get; set; } = 10000; //超时设置
|
||||
public static double DownloadedSize { get; set; } = 0; //已下载大小
|
||||
public static bool HasSetDir { get; set; } = false;
|
||||
public bool NoMerge { get; set; } = false;
|
||||
public static int CalcTime { get; set; } = 1; //计算速度的间隔
|
||||
public static int Count { get; set; } = 0;
|
||||
public static int PartsCount { get; set; } = 0;
|
||||
public static bool DisableIntegrityCheck { get; set; } = false; //关闭完整性检查
|
||||
|
||||
static CancellationTokenSource cts = new CancellationTokenSource();
|
||||
//计算下载速度
|
||||
static System.Timers.Timer timer = new System.Timers.Timer(1000 * CalcTime); //实例化Timer类
|
||||
|
||||
public DownloadManager()
|
||||
{
|
||||
timer.AutoReset = true;
|
||||
timer.Elapsed += delegate
|
||||
{
|
||||
Console.SetCursorPosition(0, 1);
|
||||
Console.Write("Speed: " + Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + " / s".PadRight(70));
|
||||
|
||||
if (Global.HadReadInfo && Global.BYTEDOWN <= Global.STOP_SPEED * 1024 * CalcTime)
|
||||
{
|
||||
stopCount++;
|
||||
Console.SetCursorPosition(0, 1);
|
||||
Console.Write("Speed: " + Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + " / s [" + stopCount + "]".PadRight(70));
|
||||
|
||||
if (stopCount >= 12)
|
||||
{
|
||||
Global.ShouldStop = true;
|
||||
cts.Cancel();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stopCount = 0;
|
||||
Global.BYTEDOWN = 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void DoDownload()
|
||||
{
|
||||
@@ -94,7 +109,6 @@ namespace N_m3u8DL_CLI
|
||||
PartsCount = parts.Count;
|
||||
segsPadZero = string.Empty.PadRight(oriCount.Length, '0');
|
||||
partsPadZero = string.Empty.PadRight(Convert.ToString(parts.Count).Length, '0');
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
|
||||
//是直播视频
|
||||
if (isVOD == "False")
|
||||
@@ -104,7 +118,6 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
Global.ShouldStop = false; //是否该停止下载
|
||||
|
||||
//监控文件夹变化
|
||||
if (!Directory.Exists(DownDir))
|
||||
Directory.CreateDirectory(DownDir); //新建文件夹
|
||||
Watcher watcher = new Watcher(DownDir);
|
||||
@@ -112,41 +125,9 @@ namespace N_m3u8DL_CLI
|
||||
watcher.PartsCount = PartsCount;
|
||||
watcher.WatcherStrat();
|
||||
|
||||
//监控文件夹大小变化 via https://stackoverflow.com/questions/2869561/what-is-the-fastest-way-to-calculate-a-windows-folders-size/12665904#12665904
|
||||
System.Timers.Timer timer = new System.Timers.Timer(1000 * CalcTime); //实例化Timer类
|
||||
timer.AutoReset = true;
|
||||
//开始计算速度
|
||||
timer.Enabled = true;
|
||||
//Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
|
||||
//Scripting.Folder folder = fso.GetFolder(DownDir);
|
||||
timer.Elapsed += delegate
|
||||
{
|
||||
//采用COM组件获取文件夹的大小,需要引入 "Microsoft Scripting Runtime"
|
||||
//double sizeInBytes = folder.Size;
|
||||
Console.SetCursorPosition(0, 1);
|
||||
//Console.WriteLine("Speed: " + Global.FormatFileSize((sizeInBytes - lastSizeInBytes) / calcTime) + " / s ");
|
||||
Console.Write("Speed: " + Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + " / s".PadRight(70));
|
||||
|
||||
if (Global.HadReadInfo && Global.BYTEDOWN <= Global.STOP_SPEED * 1024 * CalcTime)
|
||||
{
|
||||
stopCount++;
|
||||
Console.SetCursorPosition(0, 1);
|
||||
Console.Write("Speed: " + Global.FormatFileSize((Global.BYTEDOWN) / CalcTime) + " / s [" + stopCount + "]".PadRight(70));
|
||||
|
||||
if (stopCount >= 12)
|
||||
{
|
||||
Global.ShouldStop = true;
|
||||
cts.Cancel();
|
||||
GC.Collect();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stopCount = 0;
|
||||
Global.BYTEDOWN = 0;
|
||||
|
||||
}
|
||||
};
|
||||
cts = new CancellationTokenSource();
|
||||
|
||||
//开始调用下载
|
||||
LOGGER.WriteLine(strings.startDownloading);
|
||||
@@ -200,16 +181,10 @@ namespace N_m3u8DL_CLI
|
||||
sd.Key = firstSeg["key"].Value<string>();
|
||||
sd.Iv = firstSeg["iv"].Value<string>();
|
||||
}
|
||||
try
|
||||
{
|
||||
if (firstSeg["expectByte"] != null)
|
||||
sd.ExpectByte = firstSeg["expectByte"].Value<long>();
|
||||
}
|
||||
catch (Exception) { }
|
||||
try
|
||||
{
|
||||
if (firstSeg["startByte"] != null)
|
||||
sd.StartByte = firstSeg["startByte"].Value<long>();
|
||||
}
|
||||
catch (Exception) { }
|
||||
sd.Headers = Headers;
|
||||
sd.SavePath = DownDir + "\\Part_" + 0.ToString(partsPadZero) + "\\" + firstSeg["index"].Value<int>().ToString(segsPadZero) + ".tsdownloading";
|
||||
if (File.Exists(sd.SavePath))
|
||||
@@ -290,16 +265,10 @@ namespace N_m3u8DL_CLI
|
||||
sd.Key = info["key"].Value<string>();
|
||||
sd.Iv = info["iv"].Value<string>();
|
||||
}
|
||||
try
|
||||
{
|
||||
if (firstSeg["expectByte"] != null)
|
||||
sd.ExpectByte = info["expectByte"].Value<long>();
|
||||
}
|
||||
catch (Exception) { }
|
||||
try
|
||||
{
|
||||
if (firstSeg["startByte"] != null)
|
||||
sd.StartByte = info["startByte"].Value<long>();
|
||||
}
|
||||
catch (Exception) { }
|
||||
sd.Headers = Headers;
|
||||
sd.SavePath = DownDir + "\\Part_" + info["part"].Value<int>().ToString(partsPadZero) + "\\" + info["index"].Value<int>().ToString(segsPadZero) + ".tsdownloading";
|
||||
if (File.Exists(sd.SavePath))
|
||||
@@ -327,12 +296,8 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
watcher.WatcherStop();
|
||||
|
||||
//监控文件夹大小变化的收尾工作
|
||||
//停止速度监测
|
||||
timer.Enabled = false;
|
||||
timer.Close();
|
||||
// cleanup COM
|
||||
//System.Runtime.InteropServices.Marshal.ReleaseComObject(folder);
|
||||
//System.Runtime.InteropServices.Marshal.ReleaseComObject(fso);
|
||||
|
||||
//检测是否下完
|
||||
IsComplete(Convert.ToInt32(segCount));
|
||||
@@ -363,14 +328,13 @@ namespace N_m3u8DL_CLI
|
||||
Count++;
|
||||
LOGGER.WriteLine(strings.retryCount + Count + " / " + RetryCount);
|
||||
LOGGER.PrintLine(strings.retryCount + Count + " / " + RetryCount, LOGGER.Warning);
|
||||
Thread.Sleep(3000);
|
||||
GC.Collect(); //垃圾回收
|
||||
Thread.Sleep(6000);
|
||||
DoDownload();
|
||||
}
|
||||
}
|
||||
else //开始合并
|
||||
{
|
||||
LOGGER.PrintLine(strings.downloadComplete + (DisableIntegrityCheck ? "("+strings.disableIntegrityCheck+")" : ""));
|
||||
LOGGER.PrintLine(strings.downloadComplete + (DisableIntegrityCheck ? "(" + strings.disableIntegrityCheck + ")" : ""));
|
||||
Console.WriteLine();
|
||||
if (NoMerge == false)
|
||||
{
|
||||
@@ -539,7 +503,7 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
FFmpeg.OutPutPath = Path.Combine(Directory.GetParent(DownDir).FullName, DownName);
|
||||
FFmpeg.ReportFile = driverName + "\\:" + exePath.Remove(0, exePath.IndexOf(':') + 1).Replace("\\", "/") + "/Logs/" + Path.GetFileNameWithoutExtension(LOGGER.LOGFILE) + fflogName;
|
||||
|
||||
|
||||
//合并分段
|
||||
LOGGER.PrintLine(strings.startMerging);
|
||||
for (int i = 0; i < PartsCount; i++)
|
||||
@@ -640,7 +604,7 @@ namespace N_m3u8DL_CLI
|
||||
parser.DownDir = Path.Combine(Path.GetDirectoryName(DownDir), parser.DownName);
|
||||
LOGGER.WriteLine(strings.startParsing + externalAudioUrl);
|
||||
LOGGER.WriteLine(strings.downloadingExternalAudioTrack);
|
||||
DownName = DownName + "(Audio)";
|
||||
DownName = parser.DownName;
|
||||
fflogName = "_ffreport(Audio).log";
|
||||
DownDir = parser.DownDir;
|
||||
parser.Parse(); //开始解析
|
||||
|
@@ -30,7 +30,8 @@ namespace N_m3u8DL_CLI
|
||||
|
||||
|
||||
/*===============================================================================*/
|
||||
static string nowVer = "2.8.2";
|
||||
static Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
||||
static string nowVer = $"{ver.Major}.{ver.Minor}.{ver.Build}";
|
||||
static string nowDate = "20201122";
|
||||
public static void WriteInit()
|
||||
{
|
||||
|
@@ -286,4 +286,5 @@
|
||||
- GIF HEADER检测
|
||||
- 修复BUG
|
||||
2020年11月22日
|
||||
- 解决HTTPS协议自动重定向后,Referer丢失问题
|
||||
- 解决HTTPS协议自动重定向后,Referer丢失问题
|
||||
- 新的任务速度监控逻辑
|
Reference in New Issue
Block a user