myimdb 0.3.13 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.13
1
+ 0.4.0
data/bin/myimdb CHANGED
@@ -48,13 +48,13 @@ def details(klass_name, name)
48
48
  search_scope = "#{klass_name.downcase}.com"
49
49
 
50
50
  search_result = Myimdb::Search::Google.search_text(name, :restrict_to=> search_scope)[0]
51
- site = "Myimdb::Scraper::#{klass_name}".constantize.new(search_result["url"])
52
- print "====================================================\n"
53
- print "#{klass_name} details for: #{name}\n"
54
- print "====================================================\n"
55
- print "#{site.summary}\n"
51
+ site = eval("Myimdb::Scraper::#{klass_name}").new(search_result[:url])
52
+ puts "===================================================="
53
+ puts "#{klass_name} details for: #{name}"
54
+ puts "===================================================="
55
+ puts "#{site.summary}\n"
56
56
  rescue Exception=> ex
57
- p "Unable to fetch #{klass_name} details for: #{name} because: #{ex.message}"
57
+ puts "Unable to fetch #{klass_name} details for: #{name} because: #{ex.message}"
58
58
  end
59
59
 
60
60
  ['Imdb', 'RottenTomatoes', 'Metacritic'].each do |site|
@@ -118,7 +118,7 @@ def repair_permissions_for(target_dir)
118
118
  `attrib -r "#{target_dir}"`
119
119
  `attrib +r "#{target_dir}"`
120
120
  else
121
- p 'Skipping permission repair; Windows required for this command'
121
+ p 'Skipping permission repair; Only works on Windows.'
122
122
  end
123
123
  end
124
124
 
@@ -128,7 +128,7 @@ end
128
128
 
129
129
  def save_image(target_dir, name, image_index=0)
130
130
  image_data = Myimdb::Search::Google.search_images(name, :size=> 'medium')[image_index]
131
- image_url = image_data["url"] if image_data
131
+ image_url = image_data[:url] if image_data
132
132
 
133
133
  if image_url
134
134
  image_file_path = File.join(target_dir, 'movie.jpg')
@@ -148,7 +148,7 @@ def generate_metadata(path, name)
148
148
  search_scope = "imdb.com"
149
149
 
150
150
  search_result = Myimdb::Search::Google.search_text(name, :restrict_to=> search_scope)[0]
151
- imdb = Myimdb::Scraper::Imdb.new(search_result["url"])
151
+ imdb = Myimdb::Scraper::Imdb.new(search_result[:url])
152
152
  new_name = name.gsub(/\[\S+\]/, "").strip
153
153
  new_name << " [#{imdb.year}] [#{imdb.rating},#{imdb.votes}] [#{imdb.directors.join(',')}]"
154
154
  puts "Renaming: #{name} to: #{new_name}"
@@ -1,7 +1,14 @@
1
- require 'rubygems'
2
- require 'httparty'
3
- require 'nokogiri'
4
- require 'open-uri'
5
-
6
- require 'myimdb/search'
7
- require 'myimdb/scraper'
1
+ require 'rubygems'
2
+ require 'httparty'
3
+ require 'nokogiri'
4
+ require 'open-uri'
5
+
6
+ require 'myimdb/search'
7
+ require 'myimdb/scraper'
8
+
9
+ class ImdbMovie
10
+ def self.search(movie_name)
11
+ search_result = Myimdb::Search::Google.search_text(movie_name, :restrict_to=> 'imdb.com')[0]
12
+ Myimdb::Scraper::Imdb.new(search_result[:url]) if search_result
13
+ end
14
+ end
@@ -5,10 +5,10 @@ module HandleExceptions
5
5
  base.send(:include, InstanceMethods)
6
6
  base.send(:extend, ClassMethods)
7
7
  end
8
-
8
+
9
9
  module InstanceMethods
10
10
  end
11
-
11
+
12
12
  module ClassMethods
13
13
  def handle_exceptions_for(*method_names)
14
14
  method_names.each do |method_name|
@@ -29,47 +29,26 @@ module Myimdb
29
29
  module Scraper
30
30
  class Base
31
31
  include HandleExceptions
