class DoubanFM::Player
Public Class Methods
new()
click to toggle source
# File lib/doubanfm/player.rb, line 5 def initialize @client = Client.new @semaphore = Mutex.new end
Public Instance Methods
login()
click to toggle source
# File lib/doubanfm/player.rb, line 59 def login return if @client.user_logged? email = ask("邮箱: ") password = ask("密码: ") do |q| q.echo = false end @client.login(email, password) end
play()
click to toggle source
# File lib/doubanfm/player.rb, line 39 def play Thread.new do player_proc = proc do |waiting| if waiting @client.next_song play_current_song do |wait| player_proc.call(wait) end end end player_proc.call(true) end end
skip()
click to toggle source
# File lib/doubanfm/player.rb, line 54 def skip @client.next_song kill_player_thread end
start()
click to toggle source
# File lib/doubanfm/player.rb, line 10 def start play loop do cmd = ask("DoubanFM> ", %w{login skip rate unrate quit}) do |q| q.overwrite = true q.readline = true end case cmd when 'login' login when 'skip' skip when 'rate' say('请先登录') unless @client.user_logged? @client.rate when 'unrate' say('请先登录') unless @client.user_logged? @client.unrate when 'quit' kill_player_thread break else say('Nothing to do') end end end
Private Instance Methods
kill_player_thread()
click to toggle source
# File lib/doubanfm/player.rb, line 87 def kill_player_thread Process.kill('KILL', @player_pid) end
play_current_song() { |waiting| ... }
click to toggle source
# File lib/doubanfm/player.rb, line 71 def play_current_song @semaphore.lock @waiting = false say("Playing #{@client.current_song[:title]}") @player_pid = fork{ exec 'mpg123', '-q', "#{@client.current_song[:url]}" } Process.wait(@player_pid) @waiting = true @semaphore.unlock yield @waiting if block_given? end