Skip to content

Commit 22b103a

Browse files
authored
Merge branch 'nilaoda:main' into main
2 parents 04e7d40 + 7014cba commit 22b103a

File tree

7 files changed

+53
-41
lines changed

7 files changed

+53
-41
lines changed

src/N_m3u8DL-RE.Parser/Extractor/DASHExtractor2.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,14 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
312312
var initialization = segmentTemplate.Attribute("initialization")?.Value ?? segmentTemplateOuter.Attribute("initialization")?.Value;
313313
if (initialization != null)
314314
{
315-
var initUrl = ParserUtil.ReplaceVars(ParserUtil.CombineURL(segBaseUrl, initialization), varDic);
315+
var _init = ParserUtil.ReplaceVars(initialization, varDic);
316+
var initUrl = ParserUtil.CombineURL(segBaseUrl, _init);
316317
streamSpec.Playlist.MediaInit = new MediaSegment();
317318
streamSpec.Playlist.MediaInit.Index = -1; //便于排序
318319
streamSpec.Playlist.MediaInit.Url = initUrl;
319320
}
320321
//处理分片
321-
var media = segmentTemplate.Attribute("media")?.Value ?? segmentTemplateOuter.Attribute("media")?.Value;
322+
var mediaTemplate = segmentTemplate.Attribute("media")?.Value ?? segmentTemplateOuter.Attribute("media")?.Value;
322323
var segmentTimeline = segmentTemplate.Elements().Where(e => e.Name.LocalName == "SegmentTimeline").FirstOrDefault();
323324
if (segmentTimeline != null)
324325
{
@@ -340,11 +341,12 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
340341
var _repeatCount = Convert.ToInt64(_repeatCountStr);
341342
varDic[DASHTags.TemplateTime] = currentTime;
342343
varDic[DASHTags.TemplateNumber] = segNumber++;
343-
var oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
344-
var mediaUrl = ParserUtil.ReplaceVars(oriUrl, varDic);
344+
var hasTime = mediaTemplate!.Contains(DASHTags.TemplateTime);
345+
var media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
346+
var mediaUrl = ParserUtil.CombineURL(segBaseUrl, media!);
345347
MediaSegment mediaSegment = new();
346348
mediaSegment.Url = mediaUrl;
347-
if (oriUrl.Contains(DASHTags.TemplateTime))
349+
if (hasTime)
348350
mediaSegment.NameFromVar = currentTime.ToString();
349351
mediaSegment.Duration = _duration / (double)timescale;
350352
mediaSegment.Index = segIndex++;
@@ -360,12 +362,13 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
360362
MediaSegment _mediaSegment = new();
361363
varDic[DASHTags.TemplateTime] = currentTime;
362364
varDic[DASHTags.TemplateNumber] = segNumber++;
363-
var _oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
364-
var _mediaUrl = ParserUtil.ReplaceVars(_oriUrl, varDic);
365+
var _hashTime = mediaTemplate!.Contains(DASHTags.TemplateTime);
366+
var _media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
367+
var _mediaUrl = ParserUtil.CombineURL(segBaseUrl, _media);
365368
_mediaSegment.Url = _mediaUrl;
366369
_mediaSegment.Index = segIndex++;
367370
_mediaSegment.Duration = _duration / (double)timescale;
368-
if (_oriUrl.Contains(DASHTags.TemplateTime))
371+
if (_hashTime)
369372
_mediaSegment.NameFromVar = currentTime.ToString();
370373
streamSpec.Playlist.MediaParts[0].MediaSegments.Add(_mediaSegment);
371374
}
@@ -396,11 +399,12 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
396399
for (long index = startNumber, segIndex = 0; index < startNumber + totalNumber; index++, segIndex++)
397400
{
398401
varDic[DASHTags.TemplateNumber] = index;
399-
var oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
400-
var mediaUrl = ParserUtil.ReplaceVars(oriUrl, varDic);
402+
var hasNumber = mediaTemplate!.Contains(DASHTags.TemplateNumber);
403+
var media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
404+
var mediaUrl = ParserUtil.CombineURL(segBaseUrl, media!);
401405
MediaSegment mediaSegment = new();
402406
mediaSegment.Url = mediaUrl;
403-
if (oriUrl.Contains(DASHTags.TemplateNumber))
407+
if (hasNumber)
404408
mediaSegment.NameFromVar = index.ToString();
405409
mediaSegment.Index = isLive ? index : segIndex; //直播直接用startNumber
406410
mediaSegment.Duration = duration / (double)timescale;

src/N_m3u8DL-RE.Parser/Extractor/HLSExtractor.cs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ internal class HLSExtractor : IExtractor
2323
private string BaseUrl = string.Empty;
2424
private string M3u8Content = string.Empty;
2525
private bool MasterM3u8Flag = false;
26-
private bool FirstFetchFlag = true;
2726

2827
public ParserConfig ParserConfig { get; set; }
2928

@@ -84,14 +83,10 @@ public string PreProcessUrl(string url)
8483
return url;
8584
}
8685

