Skip to content

Commit

Permalink
Merge branch 'nilaoda:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
ImAleeexx authored Jan 13, 2023
2 parents 04e7d40 + 7014cba commit 22b103a
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 41 deletions.
26 changes: 15 additions & 11 deletions src/N_m3u8DL-RE.Parser/Extractor/DASHExtractor2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -312,13 +312,14 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
var initialization = segmentTemplate.Attribute("initialization")?.Value ?? segmentTemplateOuter.Attribute("initialization")?.Value;
if (initialization != null)
{
var initUrl = ParserUtil.ReplaceVars(ParserUtil.CombineURL(segBaseUrl, initialization), varDic);
var _init = ParserUtil.ReplaceVars(initialization, varDic);
var initUrl = ParserUtil.CombineURL(segBaseUrl, _init);
streamSpec.Playlist.MediaInit = new MediaSegment();
streamSpec.Playlist.MediaInit.Index = -1; //便于排序
streamSpec.Playlist.MediaInit.Url = initUrl;
}
//处理分片
var media = segmentTemplate.Attribute("media")?.Value ?? segmentTemplateOuter.Attribute("media")?.Value;
var mediaTemplate = segmentTemplate.Attribute("media")?.Value ?? segmentTemplateOuter.Attribute("media")?.Value;
var segmentTimeline = segmentTemplate.Elements().Where(e => e.Name.LocalName == "SegmentTimeline").FirstOrDefault();
if (segmentTimeline != null)
{
Expand All @@ -340,11 +341,12 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
var _repeatCount = Convert.ToInt64(_repeatCountStr);
varDic[DASHTags.TemplateTime] = currentTime;
varDic[DASHTags.TemplateNumber] = segNumber++;
var oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
var mediaUrl = ParserUtil.ReplaceVars(oriUrl, varDic);
var hasTime = mediaTemplate!.Contains(DASHTags.TemplateTime);
var media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
var mediaUrl = ParserUtil.CombineURL(segBaseUrl, media!);
MediaSegment mediaSegment = new();
mediaSegment.Url = mediaUrl;
if (oriUrl.Contains(DASHTags.TemplateTime))
if (hasTime)
mediaSegment.NameFromVar = currentTime.ToString();
mediaSegment.Duration = _duration / (double)timescale;
mediaSegment.Index = segIndex++;
Expand All @@ -360,12 +362,13 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
MediaSegment _mediaSegment = new();
varDic[DASHTags.TemplateTime] = currentTime;
varDic[DASHTags.TemplateNumber] = segNumber++;
var _oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
var _mediaUrl = ParserUtil.ReplaceVars(_oriUrl, varDic);
var _hashTime = mediaTemplate!.Contains(DASHTags.TemplateTime);
var _media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
var _mediaUrl = ParserUtil.CombineURL(segBaseUrl, _media);
_mediaSegment.Url = _mediaUrl;
_mediaSegment.Index = segIndex++;
_mediaSegment.Duration = _duration / (double)timescale;
if (_oriUrl.Contains(DASHTags.TemplateTime))
if (_hashTime)
_mediaSegment.NameFromVar = currentTime.ToString();
streamSpec.Playlist.MediaParts[0].MediaSegments.Add(_mediaSegment);
}
Expand Down Expand Up @@ -396,11 +399,12 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
for (long index = startNumber, segIndex = 0; index < startNumber + totalNumber; index++, segIndex++)
{
varDic[DASHTags.TemplateNumber] = index;
var oriUrl = ParserUtil.CombineURL(segBaseUrl, media!);
var mediaUrl = ParserUtil.ReplaceVars(oriUrl, varDic);
var hasNumber = mediaTemplate!.Contains(DASHTags.TemplateNumber);
var media = ParserUtil.ReplaceVars(mediaTemplate!, varDic);
var mediaUrl = ParserUtil.CombineURL(segBaseUrl, media!);
MediaSegment mediaSegment = new();
mediaSegment.Url = mediaUrl;
if (oriUrl.Contains(DASHTags.TemplateNumber))
if (hasNumber)
mediaSegment.NameFromVar = index.ToString();
mediaSegment.Index = isLive ? index : segIndex; //直播直接用startNumber
mediaSegment.Duration = duration / (double)timescale;
Expand Down
58 changes: 33 additions & 25 deletions src/N_m3u8DL-RE.Parser/Extractor/HLSExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ internal class HLSExtractor : IExtractor
private string BaseUrl = string.Empty;
private string M3u8Content = string.Empty;
private bool MasterM3u8Flag = false;
private bool FirstFetchFlag = true;

public ParserConfig ParserConfig { get; set; }

Expand Down Expand Up @@ -84,14 +83,10 @@ public string PreProcessUrl(string url)
return url;
}

