class AlarMPD

Constants

Alarm
DAY_REGEXP
D_SECS
H_SECS
TIME_REGEXP

Attributes

fade_in[RW]
interval[RW]
latest_alarm[R]
mpd[R]

Public Class Methods

new(host, port) click to toggle source
# File lib/alarmpd.rb, line 18
def initialize(host, port)
  @mpd = MPD.new host, port
  @scheduler = Rufus::Scheduler.new
  if defined?(RSpec)
    @scheduler.pause 
  else
    @mpd.connect
  end
  @fade_interval = 10
  @interval = 20
  @latest_alarm = nil
  @fade_in = false
  @alarm_job = nil
end
parse_entry(playlist_entry) click to toggle source
# File lib/alarmpd.rb, line 90
def self.parse_entry(playlist_entry)
  match = playlist_entry.match "^#{DAY_REGEXP} #{TIME_REGEXP}$"
  if match
    time = AlarMPD.prepare_time(match[1], match[2].to_i, match[3].to_i)
  end
end
prepare_time(day, hour, minute) click to toggle source
# File lib/alarmpd.rb, line 97
def self.prepare_time(day, hour, minute)

  wday = Date::DAYNAMES.index(day)
  current_wday = Time.now.wday

  offset = if wday < current_wday
             7 - (current_wday - wday)
           else
             wday - current_wday
           end

  offset_secs = offset * D_SECS + H_SECS * hour + minute * 60
  d = Date.today.to_time + offset_secs
  d = d + D_SECS * 7 if d < Time.now
  d
end

Public Instance Methods

alarm_job() click to toggle source
# File lib/alarmpd.rb, line 50
def alarm_job
  p = @mpd.playlists.find {|p| p.name == @latest_alarm.name}
  offset = @mpd.queue.count
  p.load

  if fade_in?
    @mpd.volume = 0
    @scheduler.every(@fade_interval, method(:fade_in_job))
  end

  @mpd.play offset
end
connect() click to toggle source
# File lib/alarmpd.rb, line 33
def connect
  @mpd.connect
end
fade_in?() click to toggle source
# File lib/alarmpd.rb, line 46
def fade_in?
  @fade_in
end
fade_in_job(job) click to toggle source
# File lib/alarmpd.rb, line 63
def fade_in_job(job)
  if @mpd.volume == 100
    job.unschedule if @mpd.volume == 100
  else
    @mpd.volume = @mpd.volume + 1
  end
end
fade_interval=(interval) click to toggle source
# File lib/alarmpd.rb, line 41
def fade_interval=(interval)
  @fade_interval = interval
  @fade_in = interval != 0
end
next_alarm() click to toggle source
# File lib/alarmpd.rb, line 80
def next_alarm
  alarms = []
  @mpd.playlists.each do |playlist|
    time = AlarMPD.parse_entry(playlist.name)
    alarms << Alarm.new(playlist.name, time) if time
  end
  alarms = alarms.sort_by &:time if alarms.any?
  alarms.first
end
refresh() click to toggle source
# File lib/alarmpd.rb, line 71
def refresh
  new_alarm = next_alarm
  if new_alarm && (@latest_alarm.nil? || new_alarm.time != @latest_alarm.time)
    @latest_alarm = new_alarm
    @alarm_job.unschedule if @alarm_job
    @alarm_job = @scheduler.schedule_at(new_alarm.time, method(:alarm_job))
  end
end
run() click to toggle source
# File lib/alarmpd.rb, line 114
def run
  @running = true
  while @running do
    refresh
    sleep @interval
  end
  @alarm_job.unschedule if @alarm_job
end
stop() click to toggle source
# File lib/alarmpd.rb, line 37
def stop
  @running = false
end