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