Обновление PHP-функции YouTube для V3 API

Я использовал функцию, которую создал после объединения разных фрагментов кода для своего блога Wordpress. Это позволило мне передать шорткод со значением, определяющим URL-адрес видео на YouTube, после чего он распечатал встроенное видео, количество просмотров и продолжительность непосредственно под ним.

К сожалению, похоже, что API, который я использовал, устарел Google, и я не могу заставить текущий API (v3) работать с этим кодом, поэтому я был бы признателен за помощь в попытке сделать это правильно. Я получил ключ разработчика от Google и могу получить ответ JSON, когда я открываю его прямо в своем браузере, но похоже, что вызовы в приведенном ниже коде по какой-то причине не хотят совпадать. Было бы полезно, если бы я все еще мог ссылаться на старый ответ API для сравнения, поэтому здесь я как бы летаю вслепую.

add_shortcode('yt', 'getYoutubeFrame');

// Convert Seconds to Minutes
  function sec2hms ($sec, $padHours = false) 
  {
    $hms = "";
    $hours = intval(intval($sec) / 3600); 
    $hms .= ($padHours) 
          ? str_pad($hours, 2, "0", STR_PAD_LEFT). ":"
          : $hours. ":";
    $minutes = intval(($sec / 60) % 60); 
    $hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT). ":";
    $seconds = intval($sec % 60); 
    $hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT);
    return $hms;
}

function getYoutubeFrame($atts) {
    extract(shortcode_atts(array(
    'video' => ''
    ), $atts));

    // Get YouTube data via the API
    $JSON = file_get_contents("https://gdata.youtube.com/feeds/api/videos?q=$video&alt=json");
    $JSON_Data = json_decode($JSON);
    $views = $JSON_Data->{'feed'}->{'entry'}[0]->{'yt$statistics'}->{'viewCount'};
    $views = number_format($views);
    $duration = $JSON_Data->{'feed'}->{'entry'}[0]->{'media$group'}->{'yt$duration'}->{'seconds'};


    $s = "<iframe width=\"1280\" height=\"720\" src=\"//www.youtube.com/embed/$video?showinfo=0&rel=0&modestbranding=1&theme=light&iv_load_policy=3&autohide=1&enablejsapi=1\" frameborder=\"0\" allowfullscreen></iframe>";
    $s .= "<strong>Views:</strong> $views<br><strong>Duration:</strong> ";
    $s .= sec2hms($duration);
    $s .= "<br /><br />";
    return $s;
    }

Похоже, что API изменил способ отображения продолжительности (с использованием ISO 8601 вместо необработанного количества секунд). Мой опыт и знания PHP довольно ограничены, иначе я, вероятно, решил бы это во сне! Любые предложения о том, как решить эту проблему?


person Ryan Murphy    schedule 25.06.2015    source источник
comment
Добро пожаловать в стек: в чем именно проблема с кодом? есть ли ошибка? Кстати, Gdata не был закрыт, вы все еще можете его использовать. Это клиентские серверы входа в систему, которые отключены, и вам нужно использовать Oauth2 сейчас.   -  person DaImTo    schedule 25.06.2015


Ответы (1)


Вы можете использовать вызов videos:list в v3 API YouTube, например это:

$JSON = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=statistics,contentDetails&id=$videoId&key={YOUR-API-KEY}");
$json_data = json_decode($JSON, true);

$views = $json_data['items'][0]['statistics']['viewCount'];
$duration =  $json_data['items'][0]['contentDetails']['duration'];

Это позволит получить количество просмотров и продолжительность видео, указанные в $videoId.

$duration вернется в формате ISO 8601, который выглядит примерно как PT4H48M18S. Вы можете передать это в класс DateInterval, а затем форматируйте как хотите. Например:

$dateInterval = new DateInterval($duration);
$formattedDuration = $dateInterval->format("%H:%I:%S");

возьмет PT4H48M18S и сделает так 04:48:18.

person theduck    schedule 25.06.2015