87-
private bool IsMaster()
88-
{
89-
MasterM3u8Flag = M3u8Content.Contains(HLSTags.ext_x_stream_inf);
90-
return MasterM3u8Flag;
91-
}
92-
9386
private async Task<List<StreamSpec>> ParseMasterListAsync()
9487
{
88+
MasterM3u8Flag = true;
89+
9590
List<StreamSpec> streams = new List<StreamSpec>();
9691

9792
using StringReader sr = new StringReader(M3u8Content);
@@ -475,7 +470,7 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
475470
{
476471
this.M3u8Content = rawText;
477472
this.PreProcessContent();
478-
if (IsMaster())
473+
if (M3u8Content.Contains(HLSTags.ext_x_stream_inf))
479474
{
480475
Logger.Warn(ResString.masterM3u8Found);
481476
var lists = await ParseMasterListAsync();
@@ -523,30 +518,44 @@ private async Task LoadM3u8FromUrlAsync(string url)
523518
this.PreProcessContent();
524519
}
525520

526-
public async Task FetchPlayListAsync(List<StreamSpec> lists)
521+
/// <summary>
522+
/// 从Master链接中刷新各个流的URL
523+
/// </summary>
524+
/// <param name="lists"></param>
525+
/// <returns></returns>
526+
private async Task RefreshUrlFromMaster(List<StreamSpec> lists)
527527
{
528-
//首次加载不需要刷新URL
529-
if (!FirstFetchFlag && MasterM3u8Flag)
528+
//重新加载master m3u8, 刷新选中流的URL
529+
await LoadM3u8FromUrlAsync(ParserConfig.Url);
530+
var newStreams = await ParseMasterListAsync();
531+
newStreams = newStreams.DistinctBy(p => p.Url).ToList();
532+
foreach (var l in lists)
530533
{
531-
//重新加载master m3u8, 刷新选中流的URL
532-
await LoadM3u8FromUrlAsync(ParserConfig.Url);
533-
var newStreams = await ParseMasterListAsync();
534-
newStreams = newStreams.DistinctBy(p => p.Url).ToList();
535-
foreach (var l in lists)
534+
var match = newStreams.Where(n => n.ToShortString() == l.ToShortString());
535+
if (match.Any())
536536
{
537-
var match = newStreams.Where(n => n.ToShortString() == l.ToShortString());
538-
if (match.Any())
539-
{
540-
Logger.DebugMarkUp($"{l.Url} => {match.First().Url}");
541-
l.Url = match.First().Url;
542-
}
537+
Logger.DebugMarkUp($"{l.Url} => {match.First().Url}");
538+
l.Url = match.First().Url;
543539
}
544540
}
541+
}
545542

543+
public async Task FetchPlayListAsync(List<StreamSpec> lists)
544+
{
546545
for (int i = 0; i < lists.Count; i++)
547546
{
548-
//重新加载m3u8
549-
await LoadM3u8FromUrlAsync(lists[i].Url!);
547+
try
548+
{
549+
//直接重新加载m3u8
550+
await LoadM3u8FromUrlAsync(lists[i].Url!);
551+
}
552+
catch (HttpRequestException) when (MasterM3u8Flag == true)
553+
{
554+
Logger.WarnMarkUp("Can not load m3u8. Try refreshing url from master url...");
555+
//当前URL无法加载 尝试从Master链接中刷新URL
556+
await RefreshUrlFromMaster(lists);
557+
await LoadM3u8FromUrlAsync(lists[i].Url!);
558+
}
550559

551560
var newPlaylist = await ParseListAsync();
552561
if (lists[i].Playlist?.MediaInit != null)
@@ -570,7 +579,6 @@ public async Task FetchPlayListAsync(List<StreamSpec> lists)
570579

571580
public async Task RefreshPlayListAsync(List<StreamSpec> streamSpecs)
572581
{
573-
FirstFetchFlag = false;
574582
await FetchPlayListAsync(streamSpecs);
575583
}
576584
}

src/N_m3u8DL-RE/CommandLine/CommandInvoker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace N_m3u8DL_RE.CommandLine
1818
{
1919
internal partial class CommandInvoker
2020
{
21-
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20221220";
21+
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20230111";
2222

2323
[GeneratedRegex("((best|worst)\\d*|all)")]
2424
private static partial Regex ForStrRegex();

src/N_m3u8DL-RE/DownloadManager/HTTPLiveRecordManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ private async Task<bool> RecordStreamAsync(StreamSpec streamSpec, ProgressTask t
5757
task.StartTask();
5858

5959
var name = streamSpec.ToShortString();
60-
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
60+
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{OtherUtil.GetValidFileName(streamSpec.GroupId ?? "", "-")}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
6161
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
6262
var saveName = DownloaderConfig.MyOptions.SaveName != null ? $"{DownloaderConfig.MyOptions.SaveName}.{streamSpec.Language}".TrimEnd('.') : dirName;
6363

src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private async Task<bool> DownloadStreamAsync(StreamSpec streamSpec, ProgressTask
110110
if (segments.Count() == 1) speedContainer.SingleSegment = true;
111111

112112
var type = streamSpec.MediaType ?? Common.Enum.MediaType.VIDEO;
113-
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
113+
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{OtherUtil.GetValidFileName(streamSpec.GroupId ?? "", "-")}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
114114
var tmpDir = Path.Combine(DownloaderConfig.MyOptions.TmpDir ?? Environment.CurrentDirectory, dirName);
115115
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
116116
var saveName = DownloaderConfig.MyOptions.SaveName != null ? $"{DownloaderConfig.MyOptions.SaveName}.{streamSpec.Language}".TrimEnd('.') : dirName;

src/N_m3u8DL-RE/DownloadManager/SimpleLiveRecordManager2.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ private async Task<bool> RecordStreamAsync(StreamSpec streamSpec, ProgressTask t
181181

182182
var name = streamSpec.ToShortString();
183183
var type = streamSpec.MediaType ?? Common.Enum.MediaType.VIDEO;
184-
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
184+
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{OtherUtil.GetValidFileName(streamSpec.GroupId ?? "", "-")}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
185185
var tmpDir = Path.Combine(DownloaderConfig.MyOptions.TmpDir ?? Environment.CurrentDirectory, dirName);
186186
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
187187
var saveName = DownloaderConfig.MyOptions.SaveName != null ? DownloaderConfig.MyOptions.SaveName : dirName;

src/N_m3u8DL-RE/N_m3u8DL-RE.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<ImplicitUsings>enable</ImplicitUsings>
88
<LangVersion>preview</LangVersion>
99
<Nullable>enable</Nullable>
10-
<Version>0.1.5.2</Version>
10+
<Version>0.1.5.3</Version>
1111
<Platforms>AnyCPU;x64</Platforms>
1212
</PropertyGroup>
1313

0 commit comments

Comments
 (0)