优化Master的刷新逻辑

This commit is contained in:
nilaoda 2023-01-11 22:57:26 +08:00
parent 418547d5a2
commit 1b1cef9a94
2 changed files with 34 additions and 26 deletions

View File

@ -23,7 +23,6 @@ namespace N_m3u8DL_RE.Parser.Extractor
private string BaseUrl = string.Empty; private string BaseUrl = string.Empty;
private string M3u8Content = string.Empty; private string M3u8Content = string.Empty;
private bool MasterM3u8Flag = false; private bool MasterM3u8Flag = false;
private bool FirstFetchFlag = true;
public ParserConfig ParserConfig { get; set; } public ParserConfig ParserConfig { get; set; }
@ -84,14 +83,10 @@ namespace N_m3u8DL_RE.Parser.Extractor
return url; return url;
} }
private bool IsMaster()
{
MasterM3u8Flag = M3u8Content.Contains(HLSTags.ext_x_stream_inf);
return MasterM3u8Flag;
}
private async Task<List<StreamSpec>> ParseMasterListAsync() private async Task<List<StreamSpec>> ParseMasterListAsync()
{ {
MasterM3u8Flag = true;
List<StreamSpec> streams = new List<StreamSpec>(); List<StreamSpec> streams = new List<StreamSpec>();
using StringReader sr = new StringReader(M3u8Content); using StringReader sr = new StringReader(M3u8Content);
@ -475,7 +470,7 @@ namespace N_m3u8DL_RE.Parser.Extractor
{ {
this.M3u8Content = rawText; this.M3u8Content = rawText;
this.PreProcessContent(); this.PreProcessContent();
if (IsMaster()) if (M3u8Content.Contains(HLSTags.ext_x_stream_inf))
{ {
Logger.Warn(ResString.masterM3u8Found); Logger.Warn(ResString.masterM3u8Found);
var lists = await ParseMasterListAsync(); var lists = await ParseMasterListAsync();
@ -523,30 +518,44 @@ namespace N_m3u8DL_RE.Parser.Extractor
this.PreProcessContent(); this.PreProcessContent();
} }
public async Task FetchPlayListAsync(List<StreamSpec> lists) /// <summary>
/// 从Master链接中刷新各个流的URL
/// </summary>
/// <param name="lists"></param>
/// <returns></returns>
private async Task RefreshUrlFromMaster(List<StreamSpec> lists)
{ {
//首次加载不需要刷新URL //重新加载master m3u8, 刷新选中流的URL
if (!FirstFetchFlag && MasterM3u8Flag) await LoadM3u8FromUrlAsync(ParserConfig.Url);
var newStreams = await ParseMasterListAsync();
newStreams = newStreams.DistinctBy(p => p.Url).ToList();
foreach (var l in lists)
{ {
//重新加载master m3u8, 刷新选中流的URL var match = newStreams.Where(n => n.ToShortString() == l.ToShortString());
await LoadM3u8FromUrlAsync(ParserConfig.Url); if (match.Any())
var newStreams = await ParseMasterListAsync();
newStreams = newStreams.DistinctBy(p => p.Url).ToList();
foreach (var l in lists)
{ {
var match = newStreams.Where(n => n.ToShortString() == l.ToShortString()); Logger.DebugMarkUp($"{l.Url} => {match.First().Url}");
if (match.Any()) l.Url = match.First().Url;
{
Logger.DebugMarkUp($"{l.Url} => {match.First().Url}");
l.Url = match.First().Url;
}
} }
} }
}
public async Task FetchPlayListAsync(List<StreamSpec> lists)
{
for (int i = 0; i < lists.Count; i++) for (int i = 0; i < lists.Count; i++)
{ {
//重新加载m3u8 try
await LoadM3u8FromUrlAsync(lists[i].Url!); {
//直接重新加载m3u8
await LoadM3u8FromUrlAsync(lists[i].Url!);
}
catch (HttpRequestException) when (MasterM3u8Flag == true)
{
Logger.WarnMarkUp("Can not load m3u8. Try refreshing url from master url...");
//当前URL无法加载 尝试从Master链接中刷新URL
await RefreshUrlFromMaster(lists);
await LoadM3u8FromUrlAsync(lists[i].Url!);
}
var newPlaylist = await ParseListAsync(); var newPlaylist = await ParseListAsync();
if (lists[i].Playlist?.MediaInit != null) if (lists[i].Playlist?.MediaInit != null)
@ -570,7 +579,6 @@ namespace N_m3u8DL_RE.Parser.Extractor
public async Task RefreshPlayListAsync(List<StreamSpec> streamSpecs) public async Task RefreshPlayListAsync(List<StreamSpec> streamSpecs)
{ {
FirstFetchFlag = false;
await FetchPlayListAsync(streamSpecs); await FetchPlayListAsync(streamSpecs);
} }
} }

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) 20221221"; public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20230111";
[GeneratedRegex("((best|worst)\\d*|all)")] [GeneratedRegex("((best|worst)\\d*|all)")]
private static partial Regex ForStrRegex(); private static partial Regex ForStrRegex();