从YouTube链接中获取视频时长。

11

我正在寻找一个函数,可以从YouTube视频的网址中获取视频的持续时间。我读了一些教程,但还是不懂。我使用网址嵌入视频到我的网站上,并且我有一个函数可以获取缩略图,我只是想要类似的东西来获取持续时间。以下是我获取缩略图的方式...

function get_youtube_screen_link( $url = '', $type = 'default', $echo = true ) {
if( empty( $url ) )
    return false;

if( !isset( $type ) )
    $type = '';

$url = esc_url( $url );

preg_match("|[\\?&]v=([^&#]*)|",$url,$vid_id);

if( !isset( $vid_id[1] ) )
    return false;

$img_server_num =  'i'. rand(1,4);

switch( $type ) {
    case 'large':
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/0.jpg";
        break;
    case 'first':
        // Thumbnail of the first frame
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/1.jpg";
        break;
    case 'small':
        // Thumbnail of a later frame(i'm not sure how they determine this)
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/2.jpg";
        break;
    case 'default':
    case '':
    default:
        $img_link = "http://{$img_server_num}.ytimg.com/vi/{$vid_id[1]}/default.jpg";
        break;
}
if( $echo )
    echo $img_link;
else
    return $img_link;

}

7个回答

13

你可以使用类似于这样的代码:

<?php

    function getDuration($url){

        parse_str(parse_url($url,PHP_URL_QUERY),$arr);
        $video_id=$arr['v']; 


        $data=@file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$video_id.'?v=2&alt=jsonc');
        if (false===$data) return false;

        $obj=json_decode($data);

        return $obj->data->duration;
    }

    echo getDuration('http://www.youtube.com/watch?v=rFQc7VRJowk');

?>

返回视频长度的秒数。

参考: http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html

您可以使用像这样的函数将秒数转换为小时、分钟和秒。


我需要$video_id从每篇文章输入的自定义字段的URL中获取它。 - Pollux Khafra
更新示例以从URL获取video_id。 - stewe
我将其用作函数,它可以正常工作,但如果YouTube上的视频已被删除,则会出现输出错误。我该如何编写if语句以防止这种情况发生? - Pollux Khafra
将示例更新为如果视频不存在则返回false。 - stewe
感谢您的时间和帮助!一切都运行得非常完美。 - Pollux Khafra
此端点不再可用,您现在必须使用YouTube v3 API。 - Ben Cole

5

YouTube API V3


用法

echo youtubeVideoDuration('video_url', 'your_api_key');
// output: 63 (seconds)

函数

/**
* Return video duration in seconds.
* 
* @param $video_url
* @param $api_key
* @return integer|null
*/
function youtubeVideoDuration($video_url, $api_key) {

    // video id from url
    parse_str(parse_url($video_url, PHP_URL_QUERY), $get_parameters);
    $video_id = $get_parameters['v'];

    // video json data
    $json_result = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$video_id&key=$api_key");
    $result = json_decode($json_result, true);

    // video duration data
    if (!count($result['items'])) {
        return null;
    }
    $duration_encoded = $result['items'][0]['contentDetails']['duration'];

    // duration
    $interval = new DateInterval($duration_encoded);
    $seconds = $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + $interval->s;

    return $seconds;
}

不适用于我,显示 file_get_content 被阻止出于安全原因。 - omer schleifer
不要使用api_key,应该使用“key”。 - NecipAllef

4
这是我获取YouTube视频时长的函数,以秒为单位。 它完全可行,100%有效。 您只需要提供YouTube视频ID和YouTube API密钥即可。
如何添加YouTube API密钥,请查看此视频https://www.youtube.com/watch?v=4AQ9UamPN6E
public static function getYoutubeDuration($id)
    {



         $Youtube_KEY='';

         $dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={$id}&key={$Youtube_KEY}");

         $vTime='';
         $H=0;
         $M=0;
         $S=0;

         $duration = json_decode($dur, true);
         foreach ($duration['items'] as $vidTime) {
         $vTime = $vidTime['contentDetails']['duration'];
         }

         $vTime = substr($vTime, 2);
         $exp = explode("H",$vTime);

         //if explode executed
         if( $exp[0] != $vTime )
         {
             $H = $exp[0];
             $vTime = $exp[1];
         }

         $exp = explode("M",$vTime);

         if( $exp[0] != $vTime )
         {
             $M = $exp[0];
             $vTime = $exp[1];
         }

         $exp = explode("S",$vTime);
         $S = $exp[0];


         $H = ($H*3600);
         $M = ($M*60);
         $S = ($H+$M+$S);


         return $S;

    }

