Как загрузить видео на YouTube с помощью Ruby
Я пытаюсь загрузить видео на YouTube с помощью гема GData (я видел гем youtube_g, но хотел бы, чтобы он работал с чистыми GData, если это возможно), но я продолжаю получать эту ошибку:
Ошибка запроса GData::Client::BadRequestError в "MyProject::Google::YouTube должна загрузить фактическое видео на YouTube (как только это произойдет, смоделируйте этот тест)" 400: В запросе на загрузку не найден файл.
Я использую этот код:
def metadata
data = <<-EOF
<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:yt="http://gdata.youtube.com/schemas/2007">
<media:group>
<media:title type="plain">Bad Wedding Toast</media:title>
<media:description type="plain">
I gave a bad toast at my friend's wedding.
</media:description>
<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>
<media:keywords>toast, wedding</media:keywords>
</media:group>
</entry>
EOF
end
@yt = GData::Client::YouTube.new
@yt.clientlogin("name", "pass")
@yt.developer_key = "myKey"
url = "http://uploads.gdata.youtube.com/feeds/api/users/name/uploads"
mime_type = "multipart/related"
file_path = "sample_upload.mp4"
@yt.post_file(url, file_path, mime_type, metadata)
Каков рекомендуемый / стандартный способ загрузки видео на YouTube с помощью ruby, каков ваш метод?
Обновить
После внесения изменений в wrapped_entry
полученная строка выглядит так:
--END_OF_PART_59003
Content-Type: application/atom+xml; charset=UTF-8
<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:yt="http://gdata.youtube.com/schemas/2007">
<media:group>
<media:title type="plain">Bad Wedding Toast</media:title>
<media:description type="plain">
I gave a bad toast at my friend's wedding.
</media:description>
<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>
<media:keywords>toast, wedding</media:keywords>
</media:group>
</entry>
--END_OF_PART_59003
Content-Type: multipart/related
Content-Transfer-Encoding: binary
... и проверка запроса и ответа выглядит следующим образом:
Запрос:
<GData::HTTP::Request:0x1b8bb44 @method=:post
@url="http://uploads.gdata.youtube.com/feeds/api/users/lancejpollard/uploads"
@body=#<GData::HTTP::MimeBody:0x1b8c738 @parts=[#<GData::HTTP::MimeBodyString:0x1b8c058
@bytes_read=0
@string="--END_OF_PART_30909\r\nContent-Type: application/atom+xml; charset=UTF-8\r\n\r\n
<?xml version=\"1.0\"?>\n<entry xmlns=\"http://www.w3.org/2005/Atom\"\n xmlns:media=\"http://search.yahoo.com/mrss/\"\n xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">\n <media:group>\n <media:title type=\"plain\">Bad Wedding Toast</media:title>\n <media:description type=\"plain\">\n I gave a bad toast at my friend's wedding.\n </media:description>\n <media:category scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">People</media:category>\n <media:keywords>toast
wedding</media:keywords>\n </media:group>\n</entry>
\n\r\n--END_OF_PART_30909\r\nContent-Type: multipart/related\r\nContent-Transfer-Encoding: binary\r\n\r\n">
#<File:/Users/Lance/Documents/Development/git/thing/spec/fixtures/sample_upload.mp4>
#<GData::HTTP::MimeBodyString:0x1b8c044 @bytes_read=0
@string = "\ г \ п -END_OF_PART_30909-">]
@ Current_part=0
@ Граница ="END_OF_PART_30909">
@headers={"Slug"=>"sample_upload.mp4"
"User-Agent"=>"GoogleDataRubyUtil-AnonymousApp"
"GData-Version"=>"2"
=> "X-GData-Key" "ключ =AI39si7jkhs_ECjF4unOQz8gpWGSKXgq0KJpm8wywkvBSw4s8oJd5p5vkpvURHBNh-hiYJtoKwQqSfot7KoCkeCE32rNcZqMxA"
"Content-Type"=>"multipart/related; border =\"END_OF_PART_30909\""
"MIME-Version"=>"1,0"}>
Отклик:
#<GData::HTTP::Response:0x1b897e0 @body="No file found in upload request."
@headers={"cache-control"=>"no-cache
no-store
must-revalidate"
"connection"=>"close"
"expires"=>"Fri
01 Jan 1990 00:00:00 GMT"
"content-type"=>"text/plain; charset=utf-8"
"date"=>"Fri
11 Dec 2009 02:10:25 GMT"
"server"=>"Upload Server Built on Nov 30 2009 13:21:18 (1259616078)"
"x-xss-protection"=>"0"
"content-length"=>"32"
"pragma"=>"no-cache"}
@status_code=400>
Все еще не работает, мне придется проверить это больше с этими изменениями.
3 ответа
Не уверен, что вы когда-нибудь исправили это, но я верю mime_type
парам в post_file
должен быть установлен на mime_type видео - в вашем примере кода он установлен на "multipart/related".
Я прошу прощения за просто ссылки, но я думаю, что это может помочь linky
У меня была такая же проблема с gdata gem.
Это исправило это для меня.
C: \ Рубин \ Lib \ рубин \ самоцветы \1.8\ самоцветов \ GData-1.1.1\ Lib \ GData \ HTTP
В "классе MimeBody" замените "wrap_entry" этим кодом, чтобы исправить это.
"def wrap_entry (entry, file_mime_type)
wrapped_entry = " -#{@border}\r\n"
wrapped_entry += " Тип содержимого: application/atom+xml;
charset=UTF-8\r\n\r\n"
wrapped_entry += запись wrapped_entry += "\r\n -#{@border}\r\n"
wrapped_entry += " Тип содержимого: #{file_mime_type}\r\n"
wrapped_entry += " Кодирование передачи содержимого: двоичный файл \ r \ n \ r \ n "
вернуть MimeBodyString.new(wrapped_entry)
end"