修复直播过滤已下载片段的逻辑

This commit is contained in:
nilaoda 2022-10-17 22:54:42 +08:00
parent 329632808b
commit 9ad3b9edb1
6 changed files with 27 additions and 14 deletions

View File

@ -71,6 +71,7 @@ namespace N_m3u8DL_RE.Common.Resource
public static string cmd_muxAfterDone_more { get => GetText("cmd_muxAfterDone_more"); } public static string cmd_muxAfterDone_more { get => GetText("cmd_muxAfterDone_more"); }
public static string cmd_writeMetaJson { get => GetText("cmd_writeMetaJson"); } public static string cmd_writeMetaJson { get => GetText("cmd_writeMetaJson"); }
public static string liveLimit { get => GetText("liveLimit"); } public static string liveLimit { get => GetText("liveLimit"); }
public static string realTimeDecMessage { get => GetText("realTimeDecMessage"); }
public static string liveLimitReached { get => GetText("liveLimitReached"); } public static string liveLimitReached { get => GetText("liveLimitReached"); }
public static string saveName { get => GetText("saveName"); } public static string saveName { get => GetText("saveName"); }
public static string partMerge { get => GetText("partMerge"); } public static string partMerge { get => GetText("partMerge"); }

View File

@ -499,6 +499,12 @@ namespace N_m3u8DL_RE.Common.Resource
zhTW: "本次直播錄製時長上限: ", zhTW: "本次直播錄製時長上限: ",
enUS: "Live recording duration limit: " enUS: "Live recording duration limit: "
), ),
["realTimeDecMessage"] = new TextContainer
(
zhCN: "启用实时解密时建议用shaka-packager而非mp4decrypt",
zhTW: "啟用即時解密時建議用shaka-packager而非mp4decrypt",
enUS: "When enabling real-time decryption, it is recommended to use shaka-packager instead of mp4decrypt"
),
["liveLimitReached"] = new TextContainer ["liveLimitReached"] = new TextContainer
( (
zhCN: "到达直播录制上限,即将停止录制", zhCN: "到达直播录制上限,即将停止录制",

View File

@ -525,7 +525,7 @@ namespace N_m3u8DL_RE.Parser.Extractor
} }
} }
} }
else if (lists.Count == 1 && ParserConfig.OriginalUrl != lists[0].Url) else if (!MasterM3u8Flag && lists.Count == 1 && ParserConfig.OriginalUrl != lists[0].Url)
{ {
//单m3u8, 但是发生了重定向, 则应从原始URL开始解析 //单m3u8, 但是发生了重定向, 则应从原始URL开始解析
lists[0].Url = ParserConfig.OriginalUrl; lists[0].Url = ParserConfig.OriginalUrl;

View File

@ -589,6 +589,10 @@ namespace N_m3u8DL_RE.DownloadManager
new SpinnerColumn(), new SpinnerColumn(),
}); });
if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && !DownloaderConfig.MyOptions.UseShakaPackager
&& DownloaderConfig.MyOptions.Keys != null && DownloaderConfig.MyOptions.Keys.Length > 0)
Logger.WarnMarkUp($"[darkorange3_1]{ResString.realTimeDecMessage}[/]");
await progress.StartAsync(async ctx => await progress.StartAsync(async ctx =>
{ {
//创建任务 //创建任务

View File

@ -29,7 +29,7 @@ namespace N_m3u8DL_RE.DownloadManager
bool STOP_FLAG = false; bool STOP_FLAG = false;
int WAIT_SEC = 0; //刷新间隔 int WAIT_SEC = 0; //刷新间隔
ConcurrentDictionary<int, int> RecordingDurDic = new(); //已录制时长 ConcurrentDictionary<int, int> RecordingDurDic = new(); //已录制时长
ConcurrentDictionary<string, string> LastUrlDic = new(); //上次下载的url ConcurrentDictionary<string, string> LastFileNameDic = new(); //上次下载的文件名
ConcurrentDictionary<string, long> DateTimeDic = new(); //上次下载的dateTime ConcurrentDictionary<string, long> DateTimeDic = new(); //上次下载的dateTime
CancellationTokenSource CancellationTokenSource = new(); //取消Wait CancellationTokenSource CancellationTokenSource = new(); //取消Wait
@ -178,6 +178,7 @@ namespace N_m3u8DL_RE.DownloadManager
//TryReceiveAll可以稍微缓解一下 //TryReceiveAll可以稍微缓解一下
source.TryReceiveAll(out IList<List<MediaSegment>>? segmentsList); source.TryReceiveAll(out IList<List<MediaSegment>>? segmentsList);
var segments = segmentsList!.SelectMany(s => s); var segments = segmentsList!.SelectMany(s => s);
Logger.DebugMarkUp(string.Join(",", segments.Select(sss => GetSegmentName(sss, false))));
//下载init //下载init
if (!initDownloaded && streamSpec.Playlist?.MediaInit != null) if (!initDownloaded && streamSpec.Playlist?.MediaInit != null)
@ -529,15 +530,16 @@ namespace N_m3u8DL_RE.DownloadManager
{ {
if (WAIT_SEC != 0) if (WAIT_SEC != 0)
{ {
var allHasDatetime = streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null);
//过滤不需要下载的片段 //过滤不需要下载的片段
FilterMediaSegments(streamSpec, LastUrlDic[streamSpec.ToShortString()], DateTimeDic[streamSpec.ToShortString()]); FilterMediaSegments(streamSpec, allHasDatetime);
var newList = streamSpec.Playlist!.MediaParts[0].MediaSegments; var newList = streamSpec.Playlist!.MediaParts[0].MediaSegments;
if (newList.Count > 0) if (newList.Count > 0)
{ {
//推送给消费者 //推送给消费者
await target.SendAsync(newList); await target.SendAsync(newList);
//更新最新链接 //更新最新链接
LastUrlDic[streamSpec.ToShortString()] = GetPath(newList.Last().Url); LastFileNameDic[streamSpec.ToShortString()] = GetSegmentName(newList.Last(), allHasDatetime);
//尝试更新时间戳 //尝试更新时间戳
var dt = newList.Last().DateTime; var dt = newList.Last().DateTime;
DateTimeDic[streamSpec.ToShortString()] = dt != null ? GetUnixTimestamp(dt.Value) : 0L; DateTimeDic[streamSpec.ToShortString()] = dt != null ? GetUnixTimestamp(dt.Value) : 0L;
@ -560,11 +562,13 @@ namespace N_m3u8DL_RE.DownloadManager
target.Complete(); target.Complete();
} }
private void FilterMediaSegments(StreamSpec streamSpec, string lastUrl, long dateTime) private void FilterMediaSegments(StreamSpec streamSpec, bool allHasDatetime)
{ {
if (string.IsNullOrEmpty(lastUrl) && dateTime == 0) return; if (string.IsNullOrEmpty(LastFileNameDic[streamSpec.ToShortString()]) && DateTimeDic[streamSpec.ToShortString()] == 0) return;
var index = -1; var index = -1;
var dateTime = DateTimeDic[streamSpec.ToShortString()];
var lastName = LastFileNameDic[streamSpec.ToShortString()];
//优先使用dateTime判断 //优先使用dateTime判断
if (dateTime != 0 && streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null)) if (dateTime != 0 && streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null))
@ -573,7 +577,7 @@ namespace N_m3u8DL_RE.DownloadManager
} }
else else
{ {
index = streamSpec.Playlist!.MediaParts[0].MediaSegments.FindIndex(s => GetPath(s.Url) == lastUrl); index = streamSpec.Playlist!.MediaParts[0].MediaSegments.FindIndex(s => GetSegmentName(s, allHasDatetime) == lastName);
} }
if (index > -1) if (index > -1)
@ -582,11 +586,6 @@ namespace N_m3u8DL_RE.DownloadManager
} }
} }
private string GetPath(string url)
{
return url.Split('?').First();
}
public async Task<bool> StartRecordAsync() public async Task<bool> StartRecordAsync()
{ {
var takeLastCount = 15; var takeLastCount = 15;
@ -604,7 +603,7 @@ namespace N_m3u8DL_RE.DownloadManager
//初始化dic //初始化dic
foreach (var item in SelectedSteams) foreach (var item in SelectedSteams)
{ {
LastUrlDic[item.ToShortString()] = ""; LastFileNameDic[item.ToShortString()] = "";
DateTimeDic[item.ToShortString()] = 0L; DateTimeDic[item.ToShortString()] = 0L;
} }
//设置等待时间 //设置等待时间
@ -645,6 +644,9 @@ namespace N_m3u8DL_RE.DownloadManager
DownloaderConfig.MyOptions.ConcurrentDownload = true; DownloaderConfig.MyOptions.ConcurrentDownload = true;
DownloaderConfig.MyOptions.MP4RealTimeDecryption = true; DownloaderConfig.MyOptions.MP4RealTimeDecryption = true;
DownloaderConfig.MyOptions.LiveRecordLimit = DownloaderConfig.MyOptions.LiveRecordLimit ?? TimeSpan.MaxValue; DownloaderConfig.MyOptions.LiveRecordLimit = DownloaderConfig.MyOptions.LiveRecordLimit ?? TimeSpan.MaxValue;
if (DownloaderConfig.MyOptions.MP4RealTimeDecryption && !DownloaderConfig.MyOptions.UseShakaPackager
&& DownloaderConfig.MyOptions.Keys != null && DownloaderConfig.MyOptions.Keys.Length > 0)
Logger.WarnMarkUp($"[darkorange3_1]{ResString.realTimeDecMessage}[/]");
var limit = DownloaderConfig.MyOptions.LiveRecordLimit; var limit = DownloaderConfig.MyOptions.LiveRecordLimit;
if (limit != TimeSpan.MaxValue) if (limit != TimeSpan.MaxValue)
Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimit}{GlobalUtil.FormatTime((int)limit.Value.TotalSeconds)}[/]"); Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimit}{GlobalUtil.FormatTime((int)limit.Value.TotalSeconds)}[/]");

View File

@ -7,7 +7,7 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion> <LangVersion>preview</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<Version>0.0.4</Version> <Version>0.0.5</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>