这是我获取YouTube视频时长的函数,可以将结果转换为秒。它完全有效,只需要提供YouTube视频ID和API密钥即可。
如何添加YouTube API密钥,请查看此视频 https://www.youtube.com/watch?v=4AQ9UamPN6E

0

1) 您需要一个API密钥。前往https://developers.google.com/并登录或创建帐户(如果需要)。登录后,转到此链接https://console.developers.google.com/project并单击蓝色的CREATE PROJECT按钮。稍等片刻,谷歌将准备好您的项目。

2) 您需要一个运行PHP且支持file_get_content的Web主机。您可以通过创建一个仅包含“echo php_info();”的新脚本并验证allow_url_fopen是否设置为On来检查。如果没有,则更改配置或与您的Web主机交谈。

<?php

  $sYouTubeApiKey = "<enter the key you get>";
  //Replace This With The Video ID. You can get it from the URL.
  //ie https://www.youtube.com/XWuUdJo9ubM would be
  $sVideoId = "XWuUdJo9ubM";

  //Get The Video Details From The API.
  function getVideoDetails ($sVideoId) {
    global $sYouTubeApiKey;
    //Generate The API URL
    $sUrl = "https://www.googleapis.com/youtube/v3/videos?id=".$sVideoId."&key=".$sYouTubeApiKey."&part=contentDetails";
    //Perform The Request
    $sData = file_get_contents($sUrl);
    //Decode The JSON Response
    return json_decode($sData);
  }

  //Get The Video Duration In Seconds.
  function getVideoDuration ($sVideoId) {
    $oData = getVideoDetails($sVideoId);
    //Deal With No Videos In List
    if (count($oData->items) < 1) return false;
    //Get The First Video
    $oVideo = array_shift($oData->items);
    //Extract The Duration
    $sDuration = $oVideo->contentDetails->duration;
    //Use Regular Expression To Parse The Length
    $pFields = "'PT(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9]+)S)?'si";
    if (preg_match($pFields, $sDuration, $aMatch)) {
      //Add Up Hours, Minutes, and Seconds
      return $aMatch[1]*3600 + $aMatch[2]*60 + $aMatch[3];
    }
  }

  header("Content-Type: text/plain");
  $oData = getVideoDetails($sVideoId);
  print_r($oData);
  echo "Length: ".getVideoDuration($sVideoId);
?>

希望这能有所帮助!

0
function getYoutubeDuration($videoid) {
      $xml = simplexml_load_file('https://gdata.youtube.com/feeds/api/videos/' . $videoid . '?v=2');
      $result = $xml->xpath('//yt:duration[@seconds]');
      $total_seconds = (int) $result[0]->attributes()->seconds;

      return $total_seconds;
}

//now call this pretty function. 
//As parameter I gave a video id to my function and bam!
echo getYoutubeDuration("y5nKxHn4yVA");

0
你可以使用时间格式化器将秒数转换为任何你喜欢的格式。 例如:返回 gmdate("H:i:s", $obj->data->duration);

0

不使用任何Google API的答案:

如果您想要为项目获取有限数量的视频长度,并且您不关心可靠性(即不用于生产),那么这里有一个简单而粗糙的基于Python的网络爬虫解决方案,它不需要任何API密钥。

import requests
def get_youtube_video_length_from_url(url: str = None):
    """
    Returns youtube video length in the format minute(s): seconds from the url
    """
    text = requests.get(url).text
    str_id = text.find("""<meta itemprop="duration""")
    return (
        text[str_id : str_id + 60]
        .split("content=")[1]
        .split(">")[0]
        .replace('"', "")
        .replace("PT", "")
        .replace("M", ":")
        .replace("S", "")
    )

例子:

get_youtube_video_length_from_url("https://www.youtube.com/watch?v=dQw4w9WgXcQ")

# 3:33

使用这种解决方案,我大约每秒获得一个结果,并且我没有遇到过很快的IP禁令(我可以查询超过200次而没有任何封禁)。

附注:只要YouTube不更改YouTube网页代码,它可能有效。如果更改了,则可能需要修改代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接