From: Ben Beltran Date: Fri, 14 Sep 2012 17:32:37 +0000 (-0500) Subject: Initial Commit X-Git-Url: https://git.r.bdr.sh/rbdr/lyricli.rb/commitdiff_plain/622c07bb9dcae7fe84e17a2f5cb2f4c6b07d4d5d?ds=inline Initial Commit --- 622c07bb9dcae7fe84e17a2f5cb2f4c6b07d4d5d diff --git a/current_song.scpt b/current_song.scpt new file mode 100644 index 0000000..2e3fc9a Binary files /dev/null and b/current_song.scpt differ diff --git a/lrc.rb b/lrc.rb new file mode 100755 index 0000000..496d73b --- /dev/null +++ b/lrc.rb @@ -0,0 +1,131 @@ +#!/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