lib/mkv2m4v/track_ranker.rb
require "forwardable"
module Mkv2m4v
class TrackRanker
extend Forwardable
def_delegators :@tracks, :each, :first
def initialize(tracks, options = {})
@tracks = tracks
@options = options
end
def filter
filtered_tracks = @tracks.select { |t| language_okay?(t) }
self.class.new(filtered_tracks, @options)
end
def rank
ranked_tracks = @tracks.sort_by { |t| -score(t) }
self.class.new(ranked_tracks, @options)
end
protected
def language_match?(track)
@options.languages.include?(track.language)
end
def language_okay?(track)
track.language.nil? ||
@options.languages.empty? ||
language_match?(track)
end
end
class VideoRanker < TrackRanker
def score(track)
score = 0
score += 8 if track.format == "AVC"
score += (track.height || 0)/ 1080.0 * 4.0
score += 2 if language_match?(track)
score
end
end
class AudioRanker < TrackRanker
def score(track)
score = 0
score += 4 if ["DTS", "AC-3"].include?(track.format)
score += 2 if track.format == "AAC"
score += (track.channel_count || 0) / 8.0 * 2.0
score += (track.bit_rate_kbps || 0) / 1500.0 * 2.0
score += 4 if language_match?(track)
score *= -1 unless ["DTS", "AC-3", "AAC"].include?(track.format)
score
end
end
class TextRanker < TrackRanker
def score(track)
score = 0
score += 3 if track == first
score += 4 if language_match?(track)
score
end
end
end