rotten-tomatoes 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/rotten-tomatoes.rb +187 -0
- data/rotten-tomatoes.gemspec +52 -0
- data/test/helper.rb +10 -0
- data/test/test_rotten-tomatoes.rb +7 -0
- metadata +86 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 atom smith
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= rotten-tomatoes
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 atom smith. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "rotten-tomatoes"
|
8
|
+
gem.summary = 'Fetch information regarding movies from rottentomatoes.com'
|
9
|
+
gem.description = 'Allows you to search and get information about movies from rottentomatoes.com. Organizes returned information into easy to access attributes.'
|
10
|
+
gem.email = "re5etsmyth@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/re5et/rotten-tomatoes"
|
12
|
+
gem.authors = ["atom smith"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "rotten-tomatoes #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# A scraper to search for and fetch useful information
|
2
|
+
# about movies from rottentomatoes.com
|
3
|
+
#
|
4
|
+
# Author:: atom smith (http://twitter.com/re5et)
|
5
|
+
# Copyright:: Copyright (c) 2010 atom smith
|
6
|
+
# License:: Distributes under the same terms as Ruby
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'nokogiri'
|
10
|
+
require 'open-uri'
|
11
|
+
|
12
|
+
# Module to hold everything
|
13
|
+
module Rotten_tomatoes
|
14
|
+
|
15
|
+
Base_url = 'http://www.rottentomatoes.com'
|
16
|
+
Search_url = Base_url + '/search/movie.php?searchby=movies&page=1&search='
|
17
|
+
|
18
|
+
# Create a new instance of Rotten_tomatoes::Movie with the
|
19
|
+
# rottentomatoes.com movie path as an argument
|
20
|
+
def self.get_info info_path
|
21
|
+
Movie.new info_path
|
22
|
+
end
|
23
|
+
|
24
|
+
# Search rottentomatoes.com for the movie you are looking for
|
25
|
+
# will return an array of movies for you to select from, each
|
26
|
+
# will contain the 'info_url' you need to us Rotten_tomatoes:get_info
|
27
|
+
def self.find_movie movie
|
28
|
+
movies = []
|
29
|
+
url = URI.parse(URI.encode(Search_url + movie))
|
30
|
+
results = Nokogiri::HTML(open(url))
|
31
|
+
results.css('#movie_search_main tr').each do |row|
|
32
|
+
movies.push({
|
33
|
+
:title => row.css('td:nth-of-type(3) p:first-of-type a').inner_text,
|
34
|
+
:plot => row.css('td:nth-of-type(3) p:nth-of-type(2)').inner_text.gsub(/\APlot:/, '').strip,
|
35
|
+
:year => row.css('.date').inner_text,
|
36
|
+
:director => row.css('td:nth-of-type(3) p:nth-of-type(3) a:first-of-type').inner_text,
|
37
|
+
:info_url => row.css('td:nth-of-type(3) p:first-of-type a').attr('href').value
|
38
|
+
})
|
39
|
+
end
|
40
|
+
return movies
|
41
|
+
end
|
42
|
+
|
43
|
+
# Uses Rotten_tomatoes::get_info to fetch info for the first
|
44
|
+
# search result found with Rotten_tomatoes::find_movie
|
45
|
+
def self.lucky_get_info movie
|
46
|
+
get_info find_movie(movie).first[:info_url]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Rotten_tomatoes::Movie is a class that organizes the scraped
|
50
|
+
# information about the movie into easily accessible attribues.
|
51
|
+
class Movie
|
52
|
+
|
53
|
+
attr_reader :info_page, :title, :year, :people, :cast, :writers, :directors, :runtime, :rating, :tomatometer, :tomatometer_average_rating, :tomatometer_reviews_counted, :tomatometer_fresh, :tomatometer_rotten, :audience_rating, :number_of_ratings, :number_of_critic_reviews, :fresh_reviews, :rotten_reviews, :average_critic_rating, :genres, :release, :distributor
|
54
|
+
|
55
|
+
def initialize movie_url
|
56
|
+
@info_page = Nokogiri::HTML(open(URI.parse(Rotten_tomatoes::Base_url + movie_url)))
|
57
|
+
if @info_page
|
58
|
+
set_title_and_year
|
59
|
+
set_cast
|
60
|
+
set_writers
|
61
|
+
set_directors
|
62
|
+
set_people
|
63
|
+
set_runtime
|
64
|
+
set_rating
|
65
|
+
set_tomatometer
|
66
|
+
set_tomatometer_average_rating
|
67
|
+
set_tomatometer_reviews_counted
|
68
|
+
set_tomatometer_fresh_and_rotten
|
69
|
+
set_audience_rating
|
70
|
+
set_audience_average_rating
|
71
|
+
set_audience_number_of_ratings
|
72
|
+
set_genres
|
73
|
+
set_release
|
74
|
+
set_distributor
|
75
|
+
end
|
76
|
+
return self
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def set_title_and_year
|
82
|
+
title_and_year = @info_page.css('h1.movie_title span').first.inner_html
|
83
|
+
match = title_and_year.match(/(.*)\((\d{4})\)/)
|
84
|
+
@title = match[1].strip
|
85
|
+
@year = match[2]
|
86
|
+
end
|
87
|
+
|
88
|
+
def set_cast
|
89
|
+
@cast = []
|
90
|
+
@info_page.css('#cast-info li').each do |person|
|
91
|
+
p person
|
92
|
+
@cast.push({
|
93
|
+
'name' => person.css('a').inner_html,
|
94
|
+
'info_path' => person.css('a').first['href'],
|
95
|
+
'thumbnail' => person.css('img').first['src'],
|
96
|
+
'characters'=> person.css('.characters').first.content.gsub(/\(\)/, '')
|
97
|
+
})
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def set_writers
|
102
|
+
@writers = []
|
103
|
+
@info_page.css('.movie_info .right_col p:nth-child(3) a').each do |writer|
|
104
|
+
@writers.push({
|
105
|
+
'name' => writer.inner_html,
|
106
|
+
'info_path' => writer['href']
|
107
|
+
})
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_directors
|
112
|
+
@directors = []
|
113
|
+
@info_page.css('.movie_info .right_col p:nth-child(2) a').each do |director|
|
114
|
+
@directors.push({
|
115
|
+
'name' => director.inner_html,
|
116
|
+
'info_path' => director['href']
|
117
|
+
})
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def set_people
|
122
|
+
@people = { :cast => @cast, :writers => @writers, :directors => @directors }
|
123
|
+
end
|
124
|
+
|
125
|
+
def set_runtime
|
126
|
+
@runtime = @info_page.css('.movie_info .left_col p:nth-child(2) .content').first.inner_html
|
127
|
+
end
|
128
|
+
|
129
|
+
def set_rating
|
130
|
+
@rating = @info_page.css('.movie_info .left_col p:first-child .content span').text
|
131
|
+
end
|
132
|
+
|
133
|
+
def set_tomatometer
|
134
|
+
@tomatometer = @info_page.css('#all-critics-numbers #all-critics-meter').inner_html
|
135
|
+
end
|
136
|
+
|
137
|
+
def set_tomatometer_average_rating
|
138
|
+
@tomatometer_average_rating = @info_page.css('.critic_stats span:first-of-type').text.gsub(/\/.*/, '')
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_tomatometer_reviews_counted
|
142
|
+
@tomatometer_reviews_counted = @info_page.css('.critic_stats span:nth-of-type(2)').text
|
143
|
+
end
|
144
|
+
|
145
|
+
def set_tomatometer_fresh_and_rotten
|
146
|
+
matches = @info_page.css('#all-critics-numbers .critic_stats').text.scan /Fresh:\s(\d+)\s|\sRotten:\s(\d)+/
|
147
|
+
@tomatometer_fresh = matches[0][0]
|
148
|
+
@tomatometer_rotten = matches[1][1]
|
149
|
+
end
|
150
|
+
|
151
|
+
def set_audience_rating
|
152
|
+
end
|
153
|
+
|
154
|
+
def set_audience_average_rating
|
155
|
+
end
|
156
|
+
|
157
|
+
def set_audience_number_of_ratings
|
158
|
+
end
|
159
|
+
|
160
|
+
def set_genres
|
161
|
+
@genres = []
|
162
|
+
@info_page.css('.movie_info p:first-of-type .content a').each do |genre|
|
163
|
+
@genres.push genre.text
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def set_release
|
168
|
+
@release = info_page.css('.movie_info .left_col p:nth-of-type(3) .content span').text
|
169
|
+
end
|
170
|
+
|
171
|
+
def set_distributor
|
172
|
+
@distributor = @info_page.css('.movie_info .right_col p:nth-of-type(1)').text.gsub('Distributor:', '')
|
173
|
+
end
|
174
|
+
|
175
|
+
public
|
176
|
+
|
177
|
+
def director
|
178
|
+
@directors.first
|
179
|
+
end
|
180
|
+
|
181
|
+
def writer
|
182
|
+
@writers.first
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rotten-tomatoes}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["atom smith"]
|
12
|
+
s.date = %q{2011-01-07}
|
13
|
+
s.description = %q{Allows you to search and get information about movies from rottentomatoes.com. Organizes returned information into easy to access attributes.}
|
14
|
+
s.email = %q{re5etsmyth@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"lib/rotten-tomatoes.rb",
|
26
|
+
"rotten-tomatoes.gemspec",
|
27
|
+
"test/helper.rb",
|
28
|
+
"test/test_rotten-tomatoes.rb"
|
29
|
+
]
|
30
|
+
s.homepage = %q{http://github.com/re5et/rotten-tomatoes}
|
31
|
+
s.require_paths = ["lib"]
|
32
|
+
s.rubygems_version = %q{1.3.7}
|
33
|
+
s.summary = %q{Fetch information regarding movies from rottentomatoes.com}
|
34
|
+
s.test_files = [
|
35
|
+
"test/helper.rb",
|
36
|
+
"test/test_rotten-tomatoes.rb"
|
37
|
+
]
|
38
|
+
|
39
|
+
if s.respond_to? :specification_version then
|
40
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
41
|
+
s.specification_version = 3
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
45
|
+
else
|
46
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
47
|
+
end
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rotten-tomatoes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- atom smith
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-07 00:00:00 -08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: thoughtbot-shoulda
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
description: Allows you to search and get information about movies from rottentomatoes.com. Organizes returned information into easy to access attributes.
|
34
|
+
email: re5etsmyth@gmail.com
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- LICENSE
|
41
|
+
- README.rdoc
|
42
|
+
files:
|
43
|
+
- .document
|
44
|
+
- LICENSE
|
45
|
+
- README.rdoc
|
46
|
+
- Rakefile
|
47
|
+
- VERSION
|
48
|
+
- lib/rotten-tomatoes.rb
|
49
|
+
- rotten-tomatoes.gemspec
|
50
|
+
- test/helper.rb
|
51
|
+
- test/test_rotten-tomatoes.rb
|
52
|
+
has_rdoc: true
|
53
|
+
homepage: http://github.com/re5et/rotten-tomatoes
|
54
|
+
licenses: []
|
55
|
+
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.7
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Fetch information regarding movies from rottentomatoes.com
|
84
|
+
test_files:
|
85
|
+
- test/helper.rb
|
86
|
+
- test/test_rotten-tomatoes.rb
|