From: Ben Beltran Date: Sat, 6 Oct 2012 03:30:19 +0000 (-0500) Subject: Basic Version Working X-Git-Url: https://git.r.bdr.sh/rbdr/lyricli.rb/commitdiff_plain/d3e32008ba762c8c00bfd99453e794ba68f40464?hp=--cc Basic Version Working Working properly enough to retrieve lyrics when used with the arguments method. Still, there's no practical way to use it for now, so it doesn't really matter. --- d3e32008ba762c8c00bfd99453e794ba68f40464 diff --git a/Gemfile b/Gemfile index 4c91c06..997d654 100644 --- a/Gemfile +++ b/Gemfile @@ -4,3 +4,5 @@ gem 'nokogiri', "~> 1.5.5" gem 'multi_json', "~> 1.3.6" gem 'rdio', "~> 0.1.0" gem "launchy", "~> 2.1.2" + +gem 'ruby-debug19', "~> 0.11.6" diff --git a/Gemfile.lock b/Gemfile.lock index a15cfa4..ea915f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,15 +2,29 @@ GEM remote: http://rubygems.org/ specs: addressable (2.3.2) + archive-tar-minitar (0.5.2) + columnize (0.3.6) json (1.7.5) launchy (2.1.2) addressable (~> 2.3) + linecache19 (0.5.12) + ruby_core_source (>= 0.1.4) multi_json (1.3.6) nokogiri (1.5.5) oauth (0.4.7) rdio (0.1.0) json oauth (>= 0.3.0) + ruby-debug-base19 (0.11.25) + columnize (>= 0.3.1) + linecache19 (>= 0.5.11) + ruby_core_source (>= 0.1.4) + ruby-debug19 (0.11.6) + columnize (>= 0.3.1) + linecache19 (>= 0.5.11) + ruby-debug-base19 (>= 0.11.19) + ruby_core_source (0.1.5) + archive-tar-minitar (>= 0.5.2) PLATFORMS ruby @@ -20,3 +34,4 @@ DEPENDENCIES multi_json (~> 1.3.6) nokogiri (~> 1.5.5) rdio (~> 0.1.0) + ruby-debug19 (~> 0.11.6) diff --git a/lib/lyricli.rb b/lib/lyricli.rb index 928adad..32215d3 100755 --- a/lib/lyricli.rb +++ b/lib/lyricli.rb @@ -13,95 +13,54 @@ $VERBOSE = nil require 'rdio' $VERBOSE = original_verbosity -class Lyricli +# Add current path to include path +$:.unshift File.expand_path(File.dirname(__FILE__)) + +# Local Dependencies +require "lyricli/util" +require "lyricli/configuration" +require "lyricli/lyrics_engine" +require "lyricli/source_manager" +require "lyricli/sources/arguments" +require "lyricli/sources/rdio" +require "lyricli/sources/itunes" + +module Lyricli + def self.execute + @lyricli = Lyricli.new + @lyricli.get_lyrics + end - # TODO: Change the whole fucking thing - def initialize - @rdio_key = "sddac5t8akqrzh5b6kg53jfm" - @rdio_secret = "PRcB8TggFr" - @token_path = File.expand_path("~/.rdio_token") + class Lyricli - #Expand the symlink and get the path - if File.symlink?(__FILE__) then - path = File.dirname(File.readlink(__FILE__)) - else - path = File.dirname(__FILE__) + def initialize + @source_manager = SourceManager.new 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] + def exit_with_error + abort "Usage: #{$0} artist song" end - end - def init_rdio + def get_lyrics + set_current_track + check_params + + engine = LyricsEngine.new(@current_track[:artist], @current_track[:song]) - if File.exists?(@token_path) - f = File.new(@token_path, "r") begin - token = MultiJson.decode(f.read) - rescue - token = create_rdio_token + engine.get_lyrics + rescue LyricsNotFoundException + "Lyrics not found :(" end - else - token = create_rdio_token - end - - Rdio::SimpleRdio.new([@rdio_key, @rdio_secret], 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 + def set_current_track + @current_track = @source_manager.current_track end - #Maintain new lines - node.search("br").each do |br| - br.replace "\n" + def check_params + self.exit_with_error if @current_track[:artist].nil? or @current_track[:artist].empty? + self.exit_with_error if @current_track[:song].nil? or @current_track[:song].empty? 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 diff --git a/lib/lyricli/config.rb b/lib/lyricli/config.rb deleted file mode 100644 index da999ec..0000000 --- a/lib/lyricli/config.rb +++ /dev/null @@ -1,47 +0,0 @@ -module Lyricli - class Config - - def initialize - @config_path = "~/.lyricli.conf" - @config = load_config - end - - @@instance = Config.new - - def self.instance - @@instance - end - - def [](key) - @config[key] - end - - def []=(key, value) - @config[key] = value - save_config - end - - private_class_method :new - - private - - # TODO: Apart from this, load a default yml that will be used for this. - # And just extend everything from the user's config. - def load_config - path = File.expand_path(@config_path) - if File.exists?(path) - file = File.new(path, "r") - MultiJson.decode(file.read) - else - {} - end - end - - def save_config - path = File.expand_path(@config_path) - file = File.new(path, "w") - file.print(MultiJson.encode(@config)) - file.close - end - end -end diff --git a/lib/lyricli/sources/arguments.rb b/lib/lyricli/sources/arguments.rb index e69de29..82a8157 100644 --- a/lib/lyricli/sources/arguments.rb +++ b/lib/lyricli/sources/arguments.rb @@ -0,0 +1,37 @@ +module Lyricli + module Sources + class Arguments + + class << self + attr_accessor :name + end + + @name = "arguments" + + # The enable method should run all of the tasks needed to validate + # the source. In the case of Rdio it has to authenticate with OAuth. + def self.enable + # Nothing to do. + end + + # Instantiates everything it needs to run. + def initialize + # Nothing to do. + end + + # The current_track method should return the name of the current + # artist and song. + # @return [Hash] A hash containing the current `:song` and `:artist`. + def current_track + artist = ARGV[0] + song = ARGV[1] + {artist: artist, song: song} + end + + # The reset method resets any configurations it may have + def self.reset + # Reset Code + end + end + end +end diff --git a/lib/lyricli/sources/rdio.rb b/lib/lyricli/sources/rdio.rb index afb736d..83548b2 100644 --- a/lib/lyricli/sources/rdio.rb +++ b/lib/lyricli/sources/rdio.rb @@ -1,35 +1,38 @@ module Lyricli module Sources - module Rdio + class Rdio - # Returns the name of the source, in snake_case - def self.name - "rdio" + class << self + attr_accessor :name end + @name = "rdio" + # The enable method should run all of the tasks needed to validate # the source. In the case of Rdio it has to authenticate with OAuth. def self.enable # Validation Code - @config = Lyricli::Config - unless @config[:rdio_auth_token] && !@config[:rdio_auth_token].empty? + @config = Lyricli::Configuration.instance + unless @config["rdio_auth_token"] && !@config["rdio_auth_token"].empty? create_auth_token end end # Instantiates everything it needs to run. - def self.start - @rdio = Rdio::SimpleRdio.new([@config[:rdio_key], @config[:rdio_secret]], @config[:rdio_auth_token]) + def initialize + @name = 'rdio' + @config = Lyricli::Configuration.instance + @rdio = Rdio::SimpleRdio.new([@config["rdio_key"], @config["rdio_secret"]], @config["rdio_auth_token"]) end # The current_track method should return the name of the current # artist and song. # @return [Hash] A hash containing the current `:song` and `:artist`. - def self.current_track - u = @rdio.call('currentUser', {'extras' => 'lastSongPlayed'}) - artist = u["result"]["lastSongPlayed"]["artist"] - song = u["result"]["lastSongPlayed"]["name"] + def current_track + response = @rdio.call('currentUser', {'extras' => 'lastSongPlayed'}) + artist = response["result"]["lastSongPlayed"]["artist"] + song = response["result"]["lastSongPlayed"]["name"] {artist: artist, song: song} end @@ -38,12 +41,10 @@ module Lyricli # Reset Code end - private - # Signs in to rdio with our credentials and requests access for a new auth # token. - def create_auth_token - rdio = Rdio::SimpleRdio.new([@config]) + def self.create_auth_token + @rdio = Rdio::SimpleRdio.new([@config["rdio_key"], @config["rdio_secret"]], @config["rdio_auth_token"]) # Request Authorization puts "Follow this URL to authorize lyricli:" @@ -56,7 +57,7 @@ module Lyricli auth_code = gets.chomp token = rdio.complete_authentication(auth_code) - @config[:rdio_auth_token] = token + @config["rdio_auth_token"] = token token end diff --git a/lib/lyricli/util.rb b/lib/lyricli/util.rb index 9ae9f6c..e7dcfc7 100644 --- a/lib/lyricli/util.rb +++ b/lib/lyricli/util.rb @@ -5,10 +5,16 @@ module Lyricli end def parse_class(class_name) - klass = Module.const_get(class_name) - return klass if klass.is_a?(Class) + begin + path = "Sources::#{class_name}" + return eval(path) rescue NameError - return nil + return nil + end + end + + def sanitize_param(p) + URI.encode_www_form_component(p.gsub(/ /, "+")).gsub("%2B", "+") end end end diff --git a/lib/source_manager.rb b/lib/source_manager.rb deleted file mode 100644 index 834326d..0000000 --- a/lib/source_manager.rb +++ /dev/null @@ -1,47 +0,0 @@ -module Lyricli - class SourceManager - - include Lyricli::Util - - def initialize - @enabled_sources = [] - @config = Lyricli::Config - end - - def enable(source_name) - if source_module = module_exists?(camelize(str)) - source_module.enable - @config[:enabled_sources] << klass.name - else - raise Lyricli::EnableSourceException - end - end - - def disable(source_name) - if source_module = module_exists?(camelize(str)) - @config[:enabled_sources].delete(klass.name) - else - raise Lyricli::DisableSourceException - end - end - - def reset(source_name) - if source_module = module_exists?(camelize(str)) - source_module.reset - disable(source_name) - else - raise Lyricli::ResetSourceException - end - end - - def start - @config[:enabled_sources].each do |source| - begin - source.start - rescue - fail "Source #{source.name} has failed to start. Please reset the source by running `#{$0} source reset #{source.name}.`" - end - end - end - end -end