parent
e3c4cbb01b
commit
bde15e58c7
|
@ -12,6 +12,7 @@ namespace N_m3u8DL_RE.Common.Resource
|
||||||
public readonly static string ReLiveTs = "<RE_LIVE_TS>";
|
public readonly static string ReLiveTs = "<RE_LIVE_TS>";
|
||||||
public static string customRangeWarn { get => GetText("customRangeWarn"); }
|
public static string customRangeWarn { get => GetText("customRangeWarn"); }
|
||||||
public static string customRangeFound { get => GetText("customRangeFound"); }
|
public static string customRangeFound { get => GetText("customRangeFound"); }
|
||||||
|
public static string customAdKeywordsFound { get => GetText("customAdKeywordsFound"); }
|
||||||
public static string customRangeInvalid { get => GetText("customRangeInvalid"); }
|
public static string customRangeInvalid { get => GetText("customRangeInvalid"); }
|
||||||
public static string autoBinaryMerge { get => GetText("autoBinaryMerge"); }
|
public static string autoBinaryMerge { get => GetText("autoBinaryMerge"); }
|
||||||
public static string autoBinaryMerge2 { get => GetText("autoBinaryMerge2"); }
|
public static string autoBinaryMerge2 { get => GetText("autoBinaryMerge2"); }
|
||||||
|
@ -31,6 +32,7 @@ namespace N_m3u8DL_RE.Common.Resource
|
||||||
public static string cmd_ffmpegBinaryPath { get => GetText("cmd_ffmpegBinaryPath"); }
|
public static string cmd_ffmpegBinaryPath { get => GetText("cmd_ffmpegBinaryPath"); }
|
||||||
public static string cmd_mkvmergeBinaryPath { get => GetText("cmd_mkvmergeBinaryPath"); }
|
public static string cmd_mkvmergeBinaryPath { get => GetText("cmd_mkvmergeBinaryPath"); }
|
||||||
public static string cmd_baseUrl { get => GetText("cmd_baseUrl"); }
|
public static string cmd_baseUrl { get => GetText("cmd_baseUrl"); }
|
||||||
|
public static string cmd_adKeyword { get => GetText("cmd_adKeyword"); }
|
||||||
public static string cmd_moreHelp { get => GetText("cmd_moreHelp"); }
|
public static string cmd_moreHelp { get => GetText("cmd_moreHelp"); }
|
||||||
public static string cmd_header { get => GetText("cmd_header"); }
|
public static string cmd_header { get => GetText("cmd_header"); }
|
||||||
public static string cmd_muxImport { get => GetText("cmd_muxImport"); }
|
public static string cmd_muxImport { get => GetText("cmd_muxImport"); }
|
||||||
|
|
|
@ -22,6 +22,12 @@ namespace N_m3u8DL_RE.Common.Resource
|
||||||
zhTW: "自定義下載範圍無效",
|
zhTW: "自定義下載範圍無效",
|
||||||
enUS: "User customed range invalid"
|
enUS: "User customed range invalid"
|
||||||
),
|
),
|
||||||
|
["customAdKeywordsFound"] = new TextContainer
|
||||||
|
(
|
||||||
|
zhCN: "用户自定义广告分片URL关键字:",
|
||||||
|
zhTW: "用戶自定義廣告分片URL關鍵字:",
|
||||||
|
enUS: "User customed Ad keyword: "
|
||||||
|
),
|
||||||
["customRangeFound"] = new TextContainer
|
["customRangeFound"] = new TextContainer
|
||||||
(
|
(
|
||||||
zhCN: "用户自定义下载范围:",
|
zhCN: "用户自定义下载范围:",
|
||||||
|
@ -346,6 +352,12 @@ namespace N_m3u8DL_RE.Common.Resource
|
||||||
zhTW: "手動設置直播列表刷新間隔",
|
zhTW: "手動設置直播列表刷新間隔",
|
||||||
enUS: "Manually set the live playlist refresh interval"
|
enUS: "Manually set the live playlist refresh interval"
|
||||||
),
|
),
|
||||||
|
["cmd_adKeyword"] = new TextContainer
|
||||||
|
(
|
||||||
|
zhCN: "设置广告分片的URL关键字(正则表达式)",
|
||||||
|
zhTW: "設置廣告分片的URL關鍵字(正則表達式)",
|
||||||
|
enUS: "Set URL keywords (regular expressions) for AD segments"
|
||||||
|
),
|
||||||
["cmd_liveTakeCount"] = new TextContainer
|
["cmd_liveTakeCount"] = new TextContainer
|
||||||
(
|
(
|
||||||
zhCN: "手动设置录制直播时首次获取分片的数量",
|
zhCN: "手动设置录制直播时首次获取分片的数量",
|
||||||
|
|
|
@ -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) 20230707";
|
public const string VERSION_INFO = "N_m3u8DL-RE (Beta version) 20230712";
|
||||||
|
|
||||||
[GeneratedRegex("((best|worst)\\d*|all)")]
|
[GeneratedRegex("((best|worst)\\d*|all)")]
|
||||||
private static partial Regex ForStrRegex();
|
private static partial Regex ForStrRegex();
|
||||||
|
@ -57,6 +57,8 @@ namespace N_m3u8DL_RE.CommandLine
|
||||||
private readonly static Option<string?> BaseUrl = new(new string[] { "--base-url" }, description: ResString.cmd_baseUrl);
|
private readonly static Option<string?> BaseUrl = new(new string[] { "--base-url" }, description: ResString.cmd_baseUrl);
|
||||||
private readonly static Option<bool> ConcurrentDownload = new(new string[] { "-mt", "--concurrent-download" }, description: ResString.cmd_concurrentDownload, getDefaultValue: () => false);
|
private readonly static Option<bool> ConcurrentDownload = new(new string[] { "-mt", "--concurrent-download" }, description: ResString.cmd_concurrentDownload, getDefaultValue: () => false);
|
||||||
private readonly static Option<bool> NoLog = new(new string[] { "--no-log" }, description: ResString.cmd_noLog, getDefaultValue: () => false);
|
private readonly static Option<bool> NoLog = new(new string[] { "--no-log" }, description: ResString.cmd_noLog, getDefaultValue: () => false);
|
||||||
|
private readonly static Option<string[]?> AdKeywords = new(new string[] { "--ad-keyword" }, description: ResString.cmd_adKeyword) { ArgumentHelpName = "REG" };
|
||||||
|
|
||||||
|
|
||||||
//代理选项
|
//代理选项
|
||||||
private readonly static Option<bool> UseSystemProxy = new(new string[] { "--use-system-proxy" }, description: ResString.cmd_useSystemProxy, getDefaultValue: () => true);
|
private readonly static Option<bool> UseSystemProxy = new(new string[] { "--use-system-proxy" }, description: ResString.cmd_useSystemProxy, getDefaultValue: () => true);
|
||||||
|
@ -499,6 +501,7 @@ namespace N_m3u8DL_RE.CommandLine
|
||||||
LiveTakeCount = bindingContext.ParseResult.GetValueForOption(LiveTakeCount),
|
LiveTakeCount = bindingContext.ParseResult.GetValueForOption(LiveTakeCount),
|
||||||
NoDateInfo = bindingContext.ParseResult.GetValueForOption(NoDateInfo),
|
NoDateInfo = bindingContext.ParseResult.GetValueForOption(NoDateInfo),
|
||||||
NoLog = bindingContext.ParseResult.GetValueForOption(NoLog),
|
NoLog = bindingContext.ParseResult.GetValueForOption(NoLog),
|
||||||
|
AdKeywords = bindingContext.ParseResult.GetValueForOption(AdKeywords),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (bindingContext.ParseResult.HasOption(CustomHLSMethod)) option.CustomHLSMethod = bindingContext.ParseResult.GetValueForOption(CustomHLSMethod);
|
if (bindingContext.ParseResult.HasOption(CustomHLSMethod)) option.CustomHLSMethod = bindingContext.ParseResult.GetValueForOption(CustomHLSMethod);
|
||||||
|
@ -564,7 +567,7 @@ namespace N_m3u8DL_RE.CommandLine
|
||||||
MuxAfterDone,
|
MuxAfterDone,
|
||||||
CustomHLSMethod, CustomHLSKey, CustomHLSIv, UseSystemProxy, CustomProxy, CustomRange, TaskStartAt,
|
CustomHLSMethod, CustomHLSKey, CustomHLSIv, UseSystemProxy, CustomProxy, CustomRange, TaskStartAt,
|
||||||
LivePerformAsVod, LiveRealTimeMerge, LiveKeepSegments, LivePipeMux, LiveFixVttByAudio, LiveRecordLimit, LiveWaitTime, LiveTakeCount,
|
LivePerformAsVod, LiveRealTimeMerge, LiveKeepSegments, LivePipeMux, LiveFixVttByAudio, LiveRecordLimit, LiveWaitTime, LiveTakeCount,
|
||||||
MuxImports, VideoFilter, AudioFilter, SubtitleFilter, DropVideoFilter, DropAudioFilter, DropSubtitleFilter, MoreHelp
|
MuxImports, VideoFilter, AudioFilter, SubtitleFilter, DropVideoFilter, DropAudioFilter, DropSubtitleFilter, AdKeywords, MoreHelp
|
||||||
};
|
};
|
||||||
|
|
||||||
rootCommand.TreatUnmatchedTokensAsErrors = true;
|
rootCommand.TreatUnmatchedTokensAsErrors = true;
|
||||||
|
|
|
@ -17,6 +17,10 @@ namespace N_m3u8DL_RE.CommandLine
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Dictionary<string, string> Headers { get; set; } = new Dictionary<string, string>();
|
public Dictionary<string, string> Headers { get; set; } = new Dictionary<string, string>();
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// See: <see cref="CommandInvoker.AdKeywords"/>.
|
||||||
|
/// </summary>
|
||||||
|
public string[]? AdKeywords { get; set; }
|
||||||
|
/// <summary>
|
||||||
/// See: <see cref="CommandInvoker.Keys"/>.
|
/// See: <see cref="CommandInvoker.Keys"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[]? Keys { get; set; }
|
public string[]? Keys { get; set; }
|
||||||
|
|
|
@ -304,6 +304,9 @@ namespace N_m3u8DL_RE
|
||||||
if (!livingFlag)
|
if (!livingFlag)
|
||||||
FilterUtil.ApplyCustomRange(selectedStreams, option.CustomRange);
|
FilterUtil.ApplyCustomRange(selectedStreams, option.CustomRange);
|
||||||
|
|
||||||
|
//应用用户自定义的广告分片关键字
|
||||||
|
FilterUtil.CleanAd(selectedStreams, option.AdKeywords);
|
||||||
|
|
||||||
//记录文件
|
//记录文件
|
||||||
extractor.RawFiles["meta_selected.json"] = GlobalUtil.ConvertToJson(selectedStreams);
|
extractor.RawFiles["meta_selected.json"] = GlobalUtil.ConvertToJson(selectedStreams);
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace N_m3u8DL_RE.Util
|
namespace N_m3u8DL_RE.Util
|
||||||
|
@ -227,5 +228,41 @@ namespace N_m3u8DL_RE.Util
|
||||||
stream.SkippedDuration = skippedDur;
|
stream.SkippedDuration = skippedDur;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据用户输入,清除广告分片
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="selectedSteams"></param>
|
||||||
|
/// <param name="customRange"></param>
|
||||||
|
public static void CleanAd(List<StreamSpec> selectedSteams, string[]? keywords)
|
||||||
|
{
|
||||||
|
if (keywords == null) return;
|
||||||
|
var regList = keywords.Select(s => new Regex(s));
|
||||||
|
foreach ( var reg in regList)
|
||||||
|
{
|
||||||
|
Logger.InfoMarkUp($"{ResString.customAdKeywordsFound}[Cyan underline]{reg}[/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var stream in selectedSteams)
|
||||||
|
{
|
||||||
|
if (stream.Playlist == null) continue;
|
||||||
|
foreach (var part in stream.Playlist.MediaParts)
|
||||||
|
{
|
||||||
|
//没有找到广告分片
|
||||||
|
if (part.MediaSegments.All(x => regList.All(reg => !reg.IsMatch(x.Url))))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//找到广告分片 清理
|
||||||
|
else
|
||||||
|
{
|
||||||
|
part.MediaSegments = part.MediaSegments.Where(x => regList.All(reg => !reg.IsMatch(x.Url))).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//清理已经为空的 part
|
||||||
|
stream.Playlist.MediaParts = stream.Playlist.MediaParts.Where(x => x.MediaSegments.Count > 0).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue