135 lines
2.4 KiB
Ruby
Executable File
135 lines
2.4 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require 'pp'
|
|
require 'observer'
|
|
require 'logger'
|
|
require 'json/pure'
|
|
require_relative 'soundcloud.rb'
|
|
require_relative 'mpg123player.rb'
|
|
require_relative 'ncurses_ui.rb'
|
|
|
|
class Cloudruby
|
|
def init(q, config)
|
|
@config = config
|
|
@cloud = SoundCloud.new "76796f79392f9398288cdac3fe3391c0"
|
|
@player = MPG123Player.new
|
|
@ui = NCursesUI.new self, (@config[:ncurses] || @config[:curses])
|
|
|
|
# @logger = Logger.new "logfile.log"
|
|
@logger = Logger.new STDERR
|
|
# @logger.level = Logger::DEBUG
|
|
@logger.level = Logger::Severity::UNKNOWN
|
|
|
|
@player.logger = @logger
|
|
@ui.logger = @logger
|
|
@logger.info {"logger inited"}
|
|
|
|
@player.add_observer @ui, :player_update
|
|
@player.add_observer self
|
|
@cloud.add_observer @ui, :cloud_update
|
|
@logger.info {"observer assigned"}
|
|
|
|
@cloud.load_playlist q
|
|
@logger.info {"loaded playlist"}
|
|
@cloud.shufflePlaylist unless @config[:"no-shuffle"]
|
|
@logger.info {"playlist shuffled"}
|
|
nextTrack
|
|
|
|
trap("INT") do
|
|
self.quit
|
|
end
|
|
end
|
|
|
|
def nextTrack
|
|
track = @cloud.nextTrack
|
|
unless track
|
|
puts "Nothing found"
|
|
quit
|
|
else
|
|
@player.play track
|
|
end
|
|
end
|
|
|
|
def prevTrack
|
|
track = @cloud.prevTrack
|
|
unless track
|
|
puts "Nothing found"
|
|
quit
|
|
else
|
|
@player.play track
|
|
end
|
|
end
|
|
|
|
def pause
|
|
@player.pause
|
|
end
|
|
|
|
def volumeUp
|
|
@player.volume = 5
|
|
end
|
|
|
|
def volumeDown
|
|
@player.volume = -5
|
|
end
|
|
|
|
def toggleMute
|
|
@player.mute
|
|
end
|
|
|
|
def run
|
|
@ui.run
|
|
end
|
|
|
|
# jump to next track, if current track finishes
|
|
def update(arg)
|
|
state = arg[:state]
|
|
case state
|
|
when :stop
|
|
nextTrack
|
|
end
|
|
end
|
|
|
|
def download
|
|
@cloud.download @config[:download_dir]
|
|
end
|
|
|
|
# quit app and free all resources
|
|
def quit
|
|
@ui.close
|
|
@player.close
|
|
@logger.close
|
|
exit
|
|
end
|
|
end
|
|
if $0 == __FILE__
|
|
@config = {}
|
|
@query = []
|
|
cfile = File.join Dir.home, ".#{File.basename($0)}.json"
|
|
|
|
ARGV.each do |a|
|
|
if a[0, 2] == "--"
|
|
a = a[2..-1]
|
|
key, value = a.split("=", 2)
|
|
@config[key.to_sym] = value || true
|
|
else
|
|
@query << a
|
|
end
|
|
end
|
|
|
|
if @config[:noconfig].nil? && File.readable?(cfile)
|
|
File.open cfile, 'r' do |file|
|
|
jsonconf = JSON.load file, nil, :symbolize_names => true
|
|
@config = jsonconf.merge(@config)
|
|
end
|
|
end
|
|
|
|
@config[:download_dir] ||= Dir.pwd
|
|
|
|
@query = @query.join " "
|
|
|
|
c = Cloudruby.new
|
|
c.init @query, @config
|
|
c.run
|
|
end
|
|
|