Как загрузить видео на 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="\r\n--END_OF_PART_30909--">] @current_part=0 @boundary="END_OF_PART_30909"> @headers={"Slug"=>"sample_upload.mp4"  «Пользователь-агент» => "Googledatarubyutil-anonymousapp" "gdata-version" => "2" x-gdata-ключ "=>" ключ = ai39si7jkhs_ecjf4unoqz8vywkvbsw4s8ojpm8wywkvbsw4s8ojd5p5vkpvurhbnh-hiyjtokwqqsfot7kockece32rnczqmxa "" «Content-Type» => «Мультипартатование / связано»;  border=\"END_OF_PART_30909\"" "MIME-версия"=>"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>

Все еще не работает, мне придется проверить это с этими изменениями.


person Lance Pollard    schedule 07.11.2009    source источник


Ответы (3)


Не уверен, что вы когда-либо исправляли это, но я считаю, что параметр mime_type в post_file должен быть установлен на mime_type video — в вашем примере кода он установлен на «multipart/related».

person Ben Scofield    schedule 23.03.2010
comment
не удосужился заставить его работать, надеюсь, это исправит это! Благодарность! - person Lance Pollard; 24.03.2010

Прошу прощения за просто ссылку, но я думаю, что это может помочь linky

person Chuck Vose    schedule 11.11.2009
comment
Я видел это, спасибо. Я чувствую, что библиотека ruby ​​gdata уже каким-то образом справляется с этим... До сих пор не понял. - person Lance Pollard; 12.11.2009

У меня была такая же проблема с gdata gem.

Это исправило это для меня.

C:\Ruby\lib\ruby\gems\1.8\gems\gdata-1.1.1\lib\gdata\http

В «классе MimeBody» замените «wrap_entry» этим кодом, чтобы исправить это.

"def wrap_entry(entry, file_mime_type) wrap_entry = "--#{@boundary}\r\n" wrap_entry += "Content-Type: application/atom+xml; charset=UTF-8\r\n\r\n" wrapper_entry += entry wrapper_entry += "\r\n--#{@boundary}\r\n" wrapper_entry += "Content-Type: #{file_mime_type} \r\n" wrapped_entry += "Content-Transfer-Encoding: binary\r\n\r\n"
return MimeBodyString.new(wrapped_entry) end"

person Anders B    schedule 10.12.2009
comment
Мой код выглядит так, если это поможет @yt = GData::Client::YouTube.new @yt.clientlogin(имя, пароль) @yt.developer_key = myKey url = 'uploads.gdata.youtube.com/feeds/api/users/default/uploads' mime_type = video/mp4 file_path = ответ test.mp4 = @yt.post_file(url, file_path, mime_type, метаданные).to_xml - person Anders B; 19.01.2010