Youtube PHP APi Check VIdeo Is Duplicate Or Not

嗨,我正在使用Google PHP API在PHP中上传视频。我已经按照本教程来实现这一点,它工作正常。但是,如果我的频道中已经存在视频,则存在问题,它也返回视频详细信息,我找不到它被拒绝重复。

所以我找不到这是一个重复的视频与否,如果它是重复的,那么什么是主要视频。指将主视频的视频详细信息进行比较为重复。

请帮我找到这是一个重复的视频与否?


答案 1

我能想到的检查视频状态的唯一解决方案是使用表中的字段将视频标记为已处理或未处理。然后将 cron 设置为每小时运行一次(或以您希望的频率运行一次)以检查视频状态。

我的表中的字段是 。NULL 表示未处理,如果已处理,则为 0。我的字段以 json 格式存储 YouTube 的视频 ID。videosprocessedapi

这是我的 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');
        }
    }
}

答案 2

如果没有运行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作业,您的选择是有限的。


推荐