Subir video a Youtube usando Youtube API V3 y PHP

Estoy intentando subir un video a Youtube usando PHP. Estoy usando la API de Youtube v3 y estoy usando el último código fuente protegido de la biblioteca de Google API PHP Client.
Estoy usando el código de muestra dado en
https://code.google.com/p/google-api-php-client/ para realizar la autenticación. La autenticación funciona bien, pero cuando bash subir un video, obtengo una Google_ServiceException con el código de error 500 y un mensaje como nulo.

Eché un vistazo a la siguiente pregunta que hice antes: suba videos a youtube usando php client library v3 Pero la respuesta aceptada no describe cómo especificar los datos de archivos que se cargarán.
Encontré otra pregunta similar Cargar archivo con Youtube API v3 y PHP , donde en el comentario se menciona que categoryId es obligatorio, por lo tanto, traté de establecer la categoryId en el fragmento, pero todavía da la misma excepción.

También me referí al código de Python en el sitio de documentación ( https://developers.google.com/youtube/v3/docs/videos/insert ), pero no pude encontrar la función next_chunk en la biblioteca del cliente. Pero traté de poner un bucle (mencionado en el fragmento de código) para intentar obtener el código de error 500, pero en las 10 iteraciones recibo el mismo error.

Lo que sigue es el fragmento de código que estoy intentando:

 $youTubeService = new Google_YoutubeService($client); if ($client->getAccessToken()) { print "Successfully authenticated"; $snippet = new Google_VideoSnippet(); $snippet->setTitle = "My Demo title"; $snippet->setDescription = "My Demo descrition"; $snippet->setTags = array("tag1","tag2"); $snippet->setCategoryId(23); // this was added later after refering to another question on stackoverflow $status = new Google_VideoStatus(); $status->privacyStatus = "private"; $video = new Google_Video(); $video->setSnippet($snippet); $video->setStatus($status); $data = file_get_contents("video.mp4"); // This file is present in the same directory as the code $mediaUpload = new Google_MediaFileUpload("video/mp4",$data); $error = true; $i = 0; // I added this loop because on the sample python code on the documentation page // mentions we should retry if we get error codes 500,502,503,504 $retryErrorCodes = array(500, 502, 503, 504); while($i videos->insert("status,snippet", $video, array("data" => $data)); // tried the following as well, but even this returns error code 500, // $ret = $youTubeService->videos->insert("status,snippet", // $video, // array("mediaUpload" => $mediaUpload); $error = false; } catch(Google_ServiceException $e) { print "Caught Google service Exception ".$e->getCode() . " message is ".$e->getMessage(); if(!in_array($e->getCode(), $retryErrorCodes)){ break; } $i++; } } print "Return value is ".print_r($ret,true); // We're not done yet. Remember to update the cached access token. // Remember to replace $_SESSION with a real database or memcached. $_SESSION['token'] = $client->getAccessToken(); } else { https://stackoverflow.com/questions/14236502/upload-video-to-youtube-using-youtube-api-v3-and-php/$authUrl = $client->createAuthUrl(); print "Connect Me!"; } 

¿Es algo que estoy haciendo mal?

Pude hacer que la carga funcionara usando el siguiente código:

 if($client->getAccessToken()) { $snippet = new Google_VideoSnippet(); $snippet->setTitle("Test title"); $snippet->setDescription("Test descrition"); $snippet->setTags(array("tag1","tag2")); $snippet->setCategoryId("22"); $status = new Google_VideoStatus(); $status->privacyStatus = "private"; $video = new Google_Video(); $video->setSnippet($snippet); $video->setStatus($status); $error = true; $i = 0; try { $obj = $youTubeService->videos->insert("status,snippet", $video, array("data"=>file_get_contents("video.mp4"), "mimeType" => "video/mp4")); } catch(Google_ServiceException $e) { print "Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage(). " 
"; print "Stack trace is ".$e->getTraceAsString(); } }

Me doy cuenta de que esto es antiguo, pero esta es la respuesta a la documentación:

  // REPLACE this value with the path to the file you are uploading. $videoPath = "/path/to/file.mp4"; $snippet = new Google_Service_YouTube_VideoSnippet(); $snippet->setTitle("Test title"); $snippet->setDescription("Test description"); $snippet->setTags(array("tag1", "tag2")); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list $snippet->setCategoryId("22"); // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new Google_Service_YouTube_VideoStatus(); $status->privacyStatus = "public"; // 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 = 1 * 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 resumble uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($videoPath)); // 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); } fclose($handle); // If you want to make other calls after the file upload, set setDefer back to false $client->setDefer(false); 

También me doy cuenta de que esto es antiguo, pero cuando cloné la última versión de php-client de GitHub me encontré con problemas con Google_Service_YouTube_Videos_Resource::insert() -method.

Pasaría una matriz con "data" => file_get_contents($pathToVideo) y "mimeType" => "video/mp4" establecido como argumento para insert() -method, pero seguí obteniendo (400) BadRequest a cambio .

Depurando y leyendo el código de Google encontré en \Google\Service\Resource.php había una "uploadType" (en las líneas 179-180) contra una clave de matriz "uploadType" que iniciaría el objeto Google_Http_MediaFielUpload.

 $part = 'status,snippet'; $optParams = array( "data" => file_get_contents($filename), "uploadType" => "media", // This was needed in my case "mimeType" => "video/mp4", ); $response = $youtube->videos->insert($part, $video, $optParams); 

Si no recuerdo mal, con la versión 0.6 de PHP-api, el argumento uploadType no era necesario. Esto podría aplicarse solo para el estilo de carga directa y no para la carga reanudable que se muestra en la respuesta de cualquier día.

La respuesta sería usar Google_Http_MediaFileUpload a través de las bibliotecas del cliente de Google PHP .

Aquí está el código de muestra: https://github.com/youtube/api-samples/blob/master/php/resumble_upload.php