Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

Во-первых, вы можете указать тип содержимого для части, которую вы загружаете, добавив "; type = magic/string". Например, в вашем случае видео:

curl -F "[email protected]; type = video/mpeg4" [URL]

(используйте -trace или -trace-ascii, чтобы проверить, что curl отправляет именно то, что вы хотите)

... но это сказало, я бы предположил, что очень маловероятно, что принимающий сервер действительно заботится о том, что клиент утверждает, что это тип контента. Значение Я думаю, что источником вашей проблемы на самом деле не является тип контента вообще.