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