]> git.r.bdr.sh - rbdr/lyricli.rb/blobdiff - lib/lyricli/source_manager.rb
Integrates iTunes source
[rbdr/lyricli.rb] / lib / lyricli / source_manager.rb
index 0e41ead5e6ad2b66638c91345b896124f6ac4c23..3befbd2ab0b6037bd29b457c318d7e51a40b25a6 100644 (file)
@@ -17,42 +17,90 @@ module Lyricli
     end
 
     def enable(source_name)
-      if klass = parse_class(camelize(source_name))
-        klass.enable
-        @config["enabled_sources"] << klass.name
-        @config["enabled_sources"].uniq!
+      if available_sources.include?(source_name)
+        if klass = parse_class(camelize(source_name))
+          klass.enable
+          @config["enabled_sources"] << klass.name
+          @config["enabled_sources"].uniq!
+          @config.save_config
+        else
+          raise EnableSourceException
+        end
       else
-        raise EnableSourceException
+        raise UnknownSource
       end
     end
 
     def disable(source_name)
-      if klass = parse_class(camelize(source_name))
-        @config["enabled_sources"].delete(klass.name)
+      if available_sources.include?(source_name)
+        if klass = parse_class(camelize(source_name))
+          @config["enabled_sources"].delete(klass.name)
+          @config.save_config
+        else
+          raise DisableSourceException
+        end
       else
-        raise DisableSourceException
+        raise UnknownSource
       end
     end
 
     def reset(source_name)
-      if klass = parse_class(camelize(source_name))
-        klass.reset
-        disable(source_name)
+      if available_sources.include?(source_name)
+        if klass = parse_class(camelize(source_name))
+          klass.reset
+          disable(source_name)
+        else
+          raise ResetSourceException
+        end
       else
-        raise ResetSourceException
+        raise UnknownSource
       end
     end
 
     def current_track
       track = nil
+      lock = false
       @enabled_sources.each do |source|
         begin
-          track ||= source.current_track
+          current_track = source.current_track
+
+          # This is a special thing for arguments. The thing is, they need to
+          # be inputted manually. So, if they are present they won't allow
+          # anyone else to give results. Makes sense, yet a bit hacky.
+          unless current_track[:artist].nil? || current_track[:artist].empty? || current_track[:song].nil? || current_track[:song].empty?
+            track = current_track unless lock
+            lock = true if source.class.name == "arguments"
+          end
         rescue
-          fail "Source #{source.name} has failed to start. Please reset the source by running `#{$0} source reset #{source.name}.`"
+          raise SourceConfigurationException
         end
       end
       track
     end
+
+    def available_sources(format = false)
+      path_root = File.expand_path(File.dirname(__FILE__))
+      sources = Dir[path_root+"/sources/*.rb"].map{ |s|
+        name = s.split("/").last.gsub(/\.rb/, "")
+
+        # Add a star to denote enabled sources
+        name
+      }
+
+      # Remove arguments (Hack?) We don't want anybody to touch tihs one.
+      sources.delete("arguments")
+      if format
+        format_sources(sources)
+      else
+        sources
+      end
+    end
+
+    def format_sources(sources)
+      sources.map{ |s|
+        s << "*" if @config["enabled_sources"].include?(s)
+        s
+      }
+    end
   end
 end