Подтвердить что ты не робот

Youtube PHP APi Check VIdeo дублируется или нет

Привет, я использую API Google PHP для загрузки видео на PHP. Я выполнил этот учебник, чтобы реализовать это, и он работает нормально. Но есть проблема, если видео уже существует в моем канале, оно также возвращает детали видео, и я не могу найти, что это отклонено для дубликата.

Итак, я не могу найти это дублирующее видео или нет, и если это дубликат, то каково основное видео. Означает видеоинформацию основного видео, с которой оно сравнивается как дублирующее.

Пожалуйста, помогите мне найти это дублирующее видео или нет?

4b9b3361

Ответ 1

Единственное решение, которое я мог бы проверить, чтобы проверить статус видео, - использовать поле в таблице, чтобы пометить видео как обработанное или нет. Затем установите cron для запуска каждый час (или, как вы часто хотите), чтобы проверить статус видео.

Поле в моей таблице videos processed. NULL для не обрабатываемых, 0, если он обрабатывается. В поле api сохраняется идентификатор видео YouTube в формате json.

Здесь мой cron script:

# 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 script, чтобы цикл 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')

Вам нужно убедиться, что script можно запустить из командной строки и принять аргументы для получения идентификатора видео из исходной загрузки script. http://php.net/manual/en/function.getopt.php

Лично мне не нравится идея запуска дополнительных скриптов с такими циклами, поскольку вы можете закончить процесс румян, если вы не проверите все свои случаи с краями, но без заданий cron ваши варианты ограничены.