Как получить миниатюру видео с YouTube с помощью YouTube API?
Описание проблемы:
У меня есть URL видео с YouTube, и я хотел бы узнать, как с помощью PHP и cURL получить связанное с этим видео миниатюрное изображение через YouTube API. Существуют ли какие-либо примеры или рекомендации по этому поводу?
5 ответ(ов)
Ответ на вопрос, который вы задали, верный. Однако стоит отметить, что не каждое видео на YouTube содержит все девять миниатюр. Кроме того, размеры изображений миниатюр зависят от самого видео (цифры ниже основаны на одном примере). Существует несколько миниатюр, которые гарантированно будут доступны:
Ширина | Высота | URL |
---|---|---|
120 | 90 | https://i.ytimg.com/vi/<VIDEO ID>/1.jpg |
120 | 90 | https://i.ytimg.com/vi/<VIDEO ID>/2.jpg |
120 | 90 | https://i.ytimg.com/vi/<VIDEO ID>/3.jpg |
120 | 90 | https://i.ytimg.com/vi/<VIDEO ID>/default.jpg |
320 | 180 | https://i.ytimg.com/vi/<VIDEO ID>/mq1.jpg |
320 | 180 | https://i.ytimg.com/vi/<VIDEO ID>/mq2.jpg |
320 | 180 | https://i.ytimg.com/vi/<VIDEO ID>/mq3.jpg |
320 | 180 | https://i.ytimg.com/vi/<VIDEO ID>/mqdefault.jpg |
480 | 360 | https://i.ytimg.com/vi/<VIDEO ID>/0.jpg |
480 | 360 | https://i.ytimg.com/vi/<VIDEO ID>/hq1.jpg |
480 | 360 | https://i.ytimg.com/vi/<VIDEO ID>/hq2.jpg |
480 | 360 | https://i.ytimg.com/vi/<VIDEO ID>/hq3.jpg |
480 | 360 | https://i.ytimg.com/vi/<VIDEO ID>/hqdefault.jpg |
Кроме того, некоторые другие миниатюры могут существовать, а могут и не существовать. Их наличие, вероятно, зависит от того, является ли видео высокого качества.
Ширина | Высота | URL |
---|---|---|
640 | 480 | https://i.ytimg.com/vi/<VIDEO ID>/sd1.jpg |
640 | 480 | https://i.ytimg.com/vi/<VIDEO ID>/sd2.jpg |
640 | 480 | https://i.ytimg.com/vi/<VIDEO ID>/sd3.jpg |
640 | 480 | https://i.ytimg.com/vi/<VIDEO ID>/sddefault.jpg |
1280 | 720 | https://i.ytimg.com/vi/<VIDEO ID>/hq720.jpg |
1920 | 1080 | https://i.ytimg.com/vi/<VIDEO ID>/maxresdefault.jpg |
В API YouTube V3 также можно использовать следующие URL-адреса для получения миниатюр видео, классифицированных по качеству:
https://i1.ytimg.com/vi/<вставьте-id-видео-сюда>/default.jpg - стандартное
https://i1.ytimg.com/vi/<вставьте-id-видео-сюда>/mqdefault.jpg - среднее
https://i1.ytimg.com/vi/<вставьте-id-видео-сюда>/hqdefault.jpg - высокое
https://i1.ytimg.com/vi/<вставьте-id-видео-сюда>/sddefault.jpg - стандартное качество
Для максимального разрешения можно использовать следующий URL:
https://i1.ytimg.com/vi/<вставьте-id-видео-сюда>/maxresdefault.jpg
Одно из преимуществ этих URL по сравнению с адресами из первого ответа заключается в том, что они не блокируются фаерволами.
Если вы хотите избавиться от "черных полос" и сделать это так, как это делает YouTube, вы можете использовать следующий формат URL:
https://i.ytimg.com/vi_webp/<id_видео>/mqdefault.webp
Если вы не можете использовать формат файла .webp
, вы можете сделать это следующим образом:
https://i.ytimg.com/vi/<id_видео>/mqdefault.jpg
Кроме того, если вам нужна версия без масштабирования, используйте maxresdefault
вместо mqdefault
.
Обратите внимание: я не уверен насчет соотношения сторон, если вы собираетесь использовать maxresdefault
.
Если вам нужна самая большая картинка с YouTube для конкретного идентификатора видео, URL должен выглядеть следующим образом:
http://i3.ytimg.com/vi/SomeVideoIDHere/0.jpg
Используя API, вы можете получить изображение миниатюры по умолчанию. Простой код может выглядеть так:
// Получаем миниатюру по умолчанию
$attrs = $media->group->thumbnail[1]->attributes();
$thumbnail = $attrs['url'];
$thumbnail = substr($thumbnail, 0, -5);
$thumb1 = $thumbnail."default.jpg";
// Получаем третью миниатюру
$thumb2 = $thumbnail."2.jpg";
// Получаем четвертую миниатюру
$thumb3 = $thumbnail."3.jpg";
// Используем простой cURL для сохранения на ваш сервер.
// Вы можете доработать cURL, если хотите, чтобы это выглядело более изящно,
// как у остальных участников здесь.
$ch = curl_init ("$thumb1");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$rawdata = curl_exec($ch);
curl_close($ch);
// Используем fwrite для сохранения вышеуказанного
$fp = fopen("SomeLocationInReferenceToYourScript/AnyNameYouWant.jpg", 'w');
// Записываем файл
fwrite($fp, $rawdata);
// И затем закрываем его.
fclose($fp);
Этот код поможет вам получить миниатюру видео и сохранить её на ваш сервер. Не забудьте заменить "SomeLocationInReferenceToYourScript/AnyNameYouWant.jpg"
на реальный путь и имя файла, куда вы хотите сохранить миниатюру.
Вы можете использовать следующую функцию, чтобы получать только существующие изображения с YouTube:
function youtube_image($id) {
$resolution = array(
'maxresdefault',
'sddefault',
'mqdefault',
'hqdefault',
'default'
);
for ($x = 0; $x < sizeof($resolution); $x++) {
$url = '//img.youtube.com/vi/' . $id . '/' . $resolution[$x] . '.jpg';
if (get_headers($url)[0] == 'HTTP/1.0 200 OK') {
break;
}
}
return $url;
}
Эта функция принимает идентификатор видео на YouTube и пробует получить изображение в различных разрешениях. Она перебирает массив разрешений, начиная с наивысшего (maxresdefault
) и заканчивая самым низким (default
). Для каждого разрешения функция формирует URL и проверяет его статус с помощью get_headers()
. Как только она находит изображение с ответом HTTP/1.0 200 OK
, она прерывает цикл и возвращает найденный URL.
Обратите внимание, что функция вернет URL первого доступного изображения, найденного в массиве разрешений. Если изображение не найдено, возвращенный результат будет пустым значением, так как переменная $url
не будет инициализирована корректным значением. Вы можете добавить дополнительные проверки, чтобы обработать такие ситуации.
Как вывести ошибки PHP на экран?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?
Как получить расширение файла в PHP?