优化进度显示 增加预计大小计算

This commit is contained in:
nilaoda 2022-12-03 23:06:44 +08:00
parent 00c6d58a25
commit 72ea3c996f
6 changed files with 93 additions and 16 deletions

View File

@ -96,6 +96,40 @@ namespace N_m3u8DL_RE.Common.Entity
return returnStr.TrimEnd().TrimEnd('|').TrimEnd(); return returnStr.TrimEnd().TrimEnd('|').TrimEnd();
} }
public string ToShortShortString()
{
var prefixStr = "";
var returnStr = "";
var encStr = string.Empty;
if (MediaType == Enum.MediaType.AUDIO)
{
prefixStr = $"[deepskyblue3]Aud[/] {encStr}";
var d = $"{(Bandwidth != null ? (Bandwidth / 1000) + " Kbps" : "")} | {Name} | {Language} | {(Channels != null ? Channels + "CH" : "")}";
returnStr = d.EscapeMarkup();
}
else if (MediaType == Enum.MediaType.SUBTITLES)
{
prefixStr = $"[deepskyblue3_1]Sub[/] {encStr}";
var d = $"{Language} | {Name} | {Codecs}";
returnStr = d.EscapeMarkup();
}
else
{
prefixStr = $"[aqua]Vid[/] {encStr}";
var d = $"{Resolution} | {Bandwidth / 1000} Kbps | {FrameRate} | {VideoRange}";
returnStr = d.EscapeMarkup();
}
returnStr = prefixStr + returnStr.Trim().Trim('|').Trim();
while (returnStr.Contains("| |"))
{
returnStr = returnStr.Replace("| |", "|");
}
return returnStr.TrimEnd().TrimEnd('|').TrimEnd();
}
public override string ToString() public override string ToString()
{ {
var prefixStr = ""; var prefixStr = "";

View File

@ -59,7 +59,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.INFO) if (LogLevel >= LogLevel.INFO)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline #548c26]INFO[/] : "; var write = GetCurrTime() + " " + "[underline #548c26]INFO[/] : ";
HandleLog(write, data); HandleLog(write, data);
} }
} }
@ -69,7 +69,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.INFO) if (LogLevel >= LogLevel.INFO)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline #548c26]INFO[/] : " + data; var write = GetCurrTime() + " " + "[underline #548c26]INFO[/] : " + data;
HandleLog(write); HandleLog(write);
} }
} }
@ -79,7 +79,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.DEBUG) if (LogLevel >= LogLevel.DEBUG)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline grey]DEBUG[/] : "; var write = GetCurrTime() + " " + "[underline grey]DEBUG[/]: ";
HandleLog(write, data); HandleLog(write, data);
} }
} }
@ -89,7 +89,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.DEBUG) if (LogLevel >= LogLevel.DEBUG)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline grey]DEBUG[/] : " + data; var write = GetCurrTime() + " " + "[underline grey]DEBUG[/]: " + data;
HandleLog(write); HandleLog(write);
} }
} }
@ -99,7 +99,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.WARN) if (LogLevel >= LogLevel.WARN)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline #a89022]WARN[/] : "; var write = GetCurrTime() + " " + "[underline #a89022]WARN[/] : ";
HandleLog(write, data); HandleLog(write, data);
} }
} }
@ -109,7 +109,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.WARN) if (LogLevel >= LogLevel.WARN)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline #a89022]WARN[/] : " + data; var write = GetCurrTime() + " " + "[underline #a89022]WARN[/] : " + data;
HandleLog(write); HandleLog(write);
} }
} }
@ -119,7 +119,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.ERROR) if (LogLevel >= LogLevel.ERROR)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline red1]ERROR[/] : "; var write = GetCurrTime() + " " + "[underline red1]ERROR[/]: ";
HandleLog(write, data); HandleLog(write, data);
} }
} }
@ -129,7 +129,7 @@ namespace N_m3u8DL_RE.Common.Log
if (LogLevel >= LogLevel.ERROR) if (LogLevel >= LogLevel.ERROR)
{ {
data = ReplaceVars(data, ps); data = ReplaceVars(data, ps);
var write = GetCurrTime() + " " + "[underline red1]ERROR[/] : " + data; var write = GetCurrTime() + " " + "[underline red1]ERROR[/]: " + data;
HandleLog(write); HandleLog(write);
} }
} }

View File

@ -73,7 +73,7 @@ namespace N_m3u8DL_RE.Parser.Processor.HLS
var bytes = HTTPUtil.GetBytesAsync(segUrl, parserConfig.Headers).Result; var bytes = HTTPUtil.GetBytesAsync(segUrl, parserConfig.Headers).Result;
encryptInfo.Key = bytes; encryptInfo.Key = bytes;
} }
catch (Exception _ex) catch (Exception _ex) when (!_ex.Message.Contains("scheme is not supported."))
{ {
Logger.WarnMarkUp($"[grey]{_ex.Message.EscapeMarkup()} retryCount: {retryCount}[/]"); Logger.WarnMarkUp($"[grey]{_ex.Message.EscapeMarkup()} retryCount: {retryCount}[/]");
Thread.Sleep(1000); Thread.Sleep(1000);

View File

@ -0,0 +1,36 @@
using N_m3u8DL_RE.Common.Util;
using Spectre.Console;
using Spectre.Console.Rendering;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace N_m3u8DL_RE.Column
{
internal class DownloadStatusColumn : ProgressColumn
{
protected override bool NoWrap => true;
private ConcurrentDictionary<int, long> DownloadedSizeDic = new();
public Style MyStyle { get; set; } = new Style(foreground: Color.DarkCyan);
public Style FinishedStyle { get; set; } = new Style(foreground: Color.Green);
public DownloadStatusColumn(ConcurrentDictionary<int, long> downloadedSizeDic)
{
this.DownloadedSizeDic = downloadedSizeDic;
}
public override IRenderable Render(RenderContext context, ProgressTask task, TimeSpan deltaTime)
{
var done = task.IsFinished;
var flag = DownloadedSizeDic.TryGetValue(task.Id, out var size);
var totalSize = flag ? (size / (task.Value / task.MaxValue)) : 0;
var sizeStr = size == 0 ? "" : $"{GlobalUtil.FormatFileSize(flag ? size : 0)}/{GlobalUtil.FormatFileSize(totalSize)}";
if (done) sizeStr = GlobalUtil.FormatFileSize(totalSize);
return new Markup(sizeStr, MyStyle).RightAligned();
}
}
}

View File

@ -18,7 +18,7 @@ namespace N_m3u8DL_RE.CommandLine
{ {
internal partial class CommandInvoker internal partial class CommandInvoker
{ {
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20221202"; public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20221203";
[GeneratedRegex("((best|worst)\\d*|all)")] [GeneratedRegex("((best|worst)\\d*|all)")]
private static partial Regex ForStrRegex(); private static partial Regex ForStrRegex();

View File

@ -98,7 +98,7 @@ namespace N_m3u8DL_RE.DownloadManager
} }
private async Task<bool> DownloadStreamAsync(StreamSpec streamSpec, ProgressTask task, SpeedContainer speedContainer) private async Task<bool> DownloadStreamAsync(StreamSpec streamSpec, ProgressTask task, SpeedContainer speedContainer, ConcurrentDictionary<int, long> sizeDic)
{ {
speedContainer.ResetVars(); speedContainer.ResetVars();
bool useAACFilter = false; //ffmpeg合并flag bool useAACFilter = false; //ffmpeg合并flag
@ -166,6 +166,7 @@ namespace N_m3u8DL_RE.DownloadManager
} }
mp4InitFile = result.ActualFilePath; mp4InitFile = result.ActualFilePath;
task.Increment(1); task.Increment(1);
sizeDic[task.Id] += result.ActualContentLength ?? 0;
//读取mp4信息 //读取mp4信息
if (result != null && result.Success) if (result != null && result.Success)
@ -214,6 +215,7 @@ namespace N_m3u8DL_RE.DownloadManager
throw new Exception("Download first segment failed!"); throw new Exception("Download first segment failed!");
} }
task.Increment(1); task.Increment(1);
sizeDic[task.Id] += result.ActualContentLength ?? 0;
if (result != null && result.Success) if (result != null && result.Success)
{ {
//修复MSS init //修复MSS init
@ -277,6 +279,7 @@ namespace N_m3u8DL_RE.DownloadManager
var result = await Downloader.DownloadSegmentAsync(seg, path, speedContainer, headers); var result = await Downloader.DownloadSegmentAsync(seg, path, speedContainer, headers);
FileDic[seg] = result; FileDic[seg] = result;
task.Increment(1); task.Increment(1);
sizeDic[task.Id] += result.ActualContentLength ?? 0;
//实时解密 //实时解密
if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && result != null && result.Success && !string.IsNullOrEmpty(currentKID)) if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && result != null && result.Success && !string.IsNullOrEmpty(currentKID))
{ {
@ -630,6 +633,7 @@ namespace N_m3u8DL_RE.DownloadManager
public async Task<bool> StartDownloadAsync() public async Task<bool> StartDownloadAsync()
{ {
ConcurrentDictionary<int, long> DownloadedSizeDic = new(); //大小计算
ConcurrentDictionary<int, SpeedContainer> SpeedContainerDic = new(); //速度计算 ConcurrentDictionary<int, SpeedContainer> SpeedContainerDic = new(); //速度计算
ConcurrentDictionary<StreamSpec, bool?> Results = new(); ConcurrentDictionary<StreamSpec, bool?> Results = new();
@ -639,12 +643,13 @@ namespace N_m3u8DL_RE.DownloadManager
progress.Columns(new ProgressColumn[] progress.Columns(new ProgressColumn[]
{ {
new TaskDescriptionColumn() { Alignment = Justify.Left }, new TaskDescriptionColumn() { Alignment = Justify.Left },
new ProgressBarColumn(), new ProgressBarColumn() { Width = 30 },
new PercentageColumn(), new PercentageColumn(),
new DownloadStatusColumn(DownloadedSizeDic),
new DownloadSpeedColumn(SpeedContainerDic), //速度计算 new DownloadSpeedColumn(SpeedContainerDic), //速度计算
new RemainingTimeColumn(), new RemainingTimeColumn(),
new SpinnerColumn(), new SpinnerColumn(),
}); }) ;
if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && !DownloaderConfig.MyOptions.UseShakaPackager if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && !DownloaderConfig.MyOptions.UseShakaPackager
&& DownloaderConfig.MyOptions.Keys != null && DownloaderConfig.MyOptions.Keys.Length > 0) && DownloaderConfig.MyOptions.Keys != null && DownloaderConfig.MyOptions.Keys.Length > 0)
@ -655,8 +660,10 @@ namespace N_m3u8DL_RE.DownloadManager
//创建任务 //创建任务
var dic = SelectedSteams.Select(item => var dic = SelectedSteams.Select(item =>
{ {
var task = ctx.AddTask(item.ToShortString(), autoStart: false); var description = item.ToShortShortString();
var task = ctx.AddTask(description, autoStart: false);
SpeedContainerDic[task.Id] = new SpeedContainer(); //速度计算 SpeedContainerDic[task.Id] = new SpeedContainer(); //速度计算
DownloadedSizeDic[task.Id] = 0; //大小计算
return (item, task); return (item, task);
}).ToDictionary(item => item.item, item => item.task); }).ToDictionary(item => item.item, item => item.task);
@ -666,7 +673,7 @@ namespace N_m3u8DL_RE.DownloadManager
foreach (var kp in dic) foreach (var kp in dic)
{ {
var task = kp.Value; var task = kp.Value;
var result = await DownloadStreamAsync(kp.Key, task, SpeedContainerDic[task.Id]); var result = await DownloadStreamAsync(kp.Key, task, SpeedContainerDic[task.Id], DownloadedSizeDic);
Results[kp.Key] = result; Results[kp.Key] = result;
} }
} }
@ -676,7 +683,7 @@ namespace N_m3u8DL_RE.DownloadManager
await Parallel.ForEachAsync(dic, async (kp, _) => await Parallel.ForEachAsync(dic, async (kp, _) =>
{ {
var task = kp.Value; var task = kp.Value;
var result = await DownloadStreamAsync(kp.Key, task, SpeedContainerDic[task.Id]); var result = await DownloadStreamAsync(kp.Key, task, SpeedContainerDic[task.Id], DownloadedSizeDic);
Results[kp.Key] = result; Results[kp.Key] = result;
}); });
} }