我能想到的检查视频状态的唯一解决方案是使用表中的字段将视频标记为已处理或未处理。然后将 cron 设置为每小时运行一次(或以您希望的频率运行一次)以检查视频状态。
我的表中的字段是 。NULL 表示未处理,如果已处理,则为 0。我的字段以 json 格式存储 YouTube 的视频 ID。videos
processed
api
这是我的 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');
}
}
}