来自 Master m3u8 文件的具有高带宽的正则表达式匹配分辨率

Regex Match Resolution with High Bandwidth from Master m3u8 file

我在匹配 m3u8 主文件的最高带宽时遇到了一点问题

这是master.m3u8的内容

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=149000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=300000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 2
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=500000,RESOLUTION=640x360,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=640x360,CODECS="avc1.66.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 4
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=1280x720,CODECS="avc1.77.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 5
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1299000,RESOLUTION=1280x720,CODECS="avc1.77.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 6
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1499000,RESOLUTION=1280x720,CODECS="avc1.77.30, mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 7
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=62000,CODECS="mp4a.40.2",CLOSED-CAPTIONS=NONE
https://testurl 8

我能够通过决议获得 url。但问题是有些master m3u8有3个url分辨率相同但带宽不同

我的目标是,如果我选择 1280x720 并且会有多个具有相同分辨率的结果,我只想获得带宽最高的 url,就像示例内容中那样。最高的是1499000

这是我当前的代码。

private static void TEST()
{
var f = File.ReadAllText(@"C:\Users\MARK\Desktop\TEST\master.m3u8");
    
string result = string.Empty;
    
    result = ParseM3u8Master(f, "1280x720", 2);
    if (result == "") {
        result = ParseM3u8Master(f, "640x360", 2);
    }else if (result == ""){
        result = ParseM3u8Master(f, "320x180", 2);
    }
    Console.WriteLine(result);
}

private const RegexOptions ML = RegexOptions.IgnoreCase | RegexOptions.Multiline;
public static string ParseM3u8Master(string m3u8Master, string resolution, int group)
{
    string result = string.Empty;
    string pattern = $@"(?:RESOLUTION=({resolution}).*?)\n(https.+|http[-a-zA-Z0-9()@:%_\+.~#?&//=])";
    if (Regex.IsMatch(m3u8Master, pattern, ML))
    {
        result = Regex.Match(m3u8Master, pattern, ML).Groups[group].Value;
    }
    return result;
}
 

更新:(在尝试找出解决方案之后。我成功地获得了总是在最后的最高带宽)

这是我的解决方案(也许你可以提出比这更好的建议)

private const RegexOptions ML = RegexOptions.IgnoreCase | RegexOptions.Multiline;
public static string ParseM3u8Master(string m3u8Master, string resolution, int group)
{
    string result = string.Empty;
    string pattern = $@"(?:RESOLUTION=({resolution}).*?)\n(https.+|http[-a-zA-Z0-9()@:%_\+.~#?&//=])";
    if (Regex.IsMatch(m3u8Master, pattern, ML))
    {
        var lst = new List<string>();
        var mc = Regex.Matches(m3u8Master, pattern, ML); 
        foreach (Match m in mc) {
            lst.Add(m.Groups[2].Value);
        }
        result = lst.Last();
    }
    return res
}