class Search

Public Instance Methods

ambiguous?(movies) click to toggle source
# File lib/dvd_ripper/search.rb, line 49
def ambiguous?(movies)
  return true if movies.empty?
  return false if movies.size == 1

  lowest_distance = movies[0].title_distance

  return true if lowest_distance > ::DvdRipper::Config.instance.distance_threshold
  return true if movies.find_all { |m| m.title_distance == lowest_distance }.size > 1

  false
end
auto_select(movies) click to toggle source
# File lib/dvd_ripper/search.rb, line 39
def auto_select(movies)
  auto_select_distance = ::DvdRipper::Config.instance.distance_threshold
  unless movies.empty?
    return movies[0] if movies.size == 1
    return movies[0] if movies[0].title_distance < auto_select_distance
  end

  nil
end
closest(title) click to toggle source
# File lib/dvd_ripper/search.rb, line 2
def closest(title)
  searcher = SearchFactory.get('tmdb')

  movies = leven_sort(title, searcher.search(title))
  while movies.empty?
    puts ' - Title Not Found - '
    puts 'Enter movie title (or enter to skip search):'
    title = $stdin.gets.chomp
    return nil if title.empty?
    movies = leven_sort(title, searcher.search(title))
  end

  movie = auto_select(movies)
  if movie.nil? || ambiguous?(movies)
    puts 'Please choose:'
    movies.each_with_index do |m, i|
      puts "#{i}. #{m.title} (#{m.release_date}) (#{m.title_distance.round(3)})"
    end
    puts 's. Skip'
    title_sel = $stdin.gets.chomp
    return nil if title_sel == 's'
    movie = movies[title_sel.to_i]
  end
  info = SearchFactory.get('imdb').search(title)[0]

  movie = Movie.new(movie, info)
  movie
end
leven_sort(search_title, movies) click to toggle source
# File lib/dvd_ripper/search.rb, line 31
def leven_sort(search_title, movies)
  movies.each do |movie|
    distance = Levenshtein.normalized_distance(search_title, movie.title)
    movie.title_distance = distance
  end
  movies.reverse.sort_by(&:title_distance)
end