Як витягнути ID відео YouTube з URL

Витягнути необхідний параметр з текстового рядка 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 і зберегти його.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *