Информер курса валют ЦБ РФ   •   Магазин расширений
2 055 просм
40 комм
Поделиться:

Как получить продолжительность ролика YouTube на PHP+API?

Итак, мы с вами уже научились получать API KEY сервиса YouTube для получения данных о ролике, и сегодня мы рассмотрим первый и простой способ получения информации об указанном ролике, а именно – его продолжительность.

Напишем небольшую функцию, которая и будет возвращать нам данные.

Функция будет выглядеть так:

function get_time_youtube($id_video) {

	$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";
	$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);
	$get_data = json_decode($get_data, true);
	$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

	$result_time = new \DateInterval($result_time);
	$total_sec = $result_time->days * 86400 + $result_time->h * 3600 + $result_time->i * 60 + $result_time->s;
	$total_time = new DateTime("@".$total_sec);

	return $total_time->format("H:i:s");

}

И, соответственно, ее использование:

echo "Длительность ролика: ".get_time_youtube("bhXZiG4bsjA");

На что тут стоит обратить внимание?

  1. $api_key – это ваш персональный ключ доступа. О том, как его получить, написано здесь.
  2. bhXZiG4bsjA – ID видео, узнать его можно по ссылке.

Например, в ссылке на видео https://www.youtube.com/watch?v=bhXZiG4bsjA – часть bhXZiG4bsjA и есть ваш ID.

Если что-то вам показалось непонятным – пишите об этом в комментариях.

«Pandoge» - помощник веб-мастера
40
комментариев
8.04 в 15:39

Странный у меня вопрос.. но как использовать эту функцию в dle? Что только не придумывал, не получается у меня вставить её в шаблон. Чувствую что это просто, и явно я просто вставляю echo как то не так. Артём, помогите пожалуйста))

  • 1

Scorp, исключительно для Вас.

1. В шаблон полной или краткой новости вставляете:

[xfgiven_xxx]

{include file="engine/modules/get_time_youtube.php?video_id=[xfvalue_xxx]"}

[/xfgiven_xxx]

xxx - название вашего поля, в котором храниться ID видео.

2. Создаете файл get_time_youtube.php со следующим содержимым:

<?php

function get_time_youtube($id_video) {

$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$

id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

preg_match_all("/(\d+)/", $result_time, $parts);

$hours = intval(floor($parts[0][0] / 60) * 60 * 60);

$minutes = intval($parts[0][0] % 60 * 60);

$seconds = intval($parts[0][1]);

$totalSec = $hours + $minutes + $seconds;

return date("H:i:s", mktime(0, 0, $totalSec));

}

echo "Длительность ролика: ".get_time_youtube($video_id);

?>

Его Вы загружаете в /engine/modules/

3. Чистите кэш сайта. На этом должно быть все.

  • 6
8.04 в 21:23

Я благодарю Вас Артём за помощь! Но ничего не выходит.

Если делать в точности как Вы написали, то выдаётся ошибка: File engine/modules/get_time_yottube.php not found.

Если же предположить что Вы опечатались и указали название файла в 1 пункте не верное и исправить его на engine/modules/get_time_youtube.php, то на сайте появляется такая ошибка: Parse error: syntax error, unexpected 'id_video' (T_STRING), expecting variable (T_VARIABLE) or '$' in /var/www/user7841/data/www/мой сайт/engine/modules/get_time_youtube.php on line 7

Что не так я сделал? Спасибо!

  • 0

Scorp, ошибки нет. Просто код разбился на части.

Эту часть

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$

id_video."&key=".$api_key);

сделайте в одну строку + сразу после <?php добавьте:

if(!defined('DATALIFEENGINE')) {

die("Hacking attempt!");

}

И не забудьте создать свой API KEY.

  • 5
8.04 в 22:05

Артём, ещё раз от души огромное спасибо!!! Теперь всё работает.

  • 0
8.04 в 23:47

