嗨,我使用谷歌PHP API在PHP上传视频。我遵循本教程来实现这一点,它工作得很好。但是有一个问题,如果视频已经存在于我的频道,它也会返回视频详细信息,我找不到它是一个拒绝复制。
所以我不知道这是不是一个重复的视频,如果它是重复的,那么主视频是什么。表示与主视频进行重复比较的主视频的视频细节。
请帮我找出这是一个重复的视频或不是?
检查视频状态的唯一解决方案是使用表中的字段来标记视频是否已处理。然后设置一个cron每小时运行一次(或者任何你想要的频率)来检查视频状态。
我的videos
表中的字段是processed
。NULL表示未处理,0表示已处理。我的api
字段以json格式存储YouTube的视频ID。
下面是我的cron脚本:
# Starts the YouTubeService.
$youtube_obj=new Google_Service_YouTube($client);
# Get new uploaded videos from the database.
$unprocessed_videos=$db->get_results('SELECT `id`, `file_name`, `contributor`, `api` FROM `'.DBPREFIX.'videos` WHERE `processed` IS NULL');
# If there are new videos...
if($unprocessed_videos>0)
{
# Loop through the new videos
foreach($unprocessed_videos as $new_video)
{
# Has the video been processed? Default is TRUE. will be changed to FALSE if the video still has "uploaded" status.
$video_processed=TRUE;
# Decode the `api` field.
$api_decoded=json_decode($new_video->api);
# Get the YouTube Video ID.
$video_yt_id=$api_decoded->youtube_id;
if(isset($new_video->file_name))
{
# Set the path to the video on the server.
$video_path='videos'.DS.$new_video->file_name;
}
$to='uploaders email';
$reply_to='whomever';
$subject="Video status from ".DOMAIN_NAME;
$body='';
# Check the video status.
$check_status=$youtube_obj->videos->listVideos('status', array('id' => $video_yt_id));
# Did YouTube return results?
if(!empty($check_status['items']))
{
# Loop through the videos from YouTube.
foreach($check_status['items'] as $status)
{
if($status['status']['uploadStatus']=="uploaded")
{
# The video has not been processed yet so do not send an email.
$video_processed=FALSE;
}
# Check to see if the YouTube upload was a success.
elseif($status['status']['uploadStatus']=="processed")
{
# Tell the user the video was uploaded.
$body.='Your video has been uploaded to YouTube and can be viewed at http://'.FULL_DOMAIN.'media/videos/?video='.$new_video->id;
}
# Check if the uploaded video status is rejected.
elseif($status['status']['uploadStatus']=="rejected")
{
if(isset($new_video->file_name))
{
# Get the Upload class.
require_once 'Form'.DS.'Upload.php');
# Instantiate an Upload object.
$upload_obj=new Upload($video_path);
# Delete video file from server.
$upload_obj->deleteFile($video_path);
# Delete rejected video from YouTube
$delete_response=$youtube_obj->videos->delete($video_yt_id);
}
# Need to delete the entry from the database as well.
$db->query('DELETE FROM `'.DBPREFIX.'videos` WHERE `id` = '.$db->quote($new_video->id).' LIMIT 1');
# Check if the rejection status was a duplicate.
if($status['status']['rejectionReason']=="duplicate")
{
# Tell the user the video was a duplicate.
$body.='Your video was rejected because it was a duplicate video';
}
}
}
}
else
{
$body.='Your video was not found on YouTube';
$video_processed=TRUE;
}
# Update database if the video has been "processed".
if($video_processed===TRUE)
{
# Get the Email class.
require_once 'Email'.DS.'Email.php');
# Instantiate a new Email object.
$mail_obj=new Email();
$mail_obj->sendEmail($subject, $to, $body, $reply_to);
# Set video to processed.
$db->query('UPDATE `'.DBPREFIX.'videos` SET `processed` = 0 WHERE `id` = '.$db->quote($new_video->id).' LIMIT 1');
}
}
}
如果不能运行cron作业,您可能不得不在下次尝试访问视频时检查它是否是副本。
或者,在视频上传后,您可以启动另一个php脚本,该脚本会周期性地循环检查状态(在发出另一个API请求之前休眠一段时间)
do
{
$videos = $youtubeClient->videos->listVideos('status', ['id' => $videoId]);
$video = $videos['items'][0]; // assuming you want one video. Iterate over the items array otherwise
if($video['status']['uploadStatus'] == 'rejected' && $video['status']['rejectionReason'] == 'duplicate') {
// Notify user of duplicate and/or note failed upload in DB
}
else {
sleep(180);
}
} while ($video['status']['uploadStatus'] == 'processing')
您需要确保脚本可以从命令行运行,并且可以接受从原始上传脚本获取视频ID的参数。http://php.net/manual/en/function.getopt.php
就我个人而言,我不喜欢像这样启动带有循环的额外脚本,因为如果你不检查所有的边缘情况,你可能会以rouge进程告终,但是没有cron作业,你的选择是有限的。