ElektroStudios
ElektroStudios

Reputation: 20464

Ruby - how to download a file if the url is a redirection?

Ruby how to download a file if the url is a redirection?

i'm trying to download this url:

soundcloud.com/stereo-f---/cohete-amigo/download

the redirection is this:

[ec-media.soundcloud.com/HNIGsuMJlDhy?ff61182e3c2ecefa438cd0210ad0e38569b9775ddc9e06b3c362a686319250ea5c1ae2d33d8d525807641f258e33de3cb0e559c1b591b5b00fb32d5ef9&AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1352919869&Signature=OVWD9VdV7ew%2B%2Fs%2BO0YpkKZLGOCw%3D][2]

and what i've tried is this:

Net::HTTP.start("ec-media.soundcloud.com") { |http|
  resp = http.get("/HNIGsuMJlDhy?ff61182e3c2ecefa438cd0210ad0e38569b9775ddc9e06b3c362a686319250ea5c1ae2d33d8d525807641f258e33de3cb0e559c1b591b5b00fb32d5ef9&AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1352919869&Signature=OVWD9VdV7ew%2B%2Fs%2BO0YpkKZLGOCw%3D")
  open("test.wav", "wb") { |file|
    file.write(resp.body)
  }
}
puts "Done."
sleep 50

i don't understand/know ANY of internet protocols and redirections and that things... please can give me a good explanation or help with my script to download files from soundcloud with ruby?

thankyou

UPDATE:

I've tried this way but i get an error:

Net::HTTP.start("soundcloud.com") do |http|
  resp = http.get("/dubstep-4/kill-paris-tender-love/download")

  while resp.code == '301' || resp.code == '302'
    # moved permanently or temporarily:  try again at the new location.
    resp = http.get(URI.parse(resp.header['location']))
    # ideally you should also bail if you make too many redirects.
  end

  # make sure the request was successful.
  if resp.code == '200'  
    open("test.wav", "wb"){ |file| file.write(resp.body) }
  else
    puts "Error: HTTP #{resp.code}"
  end
end

Error:

C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:1860:in `initialize': undefined method `empty?' for #<URI::HTTP:0x25a9ce8> (NoMethodError)
        from C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:2093:in `initialize'
        from C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:1026:in `new'
        from C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:1026:in `get'
        from C:/Users/Administrador/Desktop/1.rb:59:in `block in <main>'
        from C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:745:in `start'
        from C:/Program Files (x86)/Ruby/lib/ruby/1.9.1/net/http.rb:557:in `start'
        from C:/Users/Administrador/Desktop/1.rb:48:in `<main>'

Upvotes: 3

Views: 4021

Answers (3)

Simon Perepelitsa
Simon Perepelitsa

Reputation: 20639

There is a standard library called Open URI that is higher level than Net HTTP. It follows redirects automatically:

require 'open-uri'
file = open("http://soundcloud.com/stereo-f---/cohete-amigo/download")

Upvotes: 5

John Ledbetter
John Ledbetter

Reputation: 14173

What you need to do is look at resp.code and handle the redirect:

Net::HTTP.start("your.web.site") do |http|
  resp = http.get("/something")
  while resp.code == '301' || resp.code == '302'
    # moved permanently or temporarily:  try again at the new location.
    resp = http.get(URI.parse(resp.header['location']))
    # ideally you should also bail if you make too many redirects.
  end

  # make sure the request was successful.
  if resp.code == '200'  
    open("test.wav", "wb"){ |file| file.write(resp.body) }
  else
    puts "Error: HTTP #{resp.code}"
  end
end

Upvotes: 2

mjbraun
mjbraun

Reputation: 117

I'd suggest you see this guide here but the gist is you have to check the type of the response and then extract the URL from the body in the case of a redirection.

Now, SoundCloud probably has zaniness going on in the background with cookies and temporary URLs and such, but that's another problem to deal with.

Upvotes: 1

Related Questions