Хм.. не всё так просто. Когда вставляешь в полную новость, то всё норм, но когда вставляешь в краткую новость, то ошибка в строке function get_time_youtube($id_video) {

Далее я поставил я в краткую новость, но для раздела закладок и если 1 закладка, то работает, а если две и более закладки, то нет. В этом сумеете помочь? angel

  • 1

Как сделать к примеру что бы можно было добавлять любые ролики с ютуба но через дополнительное поле

с моими размерами видео?

Так сказать если кто то просто вставляет ссылку на видео в это поле то после публикации оно было бы нужных размеров которые я поставлю в настройках.

А то так не удобно вставлять через редактор и каждый раз изменять размер

  • 0

Виктор Лобанов, про какой движок идет речь?

  • 0

Движок DLE 13.0

  • 0

Виктор Лобанов, а официальную документацию по движку не читали? Там хорошо все написано.

[xfgiven_x]

<iframe width="560" height="315" src="[xfvalue_x]" frameborder="0" allowfullscreen></iframe>

[/xfgiven_x]

x три раза меняете на название вашего поля. В само поле пишите ссылки на видео с YouTube через embed. То есть, если видео имеет такой адрес:

https://www.youtube.com/watch?v=bhXZiG4bsjA

на сайте, в поле, Вы прописываете его так:

https://www.youtube.com/embed/bhXZiG4bsjA

  • 1

Спасибо просто не так давно стал изучать DLE

  • 0

Виктор Лобанов, ааа... Тогда обращайтесь wink

  • 1

В коде есть ошибка. Минуты с секундами перепутаны.

return date("H:i:s", mktime(0, 0, $totalSec));

меняем на

return date("H:s:i", mktime(0, 0, $totalSec));

  • 0

На DLE 13.2 в фуллстори всё работает. А в шортстори выходит ошибка:

Fatal error: Cannot redeclare get_time_youtube() (previously declared in сайт/engine/modules/get_time_youtube.php:5) in /сайт/engine/modules/get_time_youtube.php on line 5

Кучу информации перерыл про include и include_once (со вторым, кстати, ошибки нет, но не работает). Пробовал делать вторые файлы, переименовывать.. ничего не срабатывает. Может что-то не так делаю. Объясните, пожалуйста, нубу :)

  • 0

Сергей Янковский, спасибо за замечание - поправили.

А что касается ошибки, сделайте так. Всю функцию из статьи замените на:

if(!function_exists("get_time_youtube")) {

function get_time_youtube($id_video) {

$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

preg_match_all("/(d+)/", $result_time, $parts);

$hours = intval(floor($parts[0][0] / 60) * 60 * 60);

$minutes = intval($parts[0][0] % 60 * 60);

$seconds = intval($parts[0][1]);

$totalSec = $hours + $minutes + $seconds;

return date("H:s:i", mktime(0, 0, $totalSec));

}

}

  • 0

Поставил, ошибка исчезла) Только теперь вместо времени отображается 00:00:00

Ключ API свой. Попробовал удалить последнюю скобку - вылетела ошибка. Может я echo "" .get_time_youtube($video_id); не туда ставлю?

Весь код у меня такой:

<?php if(!defined('DATALIFEENGINE')) {

die("Hacking attempt!");

}

if(!function_exists("get_time_youtube")) {

function get_time_youtube($id_video) {

$api_key = "ключ апи";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

preg_match_all("/(d+)/", $result_time, $parts);

$hours = intval(floor($parts[0][0] / 60) * 60 * 60);

$minutes = intval($parts[0][0] % 60 * 60);

$seconds = intval($parts[0][1]);

$totalSec = $hours + $minutes + $seconds;

return date("H:s:i", mktime(0, 0, $totalSec));

}

echo "" .get_time_youtube($video_id);

}

?>

  • 0

Сергей Янковский, попробуйте так:

<?php

if(!defined('DATALIFEENGINE')) {

die("Hacking attempt!");

}

if(!function_exists("get_time_youtube")) {

function get_time_youtube($id_video) {

$api_key = "ключ апи";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

preg_match_all("/(d+)/", $result_time, $parts);

$hours = intval(floor($parts[0][0] / 60) * 60 * 60);

$minutes = intval($parts[0][0] % 60 * 60);

$seconds = intval($parts[0][1]);

$totalSec = $hours + $minutes + $seconds;

return date("H:s:i", mktime(0, 0, $totalSec));

}

}

echo "" .get_time_youtube($video_id);

?>

  • 0

Скопировал, не заработало. Но сделал следующее: скопировал ваш код, который ранее верно отображал время в фуллстори, добавил к нему строчку if(!function_exists("get_time_youtube")) { из вашей подсказки, и перед echo добавил вторую }. Не совсем понял, что изменилось, но главное работает) Спасибо большое

В итоге получилось так:

<?php

if(!defined('DATALIFEENGINE')) {

die("Hacking attempt!");

}

if(!function_exists("get_time_youtube")) {

function get_time_youtube($id_video) {

$api_key = "ключ апи";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

preg_match_all("/(\d+)/", $result_time, $parts);

$hours = intval(floor($parts[0][0] / 60) * 60 * 60);

$minutes = intval($parts[0][0] % 60 * 60);

$seconds = intval($parts[0][1]);

$totalSec = $hours + $minutes + $seconds;

return date("H:s:i", mktime(0, 0, $totalSec));

}

}

echo "".get_time_youtube($video_id);

?>

  • 1

Сергей Янковский, ошибка в строке:

preg_match_all("/(d+)/", $result_time, $parts);

Должно быть так:

preg_match_all("/(\d+)/", $result_time, $parts);

В статье поправили. Спасибо за замечание. smiley

  • 1

Добрый день. Это снова я :)

Обнаружил такую штуку: если загрузить видео длинной в 5 секунд, то отображается 00:00:05. И если загрузить видео длинной 5 минут, то так же отображается 00:00:05. То есть секунды с минутами равнозначны. Попробовал поменять местами секунды с минутами на H:i:s и видео, которые идут от 1 минуты стали правильно отображаться, но те которые до 1 минуты (значения которых по идее должны отображаться в секундах - отображаются в минутах)

Подскажите, пожалуйста, как поправить?

  • 0

И, соответственно, если добавить часовое видео, например на 3:49:40, то отображается как 00:03:49. Это. при значении "H:i:s"

  • 0

Сергей Янковский, врать не буду, но вроде YouTube изменил формат времени, которое отдается в API.

Изменили функцию, сейчас должно работать - проверьте.

  • 0

Сергей Янковский, еще раз обновили функцию. До этого плохо минуты считало.

  • 0

Артем Мáлков, спасибо) Только не совсем пойму, как её в DLE вставить? До этого ваш код из предыдущих комментариев копировал, а код из самой статьи проверил, на DLE не работает

  • 0

Сергей Янковский, как и раньше через модуль:

<?php

if(!defined('DATALIFEENGINE')) {

die("Hacking attempt!");

}

if(!function_exists("get_time_youtube")) {

function get_time_youtube($id_video) {

$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

$result_time = $get_data["items"]["0"]["contentDetails"]["duration"];

$result_time = new \DateInterval($result_time);

$total_sec = $result_time->days * 86400 + $result_time->h * 3600 + $result_time->i * 60 + $result_time->s;

$total_time = new DateTime("@".$total_sec);

return $total_time->format("H:i:s");

}

}

echo "".get_time_youtube($video_id);

  • 0

Работает, спасибо большое!)

  • 0

Оооох. Это уже не смешно. Сначала всё хорошо работало. А потом вылетела ошибка. При том, что этот код уже вообще не трогал. Да и то, что трогал вернул в старое состояние, когда вылетела ошибка. И всё равно никуда она не уходит. Ошибка такого вида:

Fatal error: Uncaught exception 'Exception' with message 'DateInterval::__construct(): Unknown or bad format ()' in /home/y/yankov7s/video.helpblogger.org/public_html/engine/modules/get_time_youtube.php:16 Stack trace: #0 сайт/public_html/engine/modules/get_time_youtube.php(16): DateInterval->__construct('') #1 сайт/public_html/engine/modules/get_time_youtube.php(26): get_time_youtube('MEBxC4_SxaM') #2 сайт/public_html/engine/classes/templates.class.php(330): include('/home/y/yankov7...') #3 [internal function]: dle_template->load_file(Array) #4 сайт/public_html/engine/classes/templates.class.php(1021): preg_replace_callback('#\\{include file...', Array, '

  • 0

Сергей Янковский, тут без FTP от сайта и админки уже не смогу помочь.

  • 0

У вас личка в вк закрыта :)

  • 0

Сергей Янковский, отправьте в группу или в комментариях.

  • 0

