7even / vkontakte_api

Ruby-адаптер для ВКонтакте API
http://7even.github.com/vkontakte_api
MIT License
282 stars 67 forks source link

Audiofile upload #66

Closed deepsystm closed 9 years ago

deepsystm commented 9 years ago

Доброго дня. Есть ли опыт загрузки аудиофайлов на сервер? Я делаю так:

vk = VkontakteApi::Client.new(Rails.application.secrets.vkontakte_token)
audio = '/var/www/flat.fm/1.mp3'
# получить адрес сервера для загрузки аудиофайла
audio_upload_url = vk.audio.get_upload_server.upload_url
# загрузить на сервер
upload_audio = VkontakteApi.upload(url: audio_upload_url, audio: [audio, MIME::Types.type_for(audio).first.content_type])

Вывод:

POST https://pu.vk.com/c613726/upload.php?act=add_audio&aid=0&api=1&gid=0&hash=0831f52f49516064cc4ce9b98fbc935d&mid=62703936&rhash=1b644f4030f359093033f2dca1efab04
body: #<Faraday::CompositeReadIO:0x000000054513c0 @parts=[#<Parts::FilePart:0x00000005451de8 @head="-------------RubyMultipartPost\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"1.mp3\"\r\nContent-Length: 4931272\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n\r\n", @foot="\r\n", @length=4931472, @io=#<CompositeReadIO:0x00000005451640 @ios=[#<StringIO:0x00000005451730>, #<UploadIO:0x00000005433a78 @content_type="application/octet-stream", @original_filename="1.mp3", @local_path="/var/www/flat.fm/1.mp3", @io=#<File:/var/www/flat.fm/1.mp3>, @opts={}>, #<StringIO:0x00000005451690>], @index=0>>, #<Parts::EpiloguePart:0x00000005451500 @part="-------------RubyMultipartPost--\r\n\r\n", @io=#<StringIO:0x00000005451460>>], @ios=[#<CompositeReadIO:0x00000005451640 @ios=[#<StringIO:0x00000005451730>, #<UploadIO:0x00000005433a78 @content_type="application/octet-stream", @original_filename="1.mp3", @local_path="/var/www/flat.fm/1.mp3", @io=#<File:/var/www/flat.fm/1.mp3>, @opts={}>, #<StringIO:0x00000005451690>], @index=0>, #<StringIO:0x00000005451460>], @index=0>

Ответ:

#<Hashie::Mash audio="%7B%22error%22%3A-2%7D" hash="e1b4451767363d0599fdc913df64c274" redirect="http://vk.com/audio.php?act=done_add&mid=62703936&aid=0&gid=0&server=613726&audio=%7B%22error%22%3A-2%7D&hash=e1b4451767363d0599fdc913df64c274" server=613726>

Сохранение:

save_audio = vk.audio.save(
    server: upload_audio.server, audio: upload_audio.audio, 
    hash: upload_audio['hash'], artist: "1", title: '1'
)

Ответ:

POST https://api.vk.com/method/audio.save?access_token=d...8
body: "artist=1&audio=%257B%2522error%2522%253A-2%257D&hash=e1b4451767363d0599fdc913df64c274&server=613726&title=1"
{"error":{"error_code":301,"error_msg":"Invalid filename","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"audio.save"},{"key":"artist","value":"1"},{"key":"audio","value":"%7B%22error%22%3A-2%7D"},{"key":"hash","value":"e1b4451767363d0599fdc913df64c274"},{"key":"server","value":"613726"},{"key":"title","value":"1"}]}}
VkontakteApi::Error: VkontakteApi::Error

Ошибка имени файла, оно и понятно %7B%22error%22%3A-2%7D что так быть не должно. Но вот вопрос: в чём дело?

Пробовал с различными файлами, различных кодеков всевозможных (и lame в том числе), размером от 4 до 125 мегабайт. Причину не могу установть, помогите кто знает в чём проблема, спасибо.

stereodenis commented 9 years ago

@deepsystm а у вк нет ограничений по длине title? пробовали с такими же данными загружать непосредственно на vk.com?

deepsystm commented 9 years ago

@stereodenis да на ВК всё загружается без проблем ограничений нет, да и различные комбинации названия были испробованы

stereodenis commented 9 years ago

@deepsystm у вас перед сохранением уже ошибка audio="%7B%22error%22%3A-2%7D" error = -2

deepsystm commented 9 years ago

@stereodenis я конечно заметил её -2 -- приложение выключено "либо неправильный формат кодировки файла" -- это то что я вычитал в сети, мне кажется бред, так как файл один и тот же, но в ВК грузится, через приложение нет. default

deepsystm commented 9 years ago

Всё, разобрался ошибка была здесь

# загрузить на сервер
upload_audio = VkontakteApi.upload(url: audio_upload_url, audio: [audio, MIME::Types.type_for(audio).first.content_type])

необходимо передавать поле file а не audio:

upload_audio = VkontakteApi.upload(url: audio_upload_url, file: [audio, MIME::Types.type_for(audio).first.content_type])
stereodenis commented 9 years ago

@deepsystm :+1: