2015-10-12 3 views
1

J'ai essayé d'utiliser la mise en œuvre de télécharger des vidéos à ma chaîne de here:fichier vidéo est bloqué à 0% en cours de téléchargement via l'API YouTube avec PHP

mais je suis coincé dans un point très précis: Après je reçois le message que ma vidéo est téléchargée, dans la page Gestionnaire de vidéos de mon compte YouTube. Je vois la vidéo, mais le message d'état ci-dessous est "0% téléchargé" et reste ainsi.

Aussi, je devais faire un changement au code à la ligne 22 à ceci:

$media = new Google_Http_MediaFileUpload(
$client, 
$insertRequest, 
'video/*', 
file_get_contents($videoPath), 
true, 
$chunkSizeBytes 
); 

Avant cela, avec le code d'origine, je reçu le message « Préparer le téléchargement. » (aussi resté comme ça).

Je suis conscient qu'il existe un problème similaire here. Après l'avoir lu, j'ai essayé de réduire le paramètre chunkSizeBytes et même de le définir comme nul (dans l'API, dans src/Google/Http/MediaFileUpload.php: 88, s'il n'y a pas de valeur, il en affecte un).

Voici mon code pour se connecter à l'API:

<?php 
header("Access-Control-Allow-Origin: *"); 
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE'); 
header('Access-Control-Allow-Headers: *'); 
session_start(); 
// Call set_include_path() as needed to point to your client library. 
require_once 'google_api_test/src/Google/Client.php'; 
require_once 'google_api_test/src/Google/Service/YouTube.php'; 

$OAUTH2_CLIENT_ID = 'my_client_id.apps.googleusercontent.com'; 
$OAUTH2_CLIENT_SECRET = 'my_client_secret'; 

$client = new Google_Client(); 
$client->setClientId($OAUTH2_CLIENT_ID); 
$client->setClientSecret($OAUTH2_CLIENT_SECRET); 
$client->setScopes('https://www.googleapis.com/auth/youtube'); 
//redirect to the same page 
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST']."/youtube-sink", 
    FILTER_SANITIZE_URL); 
$client->setRedirectUri($redirect); 

// Define an object that will be used to make all API requests. 
$youtube = new Google_Service_YouTube($client); 

if (isset($_GET['code'])) { 

    $client->authenticate($_GET['code']); 
    $_SESSION['token'] = $client->getAccessToken(); 
    //I commented this line because it kept posting the video twice 
    //header('Location: ' . $redirect); 

} 

if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
} 

// Check to ensure that the access token was successfully acquired. 
if ($client->getAccessToken()) { 
    try{ 
     // REPLACE this value with the path to the file you are uploading. 
     $videoPath = "videos" . DIRECTORY_SEPARATOR . $videoName; 

     // Create a snippet with title, description, tags and category ID 
     // Create an asset resource and set its snippet metadata and type. 
     // This example sets the video's title, description, keyword tags, and 
     // video category. 
     $snippet = new Google_Service_YouTube_VideoSnippet(); 
     $snippet->setTitle("Test for Investing.com"); 
     $snippet->setDescription("This is our new video"); 
     $snippet->setTags(array("Investing.com", "PHP", "oauth")); 

     // Numeric video category.  
     $snippet->setCategoryId("22"); //category - foreign 

     $status = new Google_Service_YouTube_VideoStatus(); 
     $status->privacyStatus = "public"; //public,private or unlisted 

     // Associate the snippet and status objects with a new video resource. 
     $video = new Google_Service_YouTube_Video(); 
     $video->setSnippet($snippet); 
     $video->setStatus($status); 

     // Specify the size of each chunk of data, in bytes. Set a higher value for 
     // reliable connection as fewer chunks lead to faster uploads. Set a lower 
     // value for better recovery on less reliable connections. 
     $chunkSizeBytes = 0.5 * 1024 * 1024; 

     // Setting the defer flag to true tells the client to return a request which can be called 
     // with ->execute(); instead of making the API call immediately. 
     $client->setDefer(true); 
     // Create a request for the API's videos.insert method to create and upload the video. 
     $insertRequest = $youtube->videos->insert("status,snippet", $video); 
     // Create a MediaFileUpload object for resumable uploads. 
     $media = new Google_Http_MediaFileUpload(
      $client, 
      $insertRequest, 
      'video/*', 
      file_get_contents($videoPath), 
      true, 
      $chunkSizeBytes 
     );  

     // Read the media file and upload it chunk by chunk. 
     $status = false; 
     $handle = fopen($videoPath, "rb"); 
     while (!$status && !feof($handle)) { 
      $chunk = fread($handle, $chunkSizeBytes); 
      $status = $media->nextChunk($chunk); 
     } 

     // If you want to make other calls after the file upload, set setDefer back to false 
     $client->setDefer(false); 

     $htmlBody = "<h1 class='alert alert-success text-center'>Video $videoName Uploaded</h3><ul>"; 
     //destroying the session to prevent users from reuploading the video if they refresh or go back 
     session_destroy(); 
     fclose($handle); 
    } catch (Google_ServiceException $e) { 
     $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } catch (Google_Exception $e) { 
     $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
    } 

    $_SESSION['token'] = $client->getAccessToken(); 
} else { 
    // If the user hasn't authorized the app, initiate the OAuth flow 

    $authUrl = $client->createAuthUrl(); 
    $htmlBody = <<<END 
    <div class="modal fade"> 
    <div class="modal-dialog"> 
    <div class="modal-content"> 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
     <h4 class="modal-title">Authorization Required</h4> 
     </div> 
     <div class="modal-body"> 
     <p>You need to login to Youtube in order to upload that video.</p> 
     </div> 
     <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     <a href="$authUrl" class="btn btn-primary">Proceed</a> 
     </div> 
    </div> 
    </div> 
</div> 

END; 
}  
?> 

<?=$htmlBody?> 
+0

Combien de temps avez-vous attendu après le téléchargement terminé avant Video Manager vérifié. Selon la taille de la vidéo, YouTube peut mettre un certain temps à traiter la vidéo mise en ligne. –

+0

J'ai attendu jusqu'à une heure et le texte n'a pas changé de 0% ou de préparer le téléchargement. Je fais des tests avec un fichier mp4 de 2 Mo –

+0

avez-vous déjà résolu ce problème? –

Répondre

0

J'ai trouvé ce qui était la question qui a causé des problèmes avec le téléchargement. La cause de l'erreur était dans la configuration du serveur. Je avais besoin de changer les éléments suivants:

Dans .htaccess doit être réglé

<IfModule mod_php5.c> 
php_value output_buffering Off 
</IfModule> 

Comme le montre le Google YouTube API upload example, le script envoie la vidéo en morceaux. Cela doit être fait au cours de l'exécution du script et non une fois le script terminé le traitement (sortie tampon = on)

More info on output buffering