2015-05-20 21 views
25

Witam Używam API Google PHP do przesyłania wideo w PHP. Śledziłem this tutorial, aby to zaimplementować i działa poprawnie. Ale jest problem, jeśli wideo jest już w moim kanale, to również zwraca szczegóły filmu i nie mogę znaleźć, że jest odrzucony dla duplikatu.Youtube PHP APi Check VIdeo jest duplikatem lub nie

Nie mogę więc stwierdzić, że jest to duplikat wideo, a jeśli jest duplikatem, to co jest głównym filmem. Oznacza szczegóły wideo głównego filmu, z którego jest porównywany jako duplikat.

Proszę mi pomóc, aby znaleźć to duplikat wideo, czy nie?

+0

Czy moje pytanie nie jest jasne? – Bik

+0

Hej, czy otrzymałeś jakieś rozwiązanie .......... – Learner

+0

@bik, chcesz sprawdzić duplikat wideo względem swojej bazy danych lub swojego kanału youtube? opracuj trochę więcej, aby zrozumieć, co jest Twoim przepływie pracy –

Odpowiedz

7

Jedyne rozwiązanie, jakie mogę wymyślić, aby sprawdzić stan wideo, to użyć pola w tabeli, aby oznaczyć wideo jako przetworzone lub nie. Następnie ustaw crona na uruchamianie co godzinę (lub jakkolwiek często chcesz), aby sprawdzić status wideo.

Pole w mojej tabeli videos to processed. NULL dla nie przetworzonych, 0 jeśli jest przetwarzane. Moje pole api przechowuje identyfikator wideo YouTube w formacie json.

Oto mój skrypt 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'); 
     } 
    } 
} 
+0

Dzięki za odpowiedź. Ale to nie działa .... to pokazuje błąd dla "listVideos" ... – Bik

+0

@ Bik Myślę, że powinienem wspomnieć, że używam metod otoki dla biblioteki YouTube w mojej własnej klasie YouTube. Zmieniłem moją odpowiedź, aby użyć oryginalnych metod. – Draven

+0

@Draven twoja odpowiedź nie działa dla mnie, ponieważ w moim przypadku nie mogę tego zrobić za pomocą crona .............. Pls help – Learner

5

Bez zdolności do prowadzenia crona, prawdopodobnie będziesz musiał sprawdzić, czy jest to duplikat następnym razem spróbować uzyskać dostęp do wideo.

Alternatywnie, po załadowaniu pliku, można uruchomić inny skrypt php, że pętla podczas sprawdzania stanu okresowo (śpiące na pewien czas przed podjęciem kolejnego żądania API do sprawdzenia.)

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') 

Musisz aby upewnić się, że skrypt można uruchomić z wiersza poleceń i można akceptować argumenty, aby uzyskać identyfikator wideo z oryginalnego skryptu przesyłania. http://php.net/manual/en/function.getopt.php

Osobiście nie podoba mi się pomysł uruchomienia dodatkowych skryptów z pętlami takimi jak ta, ponieważ możesz zakończyć procesami rouge, jeśli nie sprawdzasz wszystkich swoich skrzynek, ale bez zadań crona twoje opcje są ograniczone.

+1

@Web_Developer przez wszystko, proszę podać swoją lepszą odpowiedź, a nie niepoprawnie twierdząc, że dwie udzielone odpowiedzi nie rozumieją tego pytania. – jfadich

+0

Masz rację.Wreszcie otrzymujemy status "przetworzony". –