32
- def directors
33
- end
34
-
35
- def directors_with_url
36
- end
37
-
38
- def writers
39
- end
40
-
41
- def writers_with_url
42
- end
43
-
44
- def rating
45
- end
46
-
47
- def votes
48
- end
49
-
50
- def genres
51
- end
52
-
53
- def tagline
54
- end
55
-
56
- def plot
57
- end
58
-
59
- def year
60
- end
61
-
62
- def release_date
63
- end
64
-
65
- def image
66
- end
67
-
32
+ include Myimdb::Scraper::StringExtensions
33
+
34
+ def directors; end
35
+ def directors_with_url; end
36
+ def writers; end
37
+ def writers_with_url; end
38
+ def rating; end
39
+ def votes; end
40
+ def genres; end
41
+ def tagline; end
42
+ def plot; end
43
+ def year; end
44
+ def release_date; end
45
+ def image; end
46
+
68
47
  def summary
69
48
  [:directors, :writers, :rating, :votes, :genres, :tagline, :plot, :year, :release_date].collect do |meth|
70
49
  data = send(meth)
71
50
  data = data.join(", ") if Array === data
72
- sprintf("%-15s : %s", meth.to_s.titleize, data)
51
+ sprintf("%-15s : %s", meth.to_s.capitalize, data)
73
52
  end.join("\n")
74
53
  end
75
54
 
@@ -4,51 +4,51 @@ module Myimdb
4
4
  def initialize(url)
5
5
  @url = url
6
6
  end
7
-
7
+
8
8
  def directors
9
9
  document.css('.info h5:contains("Director") + .info-content a:not(.tn15more)').collect{ |a| a.text }
10
10
  end
11
-
11
+
12
12
  def directors_with_url
13
13
  document.css('.info h5:contains("Director") + .info-content a:not(.tn15more)').collect{ |a| {:name=> a.text, :url=> "http://www.imdb.com#{a['href']}" } }
14
14
  end
15
-
15
+
16
16
  def writers
17
17
  document.css('.info h5:contains("Writer") + .info-content a:not(.tn15more)').collect{ |a| a.text }
18
18
  end
19
-
19
+
20
20
  def writers_with_url
21
21
  document.css('.info h5:contains("Writer") + .info-content a:not(.tn15more)').collect{ |a| {:name=> a.text, :url=> "http://www.imdb.com#{a['href']}" } }
22
22
  end
23
-
23
+
24
24
  def rating
25
25
  document.css(".starbar-meta b").inner_text.strip.split('/').first.to_f
26
26
  end
27
-
27
+
28
28
  def votes
29
29
  document.css(".starbar-meta a").inner_text.strip.split(' ').first.sub(',', '').to_i
30
30
  end
31
-
31
+
32
32
  def genres
33
33
  document.css('.info h5:contains("Genre:") + .info-content a:not(.tn15more)').collect{ |a| a.text }
34
34
  end
35
-
35
+
36
36
  def tagline
37
37
  document.css('.info h5:contains("Tagline:") + .info-content').children[0].text.strip rescue nil
38
38
  end
39
-
39
+
40
40
  def plot
41
41
  document.css('.info h5:contains("Plot:") + .info-content').children[0].text.strip
42
42
  end
43
-
43
+
44
44
  def year
45
45
  document.css("div#tn15title a:first")[0].text.to_i
46
46
  end
47
-
47
+
48
48
  def release_date
49
49
  Date.parse(document.css('.info h5:contains("Release Date:") + .info-content').inner_text)
50
50
  end
51
-
51
+
52
52
  def image
53
53
  image_url = document.css(".photo:first a").first['href']
54
54
  unless image_url.nil? or image_url =~ /addposter/
@@ -56,12 +56,12 @@ module Myimdb
56
56
  image_document.css('#principal img:first').first['src']
57
57
  end
58
58
  end
59
-
59
+
60
60
  private
61
61
  def document
62
62
  @document ||= Nokogiri::HTML(open(@url))
63
63
  end
64
-
64
+
65
65
  handle_exceptions_for :directors, :directors_with_url, :writers, :writers_with_url, :rating, :votes, :genres, :tagline, :plot, :year, :image
66
66
  end
67
67
  end
@@ -4,28 +4,30 @@ module Myimdb
4
4
  def initialize(url)
5
5
  @url = url
6
6
  end
7
-
7
+
8
8
  def rating
9
9
  document.css("#metascore").inner_text.strip.to_f/10
10
10
  end
11
-
11
+
12
12
  def votes
13
13
  document.at("a[@href='#critics']").inner_text.strip.to_i
14
14
  end
15
-
15
+
16
16
  def genres
