]> git.r.bdr.sh - rbdr/lyricli.rb/commitdiff
Initial Commit
authorBen Beltran <redacted>
Fri, 14 Sep 2012 17:32:37 +0000 (12:32 -0500)
committerBen Beltran <redacted>
Fri, 14 Sep 2012 17:32:37 +0000 (12:32 -0500)
current_song.scpt [new file with mode: 0644]
lrc.rb [new file with mode: 0755]

diff --git a/current_song.scpt b/current_song.scpt
new file mode 100644 (file)
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 (executable)
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