2012-11-21 10 views
18

Sto provando a utilizzare Curl per caricare in gruppo su YouTube, seguendo la specifica API here; in breve, richiede una richiesta POST multipart con metadati in formato XML e Content-Type di application/atom+xml; charset=UTF-8, seguito dai dati del video stesso.arricciatura: Per-file Content-Type per POST multiplo (YouTube API)

La mia linea di comando corrente (recupero i metadati dal upl.xml e il video da upl.mkv) simile a questa:

curl -s -F "[email protected]" -F "[email protected]" -H 'GData-Version: 2' -H 'Authorization: GoogleLogin auth=<AUTH>' -H 'Slug: upl.mkv' -H 'X-GData-Key: key=<KEY>' http://uploads.gdata.youtube.com/feeds/api/users/default/uploads 

Quando controllo la richiesta effettiva che viene inviato con --trace, sembra come se entrambi i file fossero inviati nell'ordine corretto, ma il Content-Type dei metadati è impostato su application/octet-stream; l'upload è completato come previsto, ma YouTube si rifiuta di elaborare il video.

Se provo a presentare upl.xml con --data, --data-ascii, --form-string ecc ottengo solo un assortimento di altri errori, che mi porta a credere che sia giù alla non corretta Content-Type. Se ignoro i metadati e semplicemente mando il file video, funziona bene, ma sfortunatamente questo non risolve il mio problema.

Mi manca qualcosa qui, e se non è possibile farlo senza scomporre libcurl?

risposta

26

Innanzitutto, è possibile specificare il tipo di contenuto per una parte caricata aggiungendo "; type = magic/string". Come per esempio nel vostro caso il video:

ricciolo -F "[email protected]; type = video/MPEG4" [URL]

(uso --trace o --trace- ascii per verificare che il curl invii esattamente quello che vuoi)

... ma ciò detto, suppongo che sia altamente improbabile che il server ricevente si preoccupi realmente di ciò che il client sostiene sia il tipo di contenuto. Significato Penso che la fonte del tuo problema non sia in realtà il tipo di contenuto.