Curl: Per-file Content-Type для многостраничного POST (API YouTube)
Я пытаюсь использовать curl для пакетной загрузки на YouTube, следуя спецификации API здесь; Короче говоря, для этого требуется многостраничный запрос POST с метаданными в формате XML и Content-Type application/atom+xml; charset=UTF-8
, за которыми следуют сами видеоданные.
Моя текущая командная строка (извлечение метаданных из upl.xml и видео из upl.mkv) выглядит примерно так:
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
Когда я проверяю фактический запрос, отправляемый с --trace
, похоже, что оба файла отправляются в правильном порядке, но для Content-Type метаданных установлено значение application/octet-stream
; загрузка завершена, как ожидалось, но YouTube отказывается обрабатывать видео.
Если я попытаюсь отправить upl.xml с --data
, --data-ascii
, --form-string
и т.д., я просто получаю множество других ошибок, что заставляет меня поверить в неправильный Content-Type. Если я игнорирую метаданные и просто отправляю видеофайл, он отлично работает, но, к сожалению, это не решает мою проблему.
Я что-то пропустил здесь, и если это невозможно сделать, не нарушая libcurl?
Ответы
Ответ 1
Во-первых, вы можете указать тип содержимого для части, которую вы загружаете, добавив "; type = magic/string". Например, в вашем случае видео:
curl -F "[email protected]; type = video/mpeg4" [URL]
(используйте -trace или -trace-ascii, чтобы проверить, что curl отправляет именно то, что вы хотите)
... но это сказало, я бы предположил, что очень маловероятно, что принимающий сервер действительно заботится о том, что клиент утверждает, что это тип контента. Значение Я думаю, что источником вашей проблемы на самом деле не является тип контента вообще.