Files
bin/cloudruby_bck
2026-06-11 15:14:00 +02:00

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