Skip to content

Instantly share code, notes, and snippets.

@markiz
Created August 10, 2011 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markiz/1138407 to your computer and use it in GitHub Desktop.
Save markiz/1138407 to your computer and use it in GitHub Desktop.
Simple last.fm ripper
#!/usr/bin/env ruby
#
# Usage:
# ./lastfm_rip.rb "http://www.last.fm/music/Various+Artists/Razor%2B1911%2BChipdisk%2B%25233" "Razor Chipdisk #3"
# Requires: em-http-request, mechanize
require 'rubygems'
require 'mechanize'
require 'fileutils'
require 'em-http-request'
require 'cgi'
url = ARGV[0]
output_dir = ARGV[1]
if !url || !output_dir
puts "At least two arguments required, lastfm page URL and output directory"
exit
end
FileUtils.mkdir_p(output_dir)
em_thread = Thread.new { EventMachine.run }
em_thread.abort_on_exception = true
agent = Mechanize.new
page = agent.get(url)
multi_request = EM::MultiRequest.new
filenames = {}
page.links.each do |link|
if link.text =~ /free download/i
filename = CGI.unescape(CGI.unescape(File.basename(link.href))) # I have no slightest idea why they encode the filenames twice
request = EM::HttpRequest.new(link.href).get
filenames[request] = filename
multi_request.add(request)
end
end
multi_request.callback do
responses = multi_request.responses
if responses[:succeeded].size > 0
puts "Succeded:"
responses[:succeeded].each do |req|
filename = filenames[req]
puts "\t#{filename}"
File.open(File.join(output_dir, filename), "w+") {|f| f.write(req.response) }
end
end
if responses[:failed].size > 0
puts "Failed: "
responses[:failed].each do |req|
puts "\t#{filenames[req]}"
end
end
EM.stop do
exit
end
end
em_thread.join
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment