Есть строка
BANDWIDTH=5552610,CODECS="mp4a.40.2,avc1.4d402a",RESOLUTION=1920x1080,FRAME-RATE=60,VIDEO-RANGE=SDR,CLOSED-CAPTIONS=NONE
Проблема в этой части: CODECS="mp4a.40.2,avc1.4d402a"
Здесь есть запятая и по-этому .Split(",")
работает неправильно Сейчас парсю вручную.
Но может всё-таки как-то автоматически можно?
Внутри закавыченного значения значения еще и = может быть, не? я бы нашел все области в кавычках, с учетом того что внутри теоретически еще может быть экранированная двойная кавычка и не одна, заменил бы найденные запятые и знаки равенства на что-то другое, запомнив место где они находились. Разобрал бы и восстановил в значениях запятые и =
Ну там всё может быть Но конкретно здесь не бывает.
Собственно, я так и думал. Но это всё-равно что вручную парсить
Я не уверен, что авторы этой строки предлагали такие заморочки с парсингом
Так это наверно часть формата m3u Как распарсить такое? (M3U, Twitch)
То есть заморочки есть, но есть готовые библиотеки реализующие это.
А можно ссылочку на сайт?
А как? Вот находим всё заковыченное:
private static List<RuTubeVideoFormat> ParsePlaylistManifest(string manifest)
{
Regex regex = new Regex("CODECS=\"(.+?)\"");
MatchCollection matches = regex.Matches(manifest);
if (matches.Count > 0)
{
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
System.Diagnostics.Debug.WriteLine(match.Value);
}
}
....
}
Теперь в найденном делаем UrlEncode()
и тупо реплейсим одно на другое? Там же в Match
нет позиции, в которой нашлось совпадение
Упс Плохо посмотрел. Index
же
Чёта индекс какой-то странный В блокноте первое совпадение на позиции 59, а индекс равен 359. Это как?
А, не, индексы правильные. Это я просто индус
Эх, наговнокодил по-индусски
Зацените:
private static List<RuTubeVideoFormat> ParsePlaylistManifest(string manifest)
{
Regex regex = new Regex("CODECS=\"(.+?)\"");
MatchCollection matches = regex.Matches(manifest);
Console.WriteLine(manifest);
int diff = 0;
for (int i = 0; i < matches.Count; ++i)
{
Match match = matches[i];
string t = $"Index={match.Index} | {match.Value}";
Console.WriteLine(t);
System.Diagnostics.Debug.WriteLine(t);
string tmp = match.Value.Substring(7);
int actualPos = match.Index + 7;
int actualLength = match.Length - 7;
string encoded = HttpUtility.UrlEncode(tmp);
if (i > 0)
{
diff += encoded.Length - actualLength;
}
manifest = manifest.Remove(actualPos + diff, actualLength).Insert(actualPos + diff, encoded);
}
Console.WriteLine(manifest);