优化Master的刷新逻辑
This commit is contained in:
parent
418547d5a2
commit
1b1cef9a94
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue