Витягнути необхідний параметр з текстового рядка URL – це дуже просте завдання. Але способів це зробити є багато – хтось використовує Regex, а комусь простіше розрізати рядок на частини, і уже звідти одержати необхідне значення. В цій публікації буде мало тексту – лише два фрагменти коду для рішення однієї задачі – одержання ID відео YouTube з текстового рядка URL.
Перш за все, треба взяти до уваги, що URL які містять ID відео для YouTube можуть мати такий вигляд:
– https://youtu.be/RYbrWFWdOE0?si=123456 – звичайне посилання, яке формується коли натиснути кнопку Поділитись під відео.
– https://www.youtube.com/watch?v=RYbrWFWdOE0 – звичайне посилання на відео, яке знаходиться в адресному рядку при перегляді відео
– https://www.youtube.com/watch?v=RYbrWFWdOE0&list=123456 – посилання яке знаходиться в адресному рядку браузера при перегляді списку відтворення
Саме для цих випадків я використовую такий фрагмент коду:
string url = "youtu.be/RYbrWFWdOE0?si=123456"; string[] data = url.Split('?'); if(data.Length == 2) { string[] param = data[1].Split('&'); var dic = new Dictionary<string, string>(); foreach(string p in param) { string[] items = p.Split(new Char[]{'='}, 2); if(items.Length==2) dic[items.First()] = items.Last(); } if(dic.ContainsKey("v")) return dic["v"]; else { return Path.GetFileName(data.First()); } } return Path.GetFileName(url);
Ідея слідуюча – спочатку URL розділяється по символу ‘?’.
Якщо результат буде розділеним на дві частини, тоді пробую сформувати словник параметрів ключ=значення.
Після чого, значення ключа v і буде ідентифікатором відео на YouTube.
Якщо ключа v в URL немає, тоді буду вважати до після символа ‘/’ йде ID відео.
Якщо ж розділити на дві частини по символу ‘?’ не получилось – значить після симола ‘/’ йде ID відео.
Ось і все, таким способом я одержав необхідне значення з URL, упустивши ряд перевірок (наприклад чи це дійно URL чи ні).
Тому, коли мені було важливо відкинути різний мусор, який може попадатись, коли URL одержується наприклад з html сторінок сайтів, які можуть видати в якості URL що завгодно, наприклад фрагмент js коду, я користуюсь подібною логікою, яка зображена на діаграмі нижче:
graph TD Start[https://www.youtube.com/watch?v=RYbrWFWdOE0\nhttps://youtu.be/RYbrWFWdOE0?si=123456] --> B[Створення URL] B --> C[Створення об'єкта Uri] C --> D[Вибірка рядка запиту - ?v=RYbrWFWdOE0 чи ?si=123456] D --> E[Перевірка наявності параметрів] E -- Так --> F[Беремо всі параметри] F --> G[Перетворюємо їх в словник] G --> H[Перевіряємо наявність 'v' в словнику] H -- Так --> Y[Одержуємо значення 'v' із словника] H -- Ні --> I[Одержую ім'я файла без розширення] E -- Ні --> I[Одержую ім'я файла без розширення] Y-->ID[Шуканий ID відео] I-->ID[Шуканий ID відео] ID-->END[RYbrWFWdOE0] style Start fill:stroke:#FF3333,stroke-width:2px,stroke-dasharray: 5, 5 style B fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style C fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style D fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style E fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style F fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style G fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style H fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style I fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style Y fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style ID fill:stroke:#6085A5,stroke-width:2px,stroke-dasharray: 5, 5 style END fill:stroke:#FF3333,stroke-width:2px,stroke-dasharray: 5, 5
Сам фрагмент C# коду, який я використовую для одержання ID відео з URL:
//Підключити в GAS System.Web.dll string url = "https://www.youtube.com/watch?v=RYbrWFWdOE0&list=123456"; var uri = new Uri(url); string query = uri.Query; if(string.IsNullOrEmpty(query)) return Path.GetFileNameWithoutExtension(uri.AbsolutePath); var param = System.Web.HttpUtility.ParseQueryString(query); var dic = param.AllKeys.ToDictionary(key => key, key => param[key]); return dic.ContainsKey("v") ? dic["v"] : Path.GetFileNameWithoutExtension(uri.AbsolutePath);
Логика в мене в цьому випадку така, що при формуванні Uri(url) я одержу помилку, якщо в змінній url знаходиться щось, що не підходить для мого випадку.
Після чого я одержую рядок з параметрами (зручно це робити за допомогою System.Web, адже параметри можуть бути у UrlEncode).
І тоді, якщо значення параметра v присутнє – вважаю що це ID відео Youtube, а у іншому випадку – вважаю, що після символа ‘/’ йде ID відео, і витягую це значення за допомогою Path.GetFileNameWithoutExtension(uri.AbsolutePath) або Path.GetFileName(uri.AbsolutePath)
Після одержання значеннь, які повинні бути саме ID відео Youtube, приходиться перевірити їх, і не корректні значення не зберігати.
Зручно це зробити за допомогою превью – якщо знайдене значення ID відповідає якомусь відео на Youtube, то скоріш за все знайдеться хоча б одне превью для цього відео. Тобто скачавши превью можна впевнитись що це корректний ID і зберегти його.