using N_m3u8DL_RE.Parser.Constants;
using System.Text.RegularExpressions;
namespace N_m3u8DL_RE.Parser.Util;
public static partial class ParserUtil
{
[GeneratedRegex(@"\$Number%([^$]+)d\$")]
private static partial Regex VarsNumberRegex();
///
/// 从以下文本中获取参数
/// #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2149280,CODECS="mp4a.40.2,avc1.64001f",RESOLUTION=1280x720,NAME="720"
///
/// 等待被解析的一行文本
/// 留空则获取第一个英文冒号后的全部字符
///
public static string GetAttribute(string line, string key = "")
{
line = line.Trim();
if (key == "")
return line[(line.IndexOf(':') + 1)..];
var index = -1;
var result = string.Empty;
if ((index = line.IndexOf(key + "=\"", StringComparison.Ordinal)) > -1)
{
var startIndex = index + (key + "=\"").Length;
var endIndex = startIndex + line[startIndex..].IndexOf('\"');
result = line[startIndex..endIndex];
}
else if ((index = line.IndexOf(key + "=", StringComparison.Ordinal)) > -1)
{
var startIndex = index + (key + "=").Length;
var endIndex = startIndex + line[startIndex..].IndexOf(',');
result = endIndex >= startIndex ? line[startIndex..endIndex] : line[startIndex..];
}
return result;
}
///
/// 从如下文本中提取
/// [@]
///
///
/// n(length) o(start)
public static (long, long?) GetRange(string input)
{
var t = input.Split('@');
return t.Length switch
{
<= 0 => (0, null),
1 => (Convert.ToInt64(t[0]), null),
2 => (Convert.ToInt64(t[0]), Convert.ToInt64(t[1])),
_ => (0, null)
};
}
///
/// 从100-300这种字符串中获取StartRange, ExpectLength信息
///
///
/// StartRange, ExpectLength
public static (long, long) ParseRange(string range)
{
var start = Convert.ToInt64(range.Split('-')[0]);
var end = Convert.ToInt64(range.Split('-')[1]);
return (start, end - start + 1);
}
///
/// MPD SegmentTemplate替换
///
///
///
///
public static string ReplaceVars(string text, Dictionary keyValuePairs)
{
foreach (var item in keyValuePairs)
if (text.Contains(item.Key))
text = text.Replace(item.Key, item.Value!.ToString());
// 处理特殊形式数字 如 $Number%05d$
var regex = VarsNumberRegex();
if (regex.IsMatch(text) && keyValuePairs.TryGetValue(DASHTags.TemplateNumber, out var keyValuePair))
{
foreach (Match m in regex.Matches(text))
{
text = text.Replace(m.Value, keyValuePair?.ToString()?.PadLeft(Convert.ToInt32(m.Groups[1].Value), '0'));
}
}
return text;
}
///
/// 拼接Baseurl和RelativeUrl
///
/// Baseurl
/// RelativeUrl
///
public static string CombineURL(string baseurl, string url)
{
if (string.IsNullOrEmpty(baseurl))
return url;
var uri1 = new Uri(baseurl); // 这里直接传完整的URL即可
var uri2 = new Uri(uri1, url);
url = uri2.ToString();
return url;
}
}