Suba videos en Youtube usando curl y api v3

Cargaría un video usando la API v3 de Youtube con curl en PHP, como se describe aquí: https://developers.google.com/youtube/v3/docs/videos/insert

Tengo esta función

function uploadVideo($file, $title, $description, $tags, $categoryId, $privacy) { $token = getToken(); // Tested function to retrieve the correct AuthToken $video->snippet['title'] = $title; $video->snippet['description'] = $description; $video->snippet['categoryId'] = $categoryId; $video->snippet['tags'] = $tags; // array $video->snippet['privacyStatus'] = $privacy; $res = json_encode($video); $parms = array( 'part' => 'snippet', 'file' => '@'.$_SERVER['DOCUMENT_ROOT'].'/complete/path/to/'.$file 'video' => $res ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/youtube/v3/videos'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $parms); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$token['access_token'])); $return = json_decode(curl_exec($ch)); curl_close($ch); return $return; } 

Pero devuelve esto

 stdClass Object ( [error] => stdClass Object ( [errors] => Array ( [0] => stdClass Object ( [domain] => global [reason] => badContent [message] => Unsupported content with type: application/octet-stream ) ) [code] => 400 [message] => Unsupported content with type: application/octet-stream ) ) 

El archivo es un MP4.

Cualquiera puede ayudar?

Lamentablemente, todavía no tenemos disponible un ejemplo específico de las cargas de YouTube API v3 desde PHP, pero mi consejo general es:

  • Use la biblioteca de cliente PHP en lugar de cURL.
  • Base su código en este ejemplo escrito para Drive API. Debido a que la API v3 de YouTube comparte una infraestructura API común con otras API de Google, los ejemplos para hacer cosas como subir archivos deberían ser muy similares en diferentes servicios.
  • Eche un vistazo al ejemplo de Python para los metadatos específicos que deben establecerse en una carga de YouTube v3.

En general, hay muchas cosas incorrectas con su código cURL, y no puedo seguir todos los pasos necesarios para solucionarlo, ya que creo que usar la biblioteca cliente de PHP es una opción mucho mejor. Si está convencido de que quiere usar cURL, le pediré a otra persona que me brinde orientación específica.

Versión actualizada: ahora con URL de carga personalizada y envío de metadatos con el proceso de carga. Todo el proceso requiere 2 solicitudes:

  1. Obtener una ubicación de carga personalizada

    En primer lugar, realice una solicitud POST para una URL de carga para:

     "https://www.googleapis.com/upload/youtube/v3/videos" 

    Deberás enviar 2 encabezados:

     "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" "Content-type": "application/json" 

    Debes enviar 3 parámetros:

     "uploadType": "resumble" "part": "snippet, status" "key": {YOUR_API_KEY} 

    Y deberá enviar los metadatos del video en el cuerpo de la solicitud:

      { "snippet": { "title": {VIDEO TITLE}, "description": {VIDEO DESCRIPTION}, "tags": [{TAGS LIST}], "categoryId": {YOUTUBE CATEGORY ID} }, "status": { "privacyStatus": {"public", "unlisted" OR "private"} } } 

    A partir de esta solicitud, debe obtener una respuesta con un campo de “ubicación” en los encabezados.

  2. POST a la ubicación personalizada para enviar el archivo.

    Para la carga, necesitas 1 encabezado:

     "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" 

    Y envíe el archivo como su datos / cuerpo.

Si lee cómo funciona su cliente, verá que recomiendan volver a intentar si se devuelven los errores del código 500, 502, 503 o 504. Claramente, querrá tener un período de espera entre rebashs y un número máximo de rebashs. Funciona en mi sistema todo el tiempo, aunque estoy usando python y urllib2 en lugar de cURL.

Además, debido a la ubicación de carga personalizada, esta versión se puede cargar de manera resumble, aunque todavía no la necesito.

una secuencia de comandos python:

 # categoryId is '1' for Film & Animation # to fetch all categories: https://www.googleapis.com/youtube/v3/videoCategories?part=snippet&regionCode={2 chars region code}&key={app key} meta = {'snippet': {'categoryId': '1', 'description': description, 'tags': ['any tag'], 'title': your_title}, 'status': {'privacyStatus': 'private' if private else 'public'}} param = {'key': {GOOGLE_API_KEY}, 'part': 'snippet,status', 'uploadType': 'resumble'} headers = {'Authorization': 'Bearer {}'.format(token), 'Content-type': 'application/json'} #get location url retries = 0 retries_count = 1 while retries <= retries_count: requset = requests.request('POST', 'https://www.googleapis.com/upload/youtube/v3/videos',headers=headers,params=param,data=json.dumps(meta)) if requset.status_code in [500,503]: retries += 1 break if requset.status_code != 200: #do something location = requset.headers['location'] file_data = open(file_name, 'rb').read() headers = {'Authorization': 'Bearer {}'.format(token)} #upload your video retries = 0 retries_count = 1 while retries <= retries_count: requset = requests.request('POST', location,headers=headers,data=file_data) if requset.status_code in [500,503]: retries += 1 break if requset.status_code != 200: #do something # get youtube id cont = json.loads(requset.content) youtube_id = cont['id'] 

Pude subir un video a mi canal en YouTube usando el siguiente script de shell.

 #!/bin/sh # Upload the given video file to your YouTube channel. cid_base_url="apps.googleusercontent.com" client_id=".$cid_base_url" client_secret="" refresh_token="" token_url="https://accounts.google.com/o/oauth2/token" api_base_url="https://www.googleapis.com/upload/youtube/v3" api_url="$api_base_url/videos?uploadType=resumble&part=snippet" access_token=$(curl -H "Content-Type: application/x-www-form-urlencoded" -d refresh_token="$refresh_token" -d client_id="$client_id" -d client_secret="$client_secret" -d grant_type="refresh_token" $token_url|awk -F '"' '/access/{print $4}') auth_header="Authorization: Bearer $access_token" upload_url=$(curl -I -X POST -H "$auth_header" "$api_url"|awk -F ' |\r' '/loc/{print $2}'); curl -v -X POST --data-binary "@$1" -H "$auth_header" "$upload_url" 

Consulte la pregunta similar sobre cómo obtener sus valores de variables personalizados.