2012-11-07 19 views
9

vorrei caricare un video utilizzando l'API v3 Youtube con l'arricciatura in PHP, come descritto di seguito: https://developers.google.com/youtube/v3/docs/videos/insertCarica video su Youtube utilizzando curl e API v3

ho questa funzione

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; 
} 

Ma restituisce questo

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 
     ) 

) 

Il file è un MP4.

Chiunque può aiutare?

risposta

0

Sfortunatamente, non abbiamo un esempio specifico di YouTube caricati API v3 da PHP ancora disponibile, ma il mio consiglio generale è:

  • Utilizzare il PHP client library invece di cURL.
  • Base il codice su this example scritto per l'API di Drive. Poiché l'API di YouTube v3 condivide un'infrastruttura API comune con altre API di Google, gli esempi per fare cose come caricare file dovrebbero essere molto simili tra diversi servizi.
  • Dai uno sguardo allo Python example per i metadati specifici che devono essere impostati in un caricamento di YouTube v3.

In generale, ci sono un sacco di cose non corrette con il codice curl, e non posso camminare attraverso tutti i passaggi che ci vuole per risolvere il problema, in quanto credo che utilizza la libreria client PHP è un molto meglio opzione. Se sei convinto di voler utilizzare cURL, ti rimanderò a qualcun altro per fornire una guida specifica.

+0

Grazie! Il mio tentativo è stato quello di fare qualcosa di più leggero, ma proverò la libreria ufficiale di Google – genna

+0

Nel Google_YoutubeService.php non riesco a trovare una funzione per chiamare il metodo di inserimento di cui ho bisogno. Tutti i metodi sono per l'elenco (canali, playlist, video ..) Devo aspettare una versione più recente della libreria? – genna

+0

Ho deciso di utilizzare Zend_Gdata_YouTube e la seconda versione dell'API, a causa della mancanza dei metodi necessari per – genna

16

Versione aggiornata: ora con l'URL di caricamento personalizzato e l'invio di metadati con la procedura di caricamento. L'intero processo richiede 2 richieste:

  1. ottenere un percorso di caricamento personalizzato

    primo luogo, fare una richiesta POST per un URL upload:

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

    dovrai inviare 2 intestazioni:

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

    È necessario inviare 3 parametri:

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

    e sarà necessario inviare i metadati per il video nel corpo della richiesta:

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

    Da questa richiesta si dovrebbe ottenere una risposta con un campo "location" nelle intestazioni.

  2. POST in posizione personalizzata per inviare file.

    Per il caricamento è necessario 1 intestazione:

    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" 
    

    e inviare il file come i dati/corpo.

Se andate a leggere attraverso come il loro cliente lavora vedrete si consiglia di ritentare, se si ritorna errori di codice 500, 502, 503 o 504. Chiaramente si desidera avere un periodo di attesa tra i tentativi e un numero massimo di tentativi. Funziona sempre nel mio sistema, anche se sto usando python & urllib2 invece di cURL.

Inoltre, a causa del percorso di caricamento personalizzato questa versione è in grado di ricaricarsi in upload, anche se devo ancora averne bisogno.

+1

I ha anche avuto problemi a impostare i parametri con la richiesta di caricamento POST, hai ancora usato 2 richieste per caricare e aggiornare i metadati? – hsafarya

+0

Non lo faccio più. Ho cambiato il mio metodo per questo in qualcosa di molto più stabile e modifico la mia risposta al nuovo metodo. –

+0

Qualche aggiornamento su questo nuovo metodo? – Mikepote

0

uno script 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': 'resumable'} 

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'] 
0

sono stato in grado di caricare un video sul mio canale su YouTube utilizzando il seguente script di shell.

#!/bin/sh 

# Upload the given video file to your YouTube channel. 

cid_base_url="apps.googleusercontent.com" 
client_id="<YOUR_CLIENT_ID>.$cid_base_url" 
client_secret="<YOUR_CLIENT_SECRET>" 
refresh_token="<YOUR_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=resumable&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" 

Fare riferimento alla this domanda simile per come ottenere i valori delle variabili personalizzati.

Problemi correlati