2013-06-03 10 views
8

Im OK autorizzato.Caricamento di un video su youtube dal browser

Ho 2 pulsante di come questo sulla mia pagina:

<input type="file" id="fileToSend"/> 
<input type="button" onclick="upload()" value="Upload" id="btnSend"/> 

voglio caricare il file selezionato a YouTube quando clicco sul pulsante "Upload". Im chiamando una funzione come questa:

function upload() { 
    var fileStream; 
    var video = document.getElementById("fileToSend"); 
    var file = video.files[0]; 
    console.log(file); 
    console.log("Nombre: " + file.name); 
    var r = new FileReader(); 
    r.onload = function() { 
     console.log("fileStream creado"); 
     fileStream = r.result; 
     //console.log("FileStream: " + fileStream); 
    }; 

    console.log("Creando fileStream.."); 
    r.readAsBinaryString(file); 


    gapi.client.load('youtube', 'v3', 
     function() { 
      var request = gapi.client.youtube.videos.insert({ 
       part: 'snippet, status', 
       resource: { 
        snippet: { 
         title: 'Video Test Title 5', 
         description: 'Video Test Description', 
         tags: ['Tag 1', 'Tag 2'], 
         categoryId: "22" 
        }, 
        status: { 
         privacyStatus: "private" 
        } 
       } 
      }, fileStream); 
      request.execute(function (response) { 
       console.log("executing.."); 
       var result = response.result; 
       console.log(response); 
       if (result) { 
        console.log("execute completed"); 
        document.write(result); 
       } 
      }); 
     }); 
} 

Il problema è che ottengo l'errore al sull'oggetto risposta, "mediaBodyRequired", E 'come se io non mando correttamente il FileStream.

+1

Hai trovato il problema? Se è così, condividi il tuo codice completo perché è esattamente quello che sto cercando di fare. – offset

+0

Ricevo errore: "Uncaught ReferenceError: gapi non è definito." perché? – offset

+0

Ho finito per utilizzare l'API v2. Se trovo una soluzione usando v3, la pubblicherò. –

risposta

3

C'è un motivo per cui non è possibile utilizzare il widget di caricamento di YouTube?
https://developers.google.com/youtube/youtube_upload_widget

In ogni modo, direttamente dal riferimento API
https://developers.google.com/youtube/v3/docs/videos/insert

badRequest mediaBodyRequired The request does not include the video content. 

Un'altra risorsa:
https://developers.google.com/api-client-library/javascript/samples/samples

+0

Kat, grazie per la tua risposta. So che l'errore è dovuto al fatto che la richiesta non include il contenuto del video, ma la ragione è che l'API non specifica come effettuare chiamate API di insert usando javascipt. Un esempio risolverebbe tutti i miei problemi. –

+0

Bene, ecco un esempio di come ottenere una playlist ... guardarla potrebbe aiutarti ... http://stackoverflow.com/a/12939702/996364 Sto cercando un esempio di "inserimento" ma tutto quello che ho trovato finora è un esempio java nel secondo link nella mia risposta e un esempio python https://developers.google.com/youtube/v3/guides/uploading_a_video che utilizza oauth –

+0

Sì..Io ho ispirato il mio codice su quegli esempi ma ancora senza fortuna ... Grazie per il tuo aiuto. –

1

Ci sono due opzioni per l'utilizzo inserto v3. La richiesta deve o:

  1. avere il file multimediale come corpo che preclude l'invio di altri parametri POST o
  2. uso modulo multistrato codifica in due parti. Una parte è il file da caricare e l'altra parte è un blob JSON simile a un file che include tutti i parametri che si desidera inviare.

Non ho mai fatto ottenere questo lavoro utilizzando il client ufficiale di JavaScript, ma scritto in una spiegazione piuttosto dettagliata di come questo può funzionare utilizzando XmlHttpRequest regolare: http://lithostech.com/2013/10/upload-google-youtube-api-v3-cors/

Ecco un esempio del primo metodo in cui il file stesso è l'intero corpo della richiesta:

// where videoFile is a http://www.w3.org/TR/FileAPI/#dfn-file 
var invocation = new XMLHttpRequest(); 
invocation.setRequestHeader('Authorization', 'Bearer ' + token); 
invocation.open('POST', "https://www.googleapis.com/upload/youtube/v3/videos?part=snippet", true); 
invocation.send(videoFile); 
+0

Stephen, il tuo post sul blog è ottimo, ma non lo fa mostra la richiesta http finale ("Il risultato è un upload riuscito e la richiesta sembra molto simile a quella generata dalla gemma ruby.") ... :( – l33t