diff --git a/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs b/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs index 5c2b59c..2c93f7f 100644 --- a/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs +++ b/src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs @@ -36,9 +36,11 @@ namespace N_m3u8DL_RE.DownloadManager DateTime? PublishDateTime; bool STOP_FLAG = false; int WAIT_SEC = 0; //刷新间隔 - ConcurrentDictionary RecordingDurDic = new(); //已录制时长 + ConcurrentDictionary RecordedDurDic = new(); //已录制时长 + ConcurrentDictionary RefreshedDurDic = new(); //已刷新出的时长 ConcurrentDictionary>> BlockDic = new(); //各流的Block ConcurrentDictionary SamePathDic = new(); //各流是否allSamePath + ConcurrentDictionary RecordLimitReachedDic = new(); //各流是否达到上限 ConcurrentDictionary LastFileNameDic = new(); //上次下载的文件名 ConcurrentDictionary MaxIndexDic = new(); //最大Index ConcurrentDictionary DateTimeDic = new(); //上次下载的dateTime @@ -194,7 +196,7 @@ namespace N_m3u8DL_RE.DownloadManager if (!Directory.Exists(tmpDir)) Directory.CreateDirectory(tmpDir); if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir); - while (!STOP_FLAG && await source.OutputAvailableAsync()) + while (true && await source.OutputAvailableAsync()) { //接收新片段 且总是拿全部未处理的片段 //有时每次只有很少的片段,但是之前的片段下载慢,导致后面还没下载的片段都失效了 @@ -450,7 +452,7 @@ namespace N_m3u8DL_RE.DownloadManager //手动计算MPEGTS if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0) { - vtt.MpegtsTimestamp = 90000 * (RecordingDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration)); + vtt.MpegtsTimestamp = 90000 * (RecordedDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration)); } currentVtt.AddCuesFromOne(vtt); } @@ -496,14 +498,14 @@ namespace N_m3u8DL_RE.DownloadManager //手动计算MPEGTS if (currentVtt.MpegtsTimestamp == 0 && vtt.MpegtsTimestamp == 0) { - vtt.MpegtsTimestamp = 90000 * (RecordingDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration)); + vtt.MpegtsTimestamp = 90000 * (RecordedDurDic[task.Id] + (long)keys.Where(s => s.Index < seg.Index).Sum(s => s.Duration)); } currentVtt.AddCuesFromOne(vtt); } } } - RecordingDurDic[task.Id] += (int)segmentsDuration; + RecordedDurDic[task.Id] += (int)segmentsDuration; /*//写出m3u8 if (DownloaderConfig.MyOptions.LiveWriteHLS) @@ -639,13 +641,8 @@ namespace N_m3u8DL_RE.DownloadManager } } - //检测时长限制 - if (!STOP_FLAG && RecordingDurDic.All(d => d.Value >= DownloaderConfig.MyOptions.LiveRecordLimit?.TotalSeconds)) - { - Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimitReached}[/]"); - STOP_FLAG = true; - CancellationTokenSource.Cancel(); - } + if (STOP_FLAG) + break; } if (fileOutputStream != null) @@ -683,6 +680,11 @@ namespace N_m3u8DL_RE.DownloadManager { var streamSpec = dic.Key; var task = dic.Value; + + //达到上限时 不需要刷新了 + if (RecordLimitReachedDic[task.Id]) + return; + var allHasDatetime = streamSpec.Playlist!.MediaParts[0].MediaSegments.All(s => s.DateTime != null); if (!SamePathDic.ContainsKey(task.Id)) { @@ -703,6 +705,26 @@ namespace N_m3u8DL_RE.DownloadManager //尝试更新时间戳 var dt = newList.Last().DateTime; DateTimeDic[task.Id] = dt != null ? GetUnixTimestamp(dt.Value) : 0L; + //累加已获取到的时长 + RefreshedDurDic[task.Id] += (int)newList.Sum(s => s.Duration); + } + + if (!STOP_FLAG && RefreshedDurDic[task.Id] >= DownloaderConfig.MyOptions.LiveRecordLimit?.TotalSeconds) + { + RecordLimitReachedDic[task.Id] = true; + } + + //检测时长限制 + if (!STOP_FLAG && RecordLimitReachedDic.Values.All(x => x == true)) + { + Logger.WarnMarkUp($"[darkorange3_1]{ResString.liveLimitReached}[/]"); + STOP_FLAG = true; + CancellationTokenSource.Cancel(); + + foreach (var target in BlockDic.Values) + { + target.Complete(); + } } }); @@ -724,11 +746,6 @@ namespace N_m3u8DL_RE.DownloadManager } } } - - foreach (var target in BlockDic.Values) - { - target.Complete(); - } } private void FilterMediaSegments(StreamSpec streamSpec, ProgressTask task, bool allHasDatetime, bool allSamePath) @@ -808,7 +825,7 @@ namespace N_m3u8DL_RE.DownloadManager progress.Columns(new ProgressColumn[] { new TaskDescriptionColumn() { Alignment = Justify.Left }, - new RecordingDurationColumn(RecordingDurDic), //时长显示 + new RecordingDurationColumn(RecordedDurDic), //时长显示 new RecordingStatusColumn(), new PercentageColumn(), new DownloadSpeedColumn(SpeedContainerDic), //速度计算 @@ -823,8 +840,10 @@ namespace N_m3u8DL_RE.DownloadManager var task = ctx.AddTask(item.ToShortShortString(), autoStart: false, maxValue: 0); SpeedContainerDic[task.Id] = new SpeedContainer(); //速度计算 LastFileNameDic[task.Id] = ""; + RecordLimitReachedDic[task.Id] = false; DateTimeDic[task.Id] = 0L; - RecordingDurDic[task.Id] = 0; + RecordedDurDic[task.Id] = 0; + RefreshedDurDic[task.Id] = 0; MaxIndexDic[task.Id] = item.Playlist?.MediaParts[0].MediaSegments.LastOrDefault()?.Index ?? 0L; //最大Index BlockDic[task.Id] = new BufferBlock>(); return (item, task);