17
- document.css("#productinfo p:first").text.gsub(/^\S+:/, '').split("|").map(&:strip_useless_chars)
17
+ document.css("#productinfo p:first").text.gsub(/^\S+:/, '').split("|").collect do |genre|
18
+ strip_useless_chars(genre)
19
+ end
18
20
  end
19
-
21
+
20
22
  def plot
21
23
  document.css("#productsummary .summarytext").inner_text.strip
22
24
  end
23
-
25
+
24
26
  private
25
27
  def document
26
28
  @document ||= Nokogiri::HTML(open(@url))
27
29
  end
28
-
30
+
29
31
  handle_exceptions_for :rating, :votes, :genres, :plot
30
32
  end
31
33
  end
@@ -8,24 +8,24 @@ module Myimdb
8
8
  def rating
9
9
  document.css("#tomatometer_data p:nth-child(4) span").inner_text.strip.to_i
10
10
  end
11
-
11
+
12
12
  def votes
13
13
  document.css("#tomatometer_data p:nth-child(1) span").inner_text.strip.to_i
14
14
  end
15
-
15
+
16
16
  def genres
17
- document.css("#movie_stats .fl:first p:last .content a").inner_text.scraper_unescape_html.to_a
17
+ document.css("#movie_stats .fl:first p:last .content a").inner_text.strip.to_a
18
18
  end
19
-
19
+
20
20
  def plot
21
21
  document.css("#movie_synopsis_all").inner_text.strip
22
22
  end
23
-
23
+
24
24
  private
25
25
  def document
26
26
  @document ||= Nokogiri::HTML(open(@url))
27
27
  end
28
-
28
+
29
29
  handle_exceptions_for :rating, :votes, :genres, :plot
30
30
  end
31
31
  end
@@ -4,38 +4,13 @@ require 'iconv'
4
4
  module Myimdb
5
5
  module Scraper
6
6
  module StringExtensions
7
- def scraper_unescape_html
8
- Iconv.conv("UTF-8", 'ISO-8859-1', CGI::unescapeHTML(self))
7
+ def scraper_unescape_html(string)
8
+ Iconv.conv("UTF-8", 'ISO-8859-1', CGI::unescapeHTML(string))
9
9
  end
10
10
 