Артем Мáлков, отправил

  • 0
17.08 в 18:35

Все отлично работает на DLE 13.2!

Но есть вопрос: а как сделать еще и вывод количества просмотров видео?

Это было бы просто бесценно!smiley

  • 0

Евгений, попробуйте так:

function get_view_youtube($id_video) {

$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

return $result_view = $get_data["items"]["0"]["statistics"]["viewCount"];

}

echo "Количество просмотров: ".get_view_youtube("bhXZiG4bsjA");

Если же Вы хотите получить одновременно и длительность и количество просмотров, то лучше объединить код из статьи и из комментария, чтобы получить необходимые данные о видео за 1 запрос.

  • 1
18.08 в 13:11

Артем Мáлков, огромное спасибо, это то, что нужно! wink

  • 1
18.08 в 19:49

Артем Мáлков, а вот интересно, к этой функции можно прикрутить склонение слов?

Чтобы на выходе было примерно следующее:

echo get_view_youtube($video_id, array('просмотр', 'просмотра', 'просмотров'));

И еще такой вопрос - функция выдает например число просмотров 65999 или 444333 (без пробелов или запятых между тысячными). Есть вариант сделать вывод в формате 65 999 или 444,333 ?

Заранее спасибо за ответ!

  • 0

Евгений, пробуйте:

function declination($number, $titles) {

$cases = array(2, 0, 1, 1, 1, 2);

return number_format($number, 0, "", " ")." ".$titles[($number%100>4 && $number%100<20) ? 2 : $cases[min($number%10, 5)]];

}

function get_view_youtube($id_video) {

$api_key = "AIzaSyC-tRTwkGhKL4eegGg6utVtsN4lklTs8oU";

$get_data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=".$id_video."&key=".$api_key);

$get_data = json_decode($get_data, true);

return $result_view = $get_data["items"]["0"]["statistics"]["viewCount"];

}

echo "Количество просмотров: ".declination(get_view_youtube("bhXZiG4bsjA"), array("просмотр", "просмотра", "просмотров"));

Подробнее о методах можете почитать тут:

https://www.pandoge.com/stati_i_sovety/razbivaem-chisla-na-razryady-na-javascript-php

https://www.pandoge.com/moduli_i_skripty/prostoe-sklonenie-chislitelnyh-na-php-javascript

  • 1
20.08 в 00:58

Артем Мáлков, ОГРОМНОЕ вам спасибо! Думаю код многим пригодится)

Статьи обязательно прочту - интересно разобраться.

Хотел еще спросить: этот код несет какую-нибудь существенную нагрузку?

Я так понимаю он никак не кэшируется...

(я в этих делах пока нуб smiley)

  • 1

Евгений, нет, не кешируется. Но можно сделать кеш с сохранением данных в базу или txt.

  • 1
20.08 в 02:21

Артем Мáлков, ну для меня сделать кэш этой функции в бд - это из разряда фантастики)))

Есть еще такой вопрос - на самом ютубе в шортстори пишет например 233 тыс. просмотров или 1,7 млн. просмотров, а в когда открываешь видео - там 233 000 или 1 700 00...

Т.е. по сути в шортстори каким-то образом обрезается до тыс. или млн. просмотров

Вам случайно не известен подобный хак?

  • 0

Евгений, самое простое - это делить искомое число на разные классы чисел.

Пример со своей функцией:

<?php

function sort_number($numb) {

if(($numb / 1000000000) > 1) { // Если при делении на миллиард получаем больше 1

return round($numb / 1000000000, 1)." млрд";

} elseif(($numb / 1000000) > 1) { // Если при делении на миллион получаем больше 1

return round($numb / 1000000, 1)." млн";

} elseif(($numb / 1000) > 1) { // Если при делении на тысячу получаем больше 1

return round($numb / 1000, 1)." тыч";

} else { // Все остальные маленькие числа

return $numb;

}

}

$my_number = "1 500 000"; // Искомое число

$my_number = preg_replace("/[^0-9]/", "", $my_number); // Получаем чистое число, без знаков и пробелов.

echo sort_number($my_number); // Выводим результат.

  • 0
Показать остальные комментарии  •••
Гостям запрещено участвовать в обсуждениях сайта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Подняться наверх