Быстрый и надёжный хостинг на SSD-дисках от 165р в месяц   •   Реклама
2 606 просм
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.

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

40
комментариев
Форма комментирования этой статьи скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    784
      •  Администратор
    20 авг в 03:50

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

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

    <?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
    5
      •  Проверенный
    20 авг в 02:21

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

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

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

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

    • 1
    784
      •  Администратор
    20 авг в 01:24

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

    • 1
    5
      •  Проверенный
    20 авг в 00:58

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

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

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

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

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

    • 1
    784
      •  Администратор
    19 авг в 22:13

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

    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

    • 0
    5
      •  Проверенный
    18 авг в 19:49

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

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

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

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

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

    • 1
    5
      •  Проверенный
    18 авг в 13:11

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

    • 1
    784
      •  Администратор
    17 авг в 22:55

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

    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 запрос.

    • 0
    5
      •  Проверенный
    17 авг в 18:35

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

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

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

    • 0
    11
      •  Пользователь
    10 июл в 14:41

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

    • 0
    784
      •  Администратор
    10 июл в 00:20

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

    • 0
    11
      •  Пользователь
    9 июл в 23:16

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

    • 0
    784
      •  Администратор
    9 июл в 22:56

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

    • 0
    11
      •  Пользователь
    9 июл в 22:53

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

    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
    11
      •  Пользователь
    9 июл в 19:39

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

    • 0
    784
      •  Администратор
    9 июл в 19:21

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

    <?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
    11
      •  Пользователь
    9 июл в 15:37

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

    • 0
    784
      •  Администратор
    9 июл в 15:29

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

    • 0
    784
      •  Администратор
    9 июл в 14:52

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

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

    • 0
    11
      •  Пользователь
    9 июл в 10:44

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

    • 0
    11
      •  Пользователь
    9 июл в 10:27

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

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

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

    • 1
    784
      •  Администратор
    8 июл в 22:42

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

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

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

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

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

    • 1
    11
      •  Пользователь
    8 июл в 18:03

    Скопировал, не заработало. Но сделал следующее: скопировал ваш код, который ранее верно отображал время в фуллстори, добавил к нему строчку 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);

    ?>

    • 0
    784
      •  Администратор
    8 июл в 17:05

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

    <?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
    11
      •  Пользователь
    8 июл в 16:25

    Поставил, ошибка исчезла) Только теперь вместо времени отображается 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
    784
      •  Администратор
    8 июл в 14:40

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

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

    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
    11
      •  Пользователь
    8 июл в 14:09

    На 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
    11
      •  Пользователь
    8 июл в 12:44

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

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

    меняем на

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

    • 1
    784
      •  Администратор
    3 мар в 22:46

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

    • 0
    3
      •  Пользователь
    3 мар в 22:02

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

    • 1
    784
      •  Администратор
    3 мар в 20:43

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

    [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

    • 0
    3
      •  Пользователь
    3 мар в 19:06

    Движок DLE 13.0

    • 0
    784
      •  Администратор
    3 мар в 18:22

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

    • 0
    3
      •  Пользователь
    3 мар в 15:14

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

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

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

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

    • 1
    679
      •  Гости
    8 апр в 23:47

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

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

    • 0
    679
      •  Гости
    8 апр в 22:05

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

    • 5
    784
      •  Администратор
    8 апр в 21:53

    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.

    • 0
    679
      •  Гости
    8 апр в 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

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

    • 6
    784
      •  Администратор
    8 апр в 16:36

    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. Чистите кэш сайта. На этом должно быть все.

    • 1
    679
      •  Гости
    8 апр в 15:39

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

Подняться наверх
«Pandoge» - помощник вебмастера