class ProgrammingBlock
include Comparable
cattr_accessor :logger
attr_reader :name, :description
attr_accessor :time_slot
QUEUE_TRACK = 0
QUEUE_MEDIUM = 1
QUEUE_POWER_BLOCK = 2
def self.default(opts={})
logger.warn("Loading default programming block")
defaults = {
:name => "Default",
:description => "Description",
:queuing => {:medium => 0.025, :power_block => 0.025}
}
ProgrammingBlock.new(defaults.merge(opts))
end
def initialize(opts={})
opts.symbolize_keys!
@name = opts[:name] || "No name"
@description = opts[:description] || "No description"
@mood_names = opts[:moods] || []
@album_titles = opts[:albums] || []
@artist_names = opts[:artists] || []
@time_slot = opts[:time_slot]
@queue_medium_probability = 0.0
@queue_power_block_probability = 0.0
if q = opts[:queueing]
@queue_medium_probability = q["medium"] || 0.0
@queue_power_block_probability = q["power block"] || 0.0
end
@filename = opts[:filename]
check_probabilities
end
def ==(other)
return false unless other.is_a?(ProgrammingBlock)
of = other.instance_variable_get(:@filename)
of == @filename
end
alias_method :eql?, :==
alias_method :equal?, :==
def queue_type
x = Kernel::rand
base = 0.0
if x <= base + @queue_medium_probability
return QUEUE_MEDIUM
else
base += @queue_medium_probability
end
if x <= base + @queue_power_block_probability
return QUEUE_POWER_BLOCK
else
base += @queue_medium_probability
end
return QUEUE_TRACK
end
def fetch
Fetcher.new(@mood_names, @album_titles, @artist_names)
end
def is_now?(time=Time.now)
@time_slot.is_now?(time)
end
def start
@time_slot.start
end
def end
@time_slot.end
end
def duration
@time_slot.duration
end
def <=>(other)
@time_slot <=> other.instance_variable_get(:@time_slot)
end
private
def check_probabilities
probabilities = self.instance_variables.find_all do |i|
/^@.*_probability$/.match(i) != nil
end
sum = probabilities.inject(0.0) {|m,p| m + instance_variable_get(p)}
raise "Probabilities must be <= 1.0 (#{sum})" if sum > 1
end
end