Если у меня есть URL-адрес видео на YouTube, есть ли способ использовать PHP и cURL для получения связанной с ним миниатюры из API YouTube?
Каждое видео на YouTube содержит четыре сгенерированных изображения. Они предсказуемо отформатированы следующим образом:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg
https://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg
Первое в списке - полноразмерное изображение, остальные - миниатюры. По умолчанию уменьшенное изображение (т. е. одно из 1.jpg
, 2.jpg
, 3.jpg
) имеет следующий вид:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg
Для получения высококачественной версии миниатюры используйте URL-адрес, подобный этому:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
Существует также версия миниатюры среднего качества, использующая URL-адрес, похожий на HQ:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg
Для получения версии миниатюры в стандартном разрешении используйте URL-адрес, аналогичный этому:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg
Для версии миниатюры с максимальным разрешением используйте URL-адрес, подобный этому:
https://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
Все вышеперечисленные URL-адреса доступны и по HTTP. Кроме того, вместо img.youtube.com
в приведенных выше примерах URL работает более короткое имя хоста i3.ytimg.com
.
Кроме того, для получения уменьшенных изображений можно использовать YouTube Data API (v3).
Вы можете использовать YouTube Data API для получения миниатюр видео, подписей, описания, рейтинга, статистики и многого другого. Для API версии 3 требуется ключ*. Получите ключ и создайте запрос videos: list:
https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=VIDEO_ID
Пример PHP-кода
$data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=T0Jqdjbed40");
$json = json_decode($data);
var_dump($json->items[0]->snippet->thumbnails);
Вывод
object(stdClass)#5 (5) {
["default"]=>
object(stdClass)#6 (3) {
["url"]=>
string(46) "https://i.ytimg.com/vi/T0Jqdjbed40/default.jpg"
["width"]=>
int(120)
["height"]=>
int(90)
}
["medium"]=>
object(stdClass)#7 (3) {
["url"]=>
string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/mqdefault.jpg"
["width"]=>
int(320)
["height"]=>
int(180)
}
["high"]=>
object(stdClass)#8 (3) {
["url"]=>
string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/hqdefault.jpg"
["width"]=>
int(480)
["height"]=>
int(360)
}
["standard"]=>
object(stdClass)#9 (3) {
["url"]=>
string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/sddefault.jpg"
["width"]=>
int(640)
["height"]=>
int(480)
}
["maxres"]=>
object(stdClass)#10 (3) {
["url"]=>
string(52) "https://i.ytimg.com/vi/T0Jqdjbed40/maxresdefault.jpg"
["width"]=>
int(1280)
["height"]=>
int(720)
}
}
* Мало того, что вам нужен ключ, вас могут попросить предоставить биллинговую информацию в зависимости от количества API-запросов, которые вы планируете делать. Однако несколько миллионов запросов в день бесплатны.
& Лт;!- язык-все: lang-none - >
То, что сказал Асаф, правильно. Однако не каждое видео на YouTube содержит все девять миниатюр. Кроме того, размеры изображений миниатюр зависят от видео (нижние цифры основаны на одном).
Существует семь миниатюр:
| Thumbnail Name | Size (px) | URL |
|---------------------|-----------|--------------------------------------------------|
| Player Background | 480x360 | https://i1.ytimg.com/vi/<VIDEO ID>/0.jpg |
| Start | 120x90 | https://i1.ytimg.com/vi/<VIDEO ID>/1.jpg |
| Middle | 120x90 | https://i1.ytimg.com/vi/<VIDEO ID>/2.jpg |
| End | 120x90 | https://i1.ytimg.com/vi/<VIDEO ID>/3.jpg |
| High Quality | 480x360 | https://i1.ytimg.com/vi/<VIDEO ID>/hqdefault.jpg |
| Medium Quality | 320x180 | https://i1.ytimg.com/vi/<VIDEO ID>/mqdefault.jpg |
| Normal Quality | 120x90 | https://i1.ytimg.com/vi/<VIDEO ID>/default.jpg |
Кроме того, две другие миниатюры могут существовать или не существовать. Их присутствие, вероятно, основано на том, является ли видео качественным.
| Thumbnail Name | Size (px) | URL |
|---------------------|-----------|------------------------------------------------------|
| Standard Definition | 640x480 | https://i1.ytimg.com/vi/<VIDEO ID>/sddefault.jpg |
| Maximum Resolution | 1920x1080 | https://i1.ytimg.com/vi/<VIDEO ID>/maxresdefault.jpg |
Вы можете найти сценарии JavaScript и PHP для извлечения миниатюр и других Информация YouTube в:
Вы также можете использовать инструмент YouTube Video Information Generator, чтобы получить всю информацию о видео YouTube, отправив URL-адрес или идентификатор видео.
В YouTube API V3 мы также можем использовать эти URL для получения миниатюр... Они классифицируются на основе их качества.
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/default.jpg - default
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg - medium
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg - high
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/sddefault.jpg - standard
И для максимального разрешения..
https://i1.ytimg.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
Одним из преимуществ этих URL-адресов по сравнению с URL-адресами в первом ответе является то, что эти URL-адреса не блокируются брандмауэрами.
Если вы хотите получить самое большое изображение с YouTube для определенного идентификатора видео, то URL должен быть примерно таким:
http://i3.ytimg.com/vi/SomeVideoIDHere/0.jpg
Используя API, вы можете подобрать изображение по умолчанию. Простой код должен быть примерно таким:
//Grab the default thumbnail image
$attrs = $media->group->thumbnail[1]->attributes();
$thumbnail = $attrs['url'];
$thumbnail = substr($thumbnail, 0, -5);
$thumb1 = $thumbnail."default.jpg";
// Grab the third thumbnail image
$thumb2 = $thumbnail."2.jpg";
// Grab the fourth thumbnail image.
$thumb3 = $thumbnail."3.jpg";
// Using simple cURL to save it your server.
// You can extend the cURL below if you want it as fancy, just like
// the rest of the folks here.
$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);
// Using fwrite to save the above
$fp = fopen("SomeLocationInReferenceToYourScript/AnyNameYouWant.jpg", 'w');
// Write the file
fwrite($fp, $rawdata);
// And then close it.
fclose($fp);
Если вы хотите избавиться от «черных полос» и сделать это так, как это делает YouTube, вы можете использовать:
https://i.ytimg.com/vi_webp/<video id>/mqdefault.webp
И если вы не можете использовать расширение файла .webp
, вы можете сделать это так:
https://i.ytimg.com/vi/<video id>/mqdefault.jpg
Кроме того, если вам нужна незапечатанная версия, используйте maxresdefault
вместо mqdefault
.
Примечание: я не уверен в соотношении сторон, если вы планируете использовать maxresdefault
.
Я сделал функцию, чтобы извлекать только существующие изображения с 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 Data API v3 вы можете получить миниатюры видео с помощью функции videos- > list. Из [snippet.thumbnails.(key)][3], вы можете выбрать миниатюру среднего или высокого разрешения по умолчанию и получить ее ширину, высоту и URL
Вы также можете обновить миниатюры с помощью функции thumbnails- > set.
Например, вы можете проверить проект YouTube API Samples. (PHP.)
[3]: https://developers.google.com/youtube/v3/docs/videos#snippet.thumbnails.% 28key% 29
Вы можете получить Video Entry, который содержит URL-адрес миниатюры видео. В ссылке есть пример кода. Или, если вы хотите разобрать XML, есть информация здесь. В возвращаемом XML есть элемент media:thumbnail
, который содержит URL миниатюры.
// Get image form video URL
$url = $video['video_url'];
$urls = parse_url($url);
//Expect the URL to be http://youtu.be/abcd, where abcd is the video ID
if ($urls['host'] == 'youtu.be') :
$imgPath = ltrim($urls['path'],'/');
//Expect the URL to be http://www.youtube.com/embed/abcd
elseif (strpos($urls['path'],'embed') == 1) :
$imgPath = end(explode('/',$urls['path']));
//Expect the URL to be abcd only
elseif (strpos($url,'/') === false):
$imgPath = $url;
//Expect the URL to be http://www.youtube.com/watch?v=abcd
else :
parse_str($urls['query']);
$imgPath = $v;
endif;
YouTube принадлежит Google, и Google любит иметь достаточное количество изображений для разных размеров экрана, поэтому его изображения хранятся в разных размерах. Вот пример того, как будет выглядеть ваша миниатюра:
Миниатюра низкого качества:
http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/sddefault.jpg
Миниатюра среднего качества:
http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/mqdefault.jpg
Высококачественная миниатюра:
http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/hqdefault.jpg
Миниатюра максимального качества:
http://img.youtube.com/vi/<YouTube_Video_ID_HERE>/maxresdefault.jpg
Если все, что вы хотите сделать, это искать YouTube и получать связанные свойства:
Получить public API - Эта ссылка дает хорошее направление
Используйте ниже строку запроса. Поисковый запрос (обозначаемый q = ) в строке URL - это, например, stackoverflow . Затем YouTube отправит вам ответ JSON, где вы сможете проанализировать миниатюру, фрагмент, автора и т. Д.
https://www.googleapis.com/youtube/v3/search?part = id% 2Csnippet & maxResults = 50 & q = перелив стека и ключ = YOUR_API_KEY_HERE
Использовать:
https://www.googleapis.com/youtube/v3/videoCategories?part=snippet,id&maxResults=100®ionCode=us&key=**Your YouTube ID**
Над ссылкой. Используя это, вы можете найти характеристики видео на YouTube. После поиска характеристик вы можете получить видео выбранной категории. После этого вы можете найти выбранные видеоизображения, используя Ответ Асафа .
Попробуйте вышеупомянутый подход, и вы можете проанализировать все с YouTube API.
Я использовал миниатюры YouTube таким образом:
$url = 'http://img.youtube.com/vi/' . $youtubeId . '/0.jpg';
$img = dirname(__FILE__) . '/youtubeThumbnail_' . $youtubeId . '.jpg';
file_put_contents($img, file_get_contents($url));
Помните, что YouTube запрещает включать изображения непосредственно со своего сервера.
Просто чтобы добавить / расширить данные решения, я считаю необходимым отметить, что, поскольку у меня была эта проблема, можно на самом деле захватить несколько видеоконтента YouTube, в данном случае миниатюры, с одним HTTP-запросом:
Используя Rest Client, в данном случае HTTPFUL, вы можете сделать что-то вроде этого:
<?php
header("Content-type", "application/json");
//download the httpfull.phar file from http://phphttpclient.com
include("httpful.phar");
$youtubeVidIds= array("nL-rk4bgJWU", "__kupr7KQos", "UCSynl4WbLQ", "joPjqEGJGqU", "PBwEBjX3D3Q");
$response = \Httpful\Request::get("https://www.googleapis.com/youtube/v3/videos?key=YourAPIKey4&part=snippet&id=".implode (",",$youtubeVidIds)."")
->send();
print ($response);
?>
Я нашел этот изящный инструмент, который позволяет создавать изображение с помощью кнопки воспроизведения YouTube, расположенной над изображением:
Другой хорошей альтернативой было бы использование API oEmbed, который поддерживается YouTube.
Вы просто добавляете свой URL-адрес YouTube в соответствующий URL-адрес, и вы получите JSON, включающий миниатюру и код HTML для встраивания.
Пример:
http://www.youtube.com/oembed?format=json&url=http%3A//youtube.com/watch%3Fv%3DDLzxrzFCyOs
Даст тебе:
{
thumbnail_url: "https://i.ytimg.com/vi/DLzxrzFCyOs/hqdefault.jpg",
width: 459,
author_name: "AllKindsOfStuff",
version: "1.0",
author_url: "https://www.youtube.com/channel/UCLNd5EtH77IyN1frExzwPRQ",
thumbnail_width: 480,
type: "video",
provider_url: "https://www.youtube.com/",
html: "<iframe width="459" height="344" src=" frameborder="0" allowfullscreen></iframe>",
title: "Some title bla bla foo bar",
thumbnail_height: 360,
provider_name: "YouTube",
height: 344
}
Прочитайте документацию для получения дополнительной информации 2.
Вы можете получить идентификатор видео с URL-адреса видео YouTube, используя parse_url, parse_str, а затем вставить в прогностические URL-адреса для изображений. Спасибо YouTube за прогностические URL
$videoUrl = "
parse_str( parse_url( $videoUrl, PHP_URL_QUERY ), $my_array_of_vars );
$ytID = $my_array_of_vars['v']; //gets video ID
print "https://img.youtube.com/vi/<?php print $ytID?>/maxresdefault.jpg";
print "https://img.youtube.com/vi/<?php print $ytID?>/mqdefault.jpg";
print "https://img.youtube.com/vi/<?php print $ytID?>/hqdefault.jpg";
print "https://img.youtube.com/vi/<?php print $ytID?>/sddefault.jpg";
print "https://img.youtube.com/vi/<?php print $ytID?>/default.jpg";
Вы можете использовать этот инструмент для создания миниатюр YouTube
https://tools.tutsplanet.com/index.php/get-youtube-video-thumbnails
Простая функция PHP, которую я создал для миниатюры YouTube и типов
& NBSP ;
function get_youtube_thumb($link,$type){
$video_id = explode("?v=", $link);
if (empty($video_id[1])){
$video_id = explode("/v/", $link);
$video_id = explode("&", $video_id[1]);
$video_id = $video_id[0];
}
$thumb_link = "";
if($type == 'default' || $type == 'hqdefault' ||
$type == 'mqdefault' || $type == 'sddefault' ||
$type == 'maxresdefault'){
$thumb_link = 'http://img.youtube.com/vi/'.$video_id.'/'.$type.'.jpg';
}elseif($type == "id"){
$thumb_link = $video_id;
}
return $thumb_link;}
Если вы используете общедоступный API, лучший способ сделать это - использовать операторы if
.
Если видео общедоступное или не перечисленное, вы устанавливаете миниатюру с помощью метода URL. Если видео является приватным, вы используете API, чтобы получить миниатюру.
<?php
if($video_status == 'unlisted'){
$video_thumbnail = 'http://img.youtube.com/vi/'.$video_url.'/mqdefault.jpg';
$video_status = '<i class="fa fa-lock"></i> Unlisted';
}
elseif($video_status == 'public'){
$video_thumbnail = 'http://img.youtube.com/vi/'.$video_url.'/mqdefault.jpg';
$video_status = '<i class="fa fa-eye"></i> Public';
}
elseif($video_status == 'private'){
$video_thumbnail = $playlistItem['snippet']['thumbnails']['maxres']['url'];
$video_status = '<i class="fa fa-lock"></i> Private';
}