使用 YouTube API 获取时长
Posted
技术标签:
【中文标题】使用 YouTube API 获取时长【英文标题】:Get duration using YouTube API 【发布时间】:2015-09-18 15:27:57 【问题描述】:我需要使用 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 , how to get video durations?
这将返回类似这样的时间格式。
PT24M30S
我怎样才能把它变成一个可读的时间。比如24:30?
【问题讨论】:
【参考方案1】:我不敢相信,有人用过DateInterval,为什么?就是这样:
$duration = new DateInterval('PT24M30S');
print $duration->format('%H:%i:%s'); // outputs: 00:24:30
有用的链接:
The DateInterval class DateInterval::format【讨论】:
这是最好的答案!如果使用 laravel,请不要忘记将类导入控制器或您正在使用的任何东西:use DateInterval;
【参考方案2】:
一种可能的方法是使用函数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]);
【讨论】:
请注意,这会将PT2M3S
转换为2:3
【参考方案3】:
$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;
【讨论】:
【参考方案4】:video resource 包含一个 duration
字段,它是一个以下格式的 string
。开发人员可以根据您的应用程序和需求重新格式化它。
contentDetails.duration
视频的长度。标记值是 ISO 8601 持续时间。为了 例如,对于至少一分钟且少于一分钟的视频 一小时长,持续时间的格式为 PT#M#S,其中 字母 PT 表示该值指定一个时间段,而 字母 M 和 S 分别表示以分钟和秒为单位的长度。 M 和 S 字母前面的 # 字符都是整数 指定视频的分钟数(或秒数)。例如, 值为 PT15M33S 表示视频为 15 分 33 秒长。
如果视频长度至少为一小时,则时长采用以下格式 PT#H#M#S,其中字母 H 前面的 # 指定长度 以小时为单位的视频,所有其他细节都与 如上所述。如果视频长度至少为一天,则字母 P 和 T 是分开的,值的格式是 P#DT#H#M#S。请 有关完整的详细信息,请参阅 ISO 8601 规范。
至于怎么做,我不得不说删除 PT 和 S 并用 : 替换 M。根据值为空时发生的情况,您可能需要进行一些测试。我会对ISO-8061做一些研究
【讨论】:
【参考方案5】:我使用以下函数来转换 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";
【讨论】:
【参考方案6】:解决方案 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;
【讨论】:
以上是关于使用 YouTube API 获取时长的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 Youtube 数据 API v3.0 获取时长(时间)视频