Если у меня есть URL-адрес видео YouTube, есть ли способ использовать PHP и cURL для получения связанного эскиза из API YouTube?
На каждом видеоролике YouTube есть 4 сгенерированных изображения. Они предсказуемо отформатированы следующим образом:
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. Кроме того, немного более короткое имя хоста i3.ytimg.com
работает вместо img.youtube.com
в приведенных выше примерах.
В качестве альтернативы вы можете использовать API данных YouTube (v3) для получения миниатюр.
http
на https
в любом из приведенных выше URL.
Вы можете использовать API данных YouTube для получения миниатюр, заголовков, описания, рейтинга, статистики и т.д. API версии 3 требует ключ *. Получите ключ и создайте видео: список:
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, которые вы планируете сделать. Тем не менее, несколько миллионов запросов в день бесплатны.
jsonc
вместо json
для getJSON. Это происходит из-за неправильной структуры JSON.
jsonc
. Примеры JQuery и PHP ДОЛЖНЫ использовать json
. И я обновил код, чтобы соответствовать новой структуре JSON. Я использую код прямо сейчас, и он работает в прямом эфире. так что не говорите, что это не работает без чтения изменений. Спасибо!
Асаф сказал правильно. Однако не все видеоролики YouTube содержат все девять миниатюр, но для каждого видео есть семь миниатюр. Это:
(Размер изображения зависит от видео.)
Значок фона проигрывателя (480x360 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/0.jpg
Запустите миниатюру (120x90 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/1.jpg
Средняя миниатюра (120x90 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/2.jpg
End Thumbnail (120x90 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/3.jpg
Миниатюра высокого качества (480x360 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/hqdefault.jpg
Миниатюры среднего качества (320x180 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/mqdefault.jpg
Миниатюра нормального качества (120x90 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/default.jpg
Кроме того, следующие два миниатюры могут быть или не существовать. Для видео HQ они существуют.
Миниатюра стандартного разрешения (640x480 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/sddefault.jpg
Максимальное разрешение (1920x1080 пикселей) https://i1.ytimg.com/vi/G0wGs3useV8/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
.
https://i.ytimg.com/vi/<video id>/mqdefault.jpg
.
В API данных YouTube версии 3 вы можете получить миниатюры видео с помощью video- > list. Из snippet.thumbnails. (Key) вы можете выбрать миниатюру по умолчанию, среднего или высокого разрешения и получить ее ширину, высоту и URL.
Вы также можете обновить миниатюры с помощью эскизов- > установить.
В качестве примера вы можете проверить проект PHP-версии.)
Вы можете получить Video Entry, который содержит URL-адрес миниатюры видео. Вот пример кода в ссылке. Или, если вы хотите проанализировать XML, здесь здесь. Возвращенный XML имеет элемент media:thumbnail
, который содержит URL-адрес эскиза.
Я сделал функцию только для извлечения существующих изображений из 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;
}
// 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 ВЕРСИЯ API 3 ** ВВЕРХ И РАБОТА В 2 МИНУТ **
Если все, что вы хотите сделать, это поиск на YouTube и получение связанных свойств:
2. Используйте строку запроса ниже. Поисковый запрос (обозначаемый q =) в строке url представляет собой stackoverflow для примера. Затем YouTube отправит вам ответ json, где вы сможете разобрать для Thumbnail, Snippet, Author и т.д.
https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&maxResults=50&q=stackoverflow&key=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 Thumbnails таким образом:
$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 Rest, в этом случае 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, размещенной над изображением:
простая функция php i, созданная для миниатюры youtube, и типы
maxresdefault
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 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="https://www.youtube.com/embed/DLzxrzFCyOs?feature=oembed" frameborder="0" allowfullscreen></iframe>",
title: "Some title bla bla foo bar",
thumbnail_height: 360,
provider_name: "YouTube",
height: 344
}
Прочитайте документацию для более Информация.
Если вы используете публичный 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';
}
YouTube Предоставляет нам 4 сгенерированных изображения для каждого видео через API данных (v3), для Ex -
https://i.ytimg.com/vi/V_zwalcR8DU/maxresdefault.jpg
https://i.ytimg.com/vi/V_zwalcR8DU/sddefault.jpg
https://i.ytimg.com/vi/V_zwalcR8DU/hqdefault.jpg
https://i.ytimg.com/vi/V_zwalcR8DU/mqdefault.jpg
В соответствии с этим вам нужно рассказать свой URL-адрес следующим образом:
www.googleapis.com/youtube/v3/videos?part=snippet&id= yourVideoId
& ключ = yourApiKey
Теперь измените yourVideoId и yourApiKey на ваш соответствующий идентификатор видео и api-ключ, и его ответ будет выходом JSON, обеспечивающим 4 ссылки в миниатюрах переменной фрагмента (если все доступно).
Я думаю, что у них много ответов на миниатюру, но я хочу добавить некоторые другие URL-адреса, чтобы получить эскиз youtube очень легко. Я просто беру текст из ответа Асафа. Вот несколько url для получения эскизов youtube
https://ytimg.googleusercontent.com/vi/<insert-youtube-video-id-here>/default.jpg
Для высококачественной версии эскиза используйте URL-адрес, похожий на этот:
https://ytimg.googleusercontent.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
Существует также версия миниатюры среднего качества с использованием URL-адреса, подобного HQ:
https://ytimg.googleusercontent.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg
Для версии миниатюры стандартной версии используйте URL-адрес, подобный этому:
https://ytimg.googleusercontent.com/vi/<insert-youtube-video-id-here>/sddefault.jpg
Для версии максимального разрешения эскиза используйте URL-адрес, похожий на этот:
https://ytimg.googleusercontent.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
Надеюсь, что это поможет кому-то в ближайшем будущем.
function get_video_thumbnail( $src ) {
$url_pieces = explode('/', $src);
if( $url_pieces[2] == 'dai.ly'){
$id = $url_pieces[3];
$hash = json_decode(file_get_contents('https://api.dailymotion.com/video/'.$id.'?fields=thumbnail_large_url'), TRUE);
$thumbnail = $hash['thumbnail_large_url'];
}else if($url_pieces[2] == 'www.dailymotion.com'){
$id = $url_pieces[4];
$hash = json_decode(file_get_contents('https://api.dailymotion.com/video/'.$id.'?fields=thumbnail_large_url'), TRUE);
$thumbnail = $hash['thumbnail_large_url'];
}else if ( $url_pieces[2] == 'vimeo.com' ) { // If Vimeo
$id = $url_pieces[3];
$hash = unserialize(file_get_contents('http://vimeo.com/api/v2/video/' . $id . '.php'));
$thumbnail = $hash[0]['thumbnail_large'];
} elseif ( $url_pieces[2] == 'youtu.be' ) { // If Youtube
$extract_id = explode('?', $url_pieces[3]);
$id = $extract_id[0];
$thumbnail = 'http://img.youtube.com/vi/' . $id . '/mqdefault.jpg';
}else if ( $url_pieces[2] == 'player.vimeo.com' ) { // If Vimeo
$id = $url_pieces[4];
$hash = unserialize(file_get_contents('http://vimeo.com/api/v2/video/' . $id . '.php'));
$thumbnail = $hash[0]['thumbnail_large'];
} elseif ( $url_pieces[2] == 'www.youtube.com' ) { // If Youtube
$extract_id = explode('=', $url_pieces[3]);
$id = $extract_id[1];
$thumbnail = 'http://img.youtube.com/vi/' . $id . '/mqdefault.jpg';
} else{
$thumbnail = tim_thumb_default_image('video-icon.png', null, 147, 252);
}
return $thumbnail;
}
get_video_thumbnail('https://vimeo.com/154618727');
get_video_thumbnail('https://www.youtube.com/watch?v=SwU0I7_5Cmc');
get_video_thumbnail('https://youtu.be/pbzIfnekjtM');
get_video_thumbnail('http://www.dailymotion.com/video/x5thjyz');
Лучший ответ, оптимизированный для ручного использования. Маркер идентификатора видео без разделителей позволяет выбирать с двойным щелчком.
На каждом видеоролике YouTube есть 4 сгенерированных изображения. Они предсказуемо отформатированы следующим образом:
https://img.youtube.com/vi/YOUTUBEVIDEOID/0.jpg
https://img.youtube.com/vi/YOUTUBEVIDEOID/1.jpg
https://img.youtube.com/vi/YOUTUBEVIDEOID/2.jpg
https://img.youtube.com/vi/YOUTUBEVIDEOID/3.jpg
Первый в списке - это изображение полного размера, а другие - уменьшенные изображения. Миниатюра изображения по умолчанию (то есть одна из 1.jpg
, 2.jpg
, 3.jpg
):
https://img.youtube.com/vi/YOUTUBEVIDEOID/default.jpg
Для высококачественной версии эскиза используйте URL-адрес, похожий на этот:
https://img.youtube.com/vi/YOUTUBEVIDEOID/hqdefault.jpg
Существует также версия миниатюры среднего качества с использованием URL-адреса, подобного HQ:
https://img.youtube.com/vi/YOUTUBEVIDEOID/mqdefault.jpg
Для версии миниатюры стандартной версии используйте URL-адрес, подобный этому:
https://img.youtube.com/vi/YOUTUBEVIDEOID/sddefault.jpg
Для версии максимального разрешения эскиза используйте URL-адрес, похожий на этот:
https://img.youtube.com/vi/YOUTUBEVIDEOID/maxresdefault.jpg
Все вышеперечисленные URL-адреса доступны через http. Кроме того, немного более короткое имя хоста i3.ytimg.com
работает вместо img.youtube.com
в приведенных выше примерах.
В качестве альтернативы вы можете использовать API данных YouTube (v3) для получения миниатюр.
public const string tubeThumb = "http://i.ytimg.com/vi/[id]/hqdefault.jpg";
vid.Thumbnail = tubeThumb.Replace("[id]", vid.VideoID);
Сохранить файл как .js
var maxVideos = 5;
$(document).ready(function(){
$.get(
"https://www.googleapis.com/youtube/v3/videos",{
part: 'snippet,contentDetails',
id:'your_vedio_id',
kind: 'youtube#videoListResponse',
maxResults: maxVideos,
regionCode: 'IN',
key: 'Your_API_KEY'},
function(data){
var output;
$.each(data.items, function(i, item){
console.log(item);
thumb = item.snippet.thumbnails.high.url;
output = '<div id="img"><img src="' + thumb + '"></div>';
$('#thumbnail').append(output);
})
}
);
});
.main{
width:1000px;
margin:auto;
}
#img{
float:left;
display:inline-block;
margin:5px;
}
<!DOCTYPE html>
<html>
<head>
<title>Thumbnails</title>
</head>
<body>
<div class="main">
<ul id="thumbnail"> </ul>
</div>
</body>
</html>