11
- def scraper_strip_tags
12
- gsub(/<\/?[^>]*>/, "")
13
- end
14
-
15
- def strip_useless_chars
16
- gsub(/[^a-zA-z0-9\|\-_\(\)@$\/\\]/, '')
17
- end
18
-
19
- def titleize
20
- humanize.gsub(/\b('?[a-z])/) { $1.capitalize }
21
- end
22
-
23
- def humanize
24
- gsub(/_/, " ").capitalize
25
- end
26
-
27
- def constantize
28
- names = self.split('::')
29
- names.shift if names.empty? || names.first.empty?
30
-
31
- constant = Object
32
- names.each do |name|
33
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
34
- end
35
- constant
11
+ def strip_useless_chars(string)
12
+ string.gsub(/[^a-zA-z0-9\|\-_\(\)@$\/\\]/, '')
36
13
  end
37
14
  end
38
15
  end
39
- end
40
-
41
- String.send :include, Myimdb::Scraper::StringExtensions
16
+ end
@@ -1,2 +1,4 @@
1
1
  require 'httparty'
2
- require 'myimdb/search/google'
2
+ require 'myimdb/search/base'
3
+ require 'myimdb/search/google'
4
+ require 'myimdb/search/bing'
@@ -0,0 +1,14 @@
1
+ module Myimdb
2
+ module Search
3
+ class Base
4
+ class << self
5
+ def spell_movie( text, options={} )
6
+ search_results = search_text(text, :restrict_to=> 'imdb.com')
7
+ search_results and search_results.collect do |search_result|
8
+ search_result[:title].gsub(/ \(.*$/, "")
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ module Myimdb
2
+ module Search
3
+ class Bing < Base
4
+ include HTTParty
5
+ format :json
6
+ headers 'Content-Type' => 'application/json'
7
+
8
+ AppKey = '36C1CEF363A00C6536C4420D356B5E507C4C2AF1'
9
+ base_uri 'api.search.live.net'
10
+
11
+ class << self
12
+ def search_text( text, options={} )
13
+ text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
14
+ response = get( '/json.aspx', :query=> {:Appid=> AppKey, :query=> text, :sources=> 'web'} )
15
+ parse_search_result(response, 'Web')
16
+ end
17
+
18
+ def search_images( text, options={} )
19
+ text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
20
+ response = get( '/json.aspx', :query=> {:Appid=> AppKey, :query=> text, :sources=> 'image'} )
21
+ parse_search_result(response, 'Image')
22
+ end
23
+
24
+ def spell( text, options={} )
25
+ text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
26
+ response = get( '/json.aspx', :query=> {:Appid=> AppKey, :query=> text, :sources=> 'spell'} )
27
+ parse_search_result(response, 'Spell')
28
+ end
29
+
30
+ private
31
+ def parse_search_result( response, type )
32
+ response['SearchResponse'][type]['Results'].collect do |response_element|
33
+ {
34
+ :url => response_element['Url'],
35
+ :title => response_element['Title']
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,29 +1,41 @@
1
1
  module Myimdb
2
2
  module Search
3
- class Google
3
+ class Google < Base
4
4
  include HTTParty
5
+ format :json
6
+ headers 'Content-Type' => 'application/json'
5
7
 
6
- format :json
7
- headers 'Content-Type' => 'application/json'
8
8
  base_uri 'ajax.googleapis.com'
9
+
10
+ class << self
11
+ def search_text( text, options={} )
12
+ text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
13
+ response = get( '/ajax/services/search/web', :query=> {:v=> '1.0', :q=> text} )
14
+ parse_search_result( response )
15
+ end
9
16
 
10
- def self.search_text( text, options={} )
11
- text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
12
- response = get( '/ajax/services/search/web', :query=> {:v=> '1.0', :q=> text} )
13
- response['responseData'] and response['responseData']['results']
14
- end
15
-
16
- def self.search_images( text, options={} )
17
- sizes = {
18
- 'large' => 'l',
19
- 'medium' => 'm',
20
- 'small' => 'i'
21
- }
22
- search_options = { :v=> '1.0', :q=> text }
23
- search_options.merge!(:imgsz=> sizes[options[:size].to_s]) if !options[:size].blank?
24
- text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
25
- response = get( '/ajax/services/search/images', :query=> search_options )
26
- response['responseData'] and response['responseData']['results']
17
+ def search_images( text, options={} )
18
+ sizes = {
19
+ 'large' => 'l',
20
+ 'medium' => 'm',
21
+ 'small' => 'i'
22
+ }
23
+ search_options = { :v=> '1.0', :q=> text }
24
+ search_options.merge!(:imgsz=> sizes[options[:size].to_s]) if !options[:size].blank?
25
+ text = text + " site:#{options[:restrict_to]}" if !options[:restrict_to].blank?
26
+ response = get( '/ajax/services/search/images', :query=> search_options )
27
+ parse_search_result( response )
28
+ end
29
+
30
+ private
31
+ def parse_search_result( response )
32
+ response['responseData'] and response['responseData']['results'].collect do |response_element|
33
+ {
34
+ :url => response_element['url'],
35
+ :title => response_element['titleNoFormatting']
36
+ }
37
+ end
38
+ end
27
39
  end
28
40
  end
29
41
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{myimdb}
8
- s.version = "0.3.13"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gaurav"]
12
- s.date = %q{2010-02-01}
12
+ s.date = %q{2010-02-22}
13
13
  s.email = %q{gaurav@vinsol.com}
14
14
  s.executables = ["myimdb", "myimdb-catalogue"]
15
15
  s.extra_rdoc_files = [
@@ -31,6 +31,8 @@ Gem::Specification.new do |s|
31
31
  "lib/myimdb/scraper/rotten_tomatoes.rb",
32
32
  "lib/myimdb/scraper/string_extensions.rb",
33
33
  "lib/myimdb/search.rb",
34
+ "lib/myimdb/search/base.rb",
35
+ "lib/myimdb/search/bing.rb",
34
36
  "lib/myimdb/search/google.rb",
35
37
  "myimdb.gemspec",
36
38
  "test/helper.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: myimdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.13
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gaurav
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-01 00:00:00 +05:30
12
+ date: 2010-02-22 00:00:00 +05:30
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -57,6 +57,8 @@ files:
57
57
  - lib/myimdb/scraper/rotten_tomatoes.rb
58
58
  - lib/myimdb/scraper/string_extensions.rb
59
59
  - lib/myimdb/search.rb
60
+ - lib/myimdb/search/base.rb
61
+ - lib/myimdb/search/bing.rb
60
62
  - lib/myimdb/search/google.rb
61
63
  - myimdb.gemspec
62
64
  - test/helper.rb