class Song

Attributes

metadata[R]
name[R]
resolved_url[R]
url[R]

Public Class Methods

new(url) click to toggle source
# File lib/soundcloud_downloader/song.rb, line 9
def initialize(url)
  raise ArgumentError, "Invalid url" if url !~ URI::regexp
  @url = URI.parse(URI.encode(url.strip))
  @name = url.split("/").last
  @resolved_url ||= resolve_url
  @metadata ||= get_metadata
  @stream_url ||= get_stream_url
end

Public Instance Methods

download(filename = nil) click to toggle source
# File lib/soundcloud_downloader/song.rb, line 18
def download (filename = nil)
      filename ||= @metadata['title'].gsub(/[^0-9A-z.\-]/, "_") + ".mp3"
  file = File.open(filename, 'wb')
  
  streamer = lambda do |chunk, remaining_bytes, total_bytes|
    file.write(chunk)
    remaining = ((remaining_bytes.to_f / total_bytes) * 100).to_i
    STDOUT.flush
    print "\rRemaining: #{remaining}%"
  end

  Excon.get(@stream_url, :response_block => streamer)
  file.close
  puts "\r\nSaved to #{File.realpath(filename)}!"
  Mp3Info.open(File.realpath(filename)) do |mp3|
    mp3.tag.title = @metadata["title"]
  end

end

Private Instance Methods

get_metadata() click to toggle source
# File lib/soundcloud_downloader/song.rb, line 54
def get_metadata
  response = Excon.get(@resolved_url,
  :query => {
    :client_id => $client_id
  })
  JSON.parse(response.body)
end
get_stream_url() click to toggle source
# File lib/soundcloud_downloader/song.rb, line 40
def get_stream_url
  response = Excon.get("https://api.sndcdn.com/i1/tracks/#{@metadata['id']}/streams", :query => { :client_id => $client_id })
  JSON.parse(response.body)["http_mp3_128_url"]
end
resolve_url() click to toggle source
# File lib/soundcloud_downloader/song.rb, line 45
def resolve_url
  response = Excon.get("http://api.soundcloud.com/resolve.json", 
  :query => {
    :url => @url,
    :client_id => $client_id
  })
  JSON.parse(response.body)["location"]
end