ruby ​​membaca file dari S3 dengan URI terbuka

Saya mengalami beberapa masalah saat membaca file dari S3. Saya ingin dapat memuat tag ID3 dari jarak jauh, tetapi menggunakan URI terbuka tidak berfungsi, ini memberi saya kesalahan berikut:

ruby-1.8.7-p302 > c=TagLib2::File.new(open(URI.parse("http://recordtemple.com.s3.amazonaws.com/music/745/original/The%20Stranger.mp3?1292096514")))
TypeError: can't convert Tempfile into String
    from (irb):8:in `initialize'
    from (irb):8:in `new'
    from (irb):8

Namun, jika saya mengunduh file yang sama dan meletakkannya di desktop saya (yaitu tidak memerlukan URI terbuka), itu berfungsi dengan baik.

c=TagLib2::File.new("/Users/momofwombie/Desktop/blah.mp3")

apakah ada hal lain yang harus saya lakukan untuk membaca file jarak jauh?

PEMBARUAN: Saya baru saja menemukan tautan ini, yang mungkin menjelaskan sedikit, tetapi pasti ada cara untuk melakukan ini...

Membaca data header dari file di server jarak jauh


person holden    schedule 12.12.2010    source sumber


Jawaban (4)


Mungkin ingin melihat AWS::S3, Perpustakaan Ruby untuk Layanan Penyimpanan Sederhana Amazon

Lakukan AWS::S3:S3Object.find untuk file tersebut dan kemudian gunakan about untuk mengambil metadata

Solusi ini mengasumsikan Anda memiliki kredensial AWS dan izin untuk mengakses bucket S3 yang berisi file yang dimaksud.

person Steve Wilhelm    schedule 12.12.2010
comment
itu akan berhasil, kecuali metadata saya tampaknya kosong. apakah Anda harus menyediakan metadata Anda sendiri dengan s3? ini akan sempurna karena saya tidak perlu mengunduhnya. terima kasih - person holden; 12.12.2010

TagLib2::File.new tidak mengambil pegangan file, itulah yang Anda teruskan saat Anda menggunakan open tanpa read.

Tambahkan read dan Anda akan mendapatkan isi URL-nya, tetapi TagLib2::File juga tidak tahu harus berbuat apa, sehingga Anda terpaksa membaca isi URL-nya, dan menyimpannya.

Saya juga memperhatikan Anda terlalu mempersulit penggunaan OpenURI. Anda tidak perlu menguraikan URL menggunakan URI sebelum meneruskannya ke open. Cukup berikan string URL.

require 'open-uri'

fname = File.basename($0) << '.' << $$.to_s
File.open(fname, 'wb') do |fo|
  fo.print open("http://recordtemple.com.s3.amazonaws.com/music/745/original/The%20Stranger.mp3?1292096514").read
end

c = TagLib2::File.new(fname)

# do more processing...

File.delete(fname)

Saya belum menginstal TagLib2 tetapi saya menjalankan sisa kode dan file mp3 diunduh ke disk saya dan dapat diputar. File.delete akan dibersihkan setelahnya, yang akan menempatkan Anda pada kondisi yang Anda inginkan.

person the Tin Man    schedule 13.12.2010

Solusi ini tidak akan berhasil lebih lama lagi. Penjepit Kertas> 3.0.0 telah menghapus to_file. Saya menggunakan S3 & Heroku. Yang akhirnya saya lakukan adalah menyalin file ke lokasi sementara dan menguraikannya dari sana. Ini kode saya:

dest = Tempfile.new(upload.spreadsheet_file_name)
dest.binmode
upload.spreadsheet.copy_to_local_file(:default_style, dest.path)
file_loc = dest.path 

...

CSV.foreach(file_loc, :headers => true, :skip_blanks => true) do |row|}
person kalwalkden    schedule 14.06.2012

Ini tampaknya berfungsi alih-alih URI terbuka:

Mp3Info.open(mp3.to_file.path) do |mp3info|
  puts mp3info.tag.artist
end

Penjepit Kertas memiliki metode to_file yang mengunduh file dari S3.

person holden    schedule 12.12.2010