Class: MovieSearcher
- Inherits:
-
Object
- Object
- MovieSearcher
- Defined in:
- lib/movie_searcher.rb
Instance Attribute Summary collapse
-
#cleaners ⇒ Object
Returns the value of attribute cleaners.
-
#options ⇒ Object
Returns the value of attribute options.
Class Method Summary collapse
-
.find_by_download(unknown) ⇒ Object
Try to figure out what method to use, folder or file.
-
.find_by_file(file_path) ⇒ Object
Finds the movie based on the nfo file (or similar file).
-
.find_by_folder(folder_path) ⇒ Object
Finds the movie based on the folder.
-
.find_by_release_name(search_value, options = {}) ⇒ Object
Finds the movie based on the release name of the movie.
- .method_missing(method, *args, &block) ⇒ Object
-
.relative?(unknown) ⇒ Boolean
Returns the full path of the file/folder.
Instance Method Summary collapse
- #cleaner(string) ⇒ Object
- #find_the_movie! ⇒ Object
-
#initialize(args) ⇒ MovieSearcher
constructor
A new instance of MovieSearcher.
- #shortest(a, b) ⇒ Object
- #super_cleaner(string) ⇒ Object
- #to_long? ⇒ Boolean
Constructor Details
#initialize(args) ⇒ MovieSearcher
Returns a new instance of MovieSearcher.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/movie_searcher.rb', line 10 def initialize(args) args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] unless name == :options } @options = { :long => 15, :split => /\s+|\./, :imdb => ImdbParty::Imdb.new, :limit => 0.4 } @options.merge!(args[:options]) unless args[:options].nil? @cleaners = YAML.load(File.read("#{File.dirname(__FILE__)}/imdb_party/exclude.yaml"))["excluded"] end |
Instance Attribute Details
#cleaners ⇒ Object
Returns the value of attribute cleaners.
8 9 10 |
# File 'lib/movie_searcher.rb', line 8 def cleaners @cleaners end |
#options ⇒ Object
Returns the value of attribute options.
8 9 10 |
# File 'lib/movie_searcher.rb', line 8 def @options end |
Class Method Details
.find_by_download(unknown) ⇒ Object
Try to figure out what method to use, folder or file
73 74 75 76 |
# File 'lib/movie_searcher.rb', line 73 def self.find_by_download(unknown) unknown = self.relative?(unknown) File.directory?(unknown) ? self.find_by_folder(unknown) : self.find_by_release_name(File.split(unknown).last) end |
.find_by_file(file_path) ⇒ Object
Finds the movie based on the nfo file (or similar file)
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/movie_searcher.rb', line 35 def self.find_by_file(file_path) data = File.read(file_path) # If the file is encoded in something non valid (according to ruby), then it can't be read here # The {valid_encoding} method is not included in ruby 1.8.7, that's why i'm using {respond_to?} # More info here: http://blog.grayproductions.net/articles/ruby_19s_string # If the user uses 1.8.7 and the string isn't encoded in UTF-8, nothing happens. # The script won't throw an exception as it does in 1.9.2 return if data.respond_to?(:valid_encoding?) and not data.valid_encoding? if data =~ /imdb\.com\/title\/(tt\d+)/ return self.find_movie_by_id($1) end end |
.find_by_folder(folder_path) ⇒ Object
Finds the movie based on the folder
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/movie_searcher.rb', line 51 def self.find_by_folder(folder_path) # Relative path? folder_path = self.relative?(folder_path) # Makes sure that every directory looks the same, an raises an exception if the dir does not exist folder_path = Dir.new(folder_path).path %x{cd '#{folder_path}' && find '#{folder_path}' -maxdepth 4}.split(/\n/).each do |file| # Locating every textfile in the directory # We're hoping to find a nfo file if Mimer.identify(file).text? result = self.find_by_file(file) return result unless result.nil? end end # Last resort, we hope that the folder contain the release name return self.find_by_release_name(File.split(folder_path).last) end |
.find_by_release_name(search_value, options = {}) ⇒ Object
Finds the movie based on the release name of the movie
26 27 28 29 30 31 32 |
# File 'lib/movie_searcher.rb', line 26 def self.find_by_release_name(search_value, = {}) return if search_value.nil? or search_value.length.zero? this = MovieSearcher.new(.merge(:search_value => search_value.to_s)) return if this.to_long? this.find_the_movie! end |
.method_missing(method, *args, &block) ⇒ Object
109 110 111 112 |
# File 'lib/movie_searcher.rb', line 109 def self.method_missing(method, *args, &block) result = ImdbParty::Imdb.new.send(method, *args) result.class == Array ? result.map{|r| ImdbParty::Movie.new(r)} : result end |
.relative?(unknown) ⇒ Boolean
Returns the full path of the file/folder
79 80 81 |
# File 'lib/movie_searcher.rb', line 79 def self.relative?(unknown) unknown.match(/^\//) ? unknown : File.(unknown) end |
Instance Method Details
#cleaner(string) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/movie_searcher.rb', line 114 def cleaner(string) @cleaners.each do |clean| string = string.gsub(/#{clean}/i, ' ') end [/(19|20\d{2})/, /\./, /\s*-\s*/, /\s{2,}/].each do |regex| string = string.gsub(regex, ' ') end string.strip end |
#find_the_movie! ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/movie_searcher.rb', line 88 def find_the_movie! search = Spot.new.clean!(cleaner(@search_value)).gsub(/\s+/, "_") run = true count = 0 while run run = false begin data = RestClient.get "http://sg.media-imdb.com/suggests/#{search[0]}/#{search[0..(search.length - count)]}.json" rescue RestClient::Exception run = true count += 1 end if not run or count >= search.length iid = data.match(/(tt\d+)/).to_a[1] end end MovieSearcher.find_movie_by_id(iid) if iid end |
#shortest(a, b) ⇒ Object
126 127 128 129 130 131 132 133 |
# File 'lib/movie_searcher.rb', line 126 def shortest(a,b) # If the release contains a year, then the corresponding movie from IMDB should have the same year if year = @search_value.match(/(19|20\d{2})/) return nil unless year[1] == a[:year] end Levenshtein.distance(self.super_cleaner(a[:title]), self.super_cleaner(self.cleaner(b)), @options[:limit]) end |
#super_cleaner(string) ⇒ Object
135 136 137 |
# File 'lib/movie_searcher.rb', line 135 def super_cleaner(string) string.gsub(/[^a-z0-9]/i, '') end |
#to_long? ⇒ Boolean
83 84 85 86 |
# File 'lib/movie_searcher.rb', line 83 def to_long? @split = self.cleaner(@search_value).split(@options[:split]) @split.length > @options[:long] end |