使用YouTube API获取持续时间


Get duration using YouTube API

我需要使用Youtube API V3获取视频持续时间。我的应用程序在API V3上运行良好,但现在不起作用了。

我找到了一个工作示例,它很有效:

$dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=[VIDOID]&key=[API KEY]");

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

署名:Youtube API v3,如何获得视频持续时间?

这将返回类似这样的时间格式。

PT24M30S 

我怎么能把它保存到可读的时间。比如24:30?

我简直不敢相信,有人用过DateInterval,为什么?就像这样:

$duration = new DateInterval('PT24M30S');
print $duration->format('%H:%i:%s'); // outputs: 00:24:30

有用的链接:

  • DateInterval类
  • DateInterval::格式

一种可能的方法是使用函数str_replace();

$stamp = "PT24M30S";
$formated_stamp = str_replace(array("PT","M","S"), array("",":",""),$stamp);
echo $formated_stamp; //should give "24:30"

奖金内容-前导零

为了添加前导零,必须首先用explode()将字符串拆分,然后用sprintf()单独格式化数字;最后再把它们加在一起。

$exploded_string = explode(":",$formated_stamp);
$new_formated_stamp = sprintf("%02d", $exploded_string[0]).":".sprintf("%02d", $exploded_string[1]);
 $time_format = "PT24M30S ";
preg_match_all('/('d+)/',$time_format,$parts);
$hours = floor($parts[0][0]/60);
$minutes = $parts[0][0]%60;
$seconds = $parts[0][1];
echo $hours . ": ". $minutes .":". $seconds; 

视频资源包含一个duration字段,该字段是以下格式的string。这将取决于您的开发人员根据您的应用程序和需要重新格式化它。

contentDetails.duration

视频的长度。标记值为ISO 8601持续时间。对于例如,对于长度至少为一分钟且小于一小时长,持续时间为PT#M#S格式,其中字母PT表示该值指定一段时间字母M和S分别表示以分钟和秒为单位的长度。M和S字母前面的#字符都是整数指定视频的分钟数(或秒数)。例如PT15M33S的值表示视频为15分钟和33秒长。

如果视频长度至少为一小时,则持续时间为PT#H#M#S,其中字母H前面的#指定长度视频的小时数,所有其他细节与如上所述。如果视频长度至少为一天,则字母P并且该值的格式是P#DT#H#M#s。请有关完整的详细信息,请参阅ISO 8601规范。

至于如何做到这一点,我不得不说删除PT和S,并将M替换为:。它可能需要对您的部分进行一些测试,这取决于当值为null时会发生什么。我会对ISO-8061 进行一些研究

我使用以下函数来转换YouTube的持续时间。只需将$yt替换为YouTube为您提供的格式,它就会打印出好看可读的内容。

function ConvertYoutubeVideoDuration($yt){
$yt=str_replace(['P','T'],'',$yt);
foreach(['D','H','M','S'] as $a){
    $pos=strpos($yt,$a);
    if($pos!==false) ${$a}=substr($yt,0,$pos); else { ${$a}=0; continue; }
    $yt=substr($yt,$pos+1);
}
if($D>0){
    $M=str_pad($M,2,'0',STR_PAD_LEFT);
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return ($H+(24*$D)).":$M:$S"; // add days to hours
} elseif($H>0){
    $M=str_pad($M,2,'0',STR_PAD_LEFT);
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return "$H:$M:$S";
} else {
    $S=str_pad($S,2,'0',STR_PAD_LEFT);
    return "$M:$S";
}
}

解决方案PHP

function covtime($youtube_time){
            preg_match_all('/('d+)/',$youtube_time,$parts);
            $hours = $parts[0][0];
            $minutes = $parts[0][1];
            $seconds = $parts[0][2];
            if($seconds != 0)
                return $hours.':'.$minutes.':'.$seconds;
            else
                return $hours.':'.$minutes;
        }