Subversion Repositories mildred

Rev

Blame | Compare with Previous | Last modification | View Log | RSS feed

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