#!/usr/bin/env ruby -w require 'rubygems' require 'uri' require 'net/http' require 'multi_json' require 'nokogiri' require 'open-uri' # This shit causes a lot of warnings. Quick Hack. original_verbosity = $VERBOSE $VERBOSE = nil require 'rdio' $VERBOSE = original_verbosity class Lyricli def initialize @artist = ARGV[0] @song = ARGV[1] @rdio_key = "sddac5t8akqrzh5b6kg53jfm" @rdio_secret = "PRcB8TggFr" @token_path = File.expand_path("~/.rdio_token") #Expand the symlink and get the path if File.symlink?(__FILE__) then path = File.dirname(File.readlink(__FILE__)) else path = File.dirname(__FILE__) end # Get the current rdio track @rdio = init_rdio rdio_track #Get the current iTunes track current = `osascript #{path}/current_song.scpt` if current and not current.empty? then current = current.split("<-SEP->") @artist ||= current[0] @song ||= current[1] end end def init_rdio if File.exists?(@token_path) f = File.new(@token_path, "r") begin token = MultiJson.decode(f.read) rescue token = create_rdio_token end else token = create_rdio_token end Rdio::SimpleRdio.new([@rdio_key, @rdio_secret], token) end def rdio_track u = @rdio.call('currentUser', {'extras' => "lastSongPlayed"}) @artist ||= u["result"]["lastSongPlayed"]["artist"] @song ||= u["result"]["lastSongPlayed"]["name"] end def create_rdio_token rdio = Rdio::SimpleRdio.new([@rdio_key, @rdio_secret]) puts "Go To This URL To Authorize App:" auth_url = rdio.begin_authentication('oob') puts auth_url `open #{auth_url}` print "Please type the authorization code: " auth_code = gets.chomp token = rdio.complete_authentication(auth_code) f = File.new(@token_path, "w") f.print(MultiJson.encode(token)) f.close token end def exit_with_error abort "Usage: #{$0} artist song" end def get_lyrics #Use the API to search uri = URI("http://lyrics.wikia.com/api.php?artist=#{self.sanitize_param @artist}&song=#{self.sanitize_param @song}&fmt=realjson") begin res = Net::HTTP.get(uri) res = MultiJson.decode(res) #Get the actual lyrics url doc = Nokogiri::HTML(open(res['url'])) node = doc.search(".lyricbox").first rescue abort "Lyrics not found :(" end #Remove the rtMatcher nodes node.search(".rtMatcher").each do |n| n.remove end #Maintain new lines node.search("br").each do |br| br.replace "\n" end #Retrieve the lyrics puts node.inner_text end def check_params self.exit_with_error if @artist.nil? or @artist.empty? self.exit_with_error if @song.nil? or @song.empty? end def sanitize_param(p) URI.encode_www_form_component(p.gsub(/ /, "+")).gsub("%2B", "+") end end lrc = Lyricli.new lrc.check_params lrc.get_lyrics