rmm5t/mkv2m4v

View on GitHub
lib/mkv2m4v/track_ranker.rb

Summary

Maintainability
A
25 mins
Test Coverage
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