private bool IsMaster()
{
MasterM3u8Flag = M3u8Content.Contains(HLSTags.ext_x_stream_inf);
return MasterM3u8Flag;
}

private async Task<List<StreamSpec>> ParseMasterListAsync()
{
MasterM3u8Flag = true;

List<StreamSpec> streams = new List<StreamSpec>();

using StringReader sr = new StringReader(M3u8Content);
Expand Down Expand Up @@ -475,7 +470,7 @@ public async Task<List<StreamSpec>> ExtractStreamsAsync(string rawText)
{
this.M3u8Content = rawText;
this.PreProcessContent();
if (IsMaster())
if (M3u8Content.Contains(HLSTags.ext_x_stream_inf))
{
Logger.Warn(ResString.masterM3u8Found);
var lists = await ParseMasterListAsync();
Expand Down Expand Up @@ -523,30 +518,44 @@ private async Task LoadM3u8FromUrlAsync(string url)
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
if (!FirstFetchFlag && MasterM3u8Flag)
//重新加载master m3u8, 刷新选中流的URL
await LoadM3u8FromUrlAsync(ParserConfig.Url);
var newStreams = await ParseMasterListAsync();
newStreams = newStreams.DistinctBy(p => p.Url).ToList();
foreach (var l in lists)
{
//重新加载master m3u8, 刷新选中流的URL
await LoadM3u8FromUrlAsync(ParserConfig.Url);
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());
if (match.Any())
{
var match = newStreams.Where(n => n.ToShortString() == l.ToShortString());
if (match.Any())
{
Logger.DebugMarkUp($"{l.Url} => {match.First().Url}");
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++)
{
//重新加载m3u8
await LoadM3u8FromUrlAsync(lists[i].Url!);
try
{
//直接重新加载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();
if (lists[i].Playlist?.MediaInit != null)
Expand All @@ -570,7 +579,6 @@ public async Task FetchPlayListAsync(List<StreamSpec> lists)

public async Task RefreshPlayListAsync(List<StreamSpec> streamSpecs)
{
FirstFetchFlag = false;
await FetchPlayListAsync(streamSpecs);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/N_m3u8DL-RE/CommandLine/CommandInvoker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace N_m3u8DL_RE.CommandLine
{
internal partial class CommandInvoker
{
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20221220";
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20230111";

[GeneratedRegex("((best|worst)\\d*|all)")]
private static partial Regex ForStrRegex();
Expand Down
2 changes: 1 addition & 1 deletion src/N_m3u8DL-RE/DownloadManager/HTTPLiveRecordManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ private async Task<bool> RecordStreamAsync(StreamSpec streamSpec, ProgressTask t
task.StartTask();

var name = streamSpec.ToShortString();
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
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}";
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
var saveName = DownloaderConfig.MyOptions.SaveName != null ? $"{DownloaderConfig.MyOptions.SaveName}.{streamSpec.Language}".TrimEnd('.') : dirName;

Expand Down
2 changes: 1 addition & 1 deletion src/N_m3u8DL-RE/DownloadManager/SimpleDownloadManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private async Task<bool> DownloadStreamAsync(StreamSpec streamSpec, ProgressTask
if (segments.Count() == 1) speedContainer.SingleSegment = true;

var type = streamSpec.MediaType ?? Common.Enum.MediaType.VIDEO;
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
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}";
var tmpDir = Path.Combine(DownloaderConfig.MyOptions.TmpDir ?? Environment.CurrentDirectory, dirName);
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
var saveName = DownloaderConfig.MyOptions.SaveName != null ? $"{DownloaderConfig.MyOptions.SaveName}.{streamSpec.Language}".TrimEnd('.') : dirName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ private async Task<bool> RecordStreamAsync(StreamSpec streamSpec, ProgressTask t

var name = streamSpec.ToShortString();
var type = streamSpec.MediaType ?? Common.Enum.MediaType.VIDEO;
var dirName = $"{DownloaderConfig.MyOptions.SaveName ?? NowDateTime.ToString("yyyy-MM-dd_HH-mm-ss")}_{task.Id}_{streamSpec.GroupId}_{streamSpec.Codecs}_{streamSpec.Bandwidth}_{streamSpec.Language}";
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}";
var tmpDir = Path.Combine(DownloaderConfig.MyOptions.TmpDir ?? Environment.CurrentDirectory, dirName);
var saveDir = DownloaderConfig.MyOptions.SaveDir ?? Environment.CurrentDirectory;
var saveName = DownloaderConfig.MyOptions.SaveName != null ? DownloaderConfig.MyOptions.SaveName : dirName;
Expand Down
2 changes: 1 addition & 1 deletion src/N_m3u8DL-RE/N_m3u8DL-RE.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<Version>0.1.5.2</Version>
<Version>0.1.5.3</Version>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>

Expand Down

0 comments on commit 22b103a

Please sign in to comment.