Youtube PHP APi 检查视频是不是重复

Posted

技术标签:

【中文标题】Youtube PHP APi 检查视频是不是重复【英文标题】:Youtube PHP APi Check VIdeo Is Duplicate Or NotYoutube PHP APi 检查视频是否重复 【发布时间】:2015-08-01 08:52:40 【问题描述】:

您好,我正在使用 Google php API 在 PHP 中上传视频。我已经按照this tutorial 实现了这一点,它工作正常。但是,如果我的频道中已经存在视频,则会出现问题,它还会返回视频详细信息,我找不到它因重复而被拒绝。

所以我找不到这是否是重复的视频,如果它是重复的,那么主视频是什么。表示被比较为重复的主视频的视频详细信息。

请帮我看看这是不是重复的视频?

【问题讨论】:

我的问题不清楚吗? 嘿,你有什么解决办法............ @bik,您想对照您的数据库或您的 youtube 频道检查重复的视频吗?详细说明以了解您的工作流程 @EmilioGort 感谢您的回复。我想检查 youtube 频道中的重复视频。实际上,当我通过 api 上传视频时,它正在返回上传。但是在处理视频之后,youtube 声明这是一个重复的视频。 【参考方案1】:

我能想到的检查视频状态的唯一解决方案是使用表中的字段将视频标记为已处理或未处理。然后设置一个 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');
        
    

【讨论】:

感谢您的回复。但它不起作用......它显示“listVideos”的错误...... @Bik 我想我应该提到我在自己的 YouTube 类中使用 YouTube 库的包装器方法。我已编辑我的答案以使用原始方法。 @Draven 你的答案对我不起作用,因为在我的情况下我不能使用 cron 来做到这一点......请帮助 @Learner 这是我能想到的唯一解决方案。如果你不能使用 cron,我帮不了你。 @Web_Developer 对不起,是你不理解他的问题。【参考方案2】:

如果无法运行 cron 作业,您可能必须在下次尝试访问视频时检查它是否重复。

或者,在上传视频后,您可以启动另一个 php 脚本,该脚本会在一个 while 循环中定期检查状态(在发出另一个 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 作业,您的选择就会受到限制。

【讨论】:

@Web_Developer 一定要提交你自己更好的答案,而不是错误地断言给出的两个答案不理解问题。 你是对的。最后,我们收到“已处理”状态。

以上是关于Youtube PHP APi 检查视频是不是重复的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 包含重复项的 YouTube API 数组

如何检查用户是不是通过 YouTube API 观看了视频

YouTube API:检查其他人的视频是不是被货币化

无法使用 PHP 的 API 访问 Youtube

如何检查 YouTube 频道是不是正在直播

YouTube API v3无法正常使用[重复]