derobo-imdb_og 0.5.2
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/.gitignore +7 -0
- data/LICENSE +20 -0
- data/README.rdoc +53 -0
- data/Rakefile +59 -0
- data/VERSION +1 -0
- data/derobo-imdb_og.gemspec +68 -0
- data/lib/imdb.rb +12 -0
- data/lib/imdb/imdb.rb +167 -0
- data/lib/imdb/imdb_company.rb +8 -0
- data/lib/imdb/imdb_genre.rb +8 -0
- data/lib/imdb/imdb_movie.rb +23 -0
- data/lib/imdb/imdb_name.rb +9 -0
- data/lib/imdb/patches.rb +13 -0
- data/test/imdb_test.rb +196 -0
- data/test/test_helper.rb +10 -0
- metadata +111 -0
data/.gitignore
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2009 Jon Maddox
|
|
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,53 @@
|
|
|
1
|
+
= derobo-imdb_og
|
|
2
|
+
|
|
3
|
+
This is a fork of Jon Maddox's gem imdb_og (http://github.com/maddox/imdb)
|
|
4
|
+
|
|
5
|
+
== DESCRIPTION:
|
|
6
|
+
|
|
7
|
+
A simple ruby library to scrape IMDB.
|
|
8
|
+
* http://github.com/derobo/imdb
|
|
9
|
+
|
|
10
|
+
== FEATURES :
|
|
11
|
+
|
|
12
|
+
* Searching imdb for movies based on title
|
|
13
|
+
* Getting a Movie object based on it's imdb id
|
|
14
|
+
* Most information on imdb gets scraped, like title, poster, rating, alternative titles etc
|
|
15
|
+
|
|
16
|
+
== SYNOPSIS:
|
|
17
|
+
|
|
18
|
+
You should use following code to include this gem into your project. This prevents namespace issus.
|
|
19
|
+
|
|
20
|
+
require 'rubygems'
|
|
21
|
+
begin
|
|
22
|
+
gem "derobo-imdb_og"
|
|
23
|
+
require "imdb"
|
|
24
|
+
rescue Gem::LoadError
|
|
25
|
+
# handle the error somehow
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
To search for a movie(including alternative titles):
|
|
29
|
+
|
|
30
|
+
m = Imdb.search_movies_by_title("Ein Fisch namens Wanda", true)
|
|
31
|
+
m.first[:title]
|
|
32
|
+
#=> "A Fish Called Wanda"
|
|
33
|
+
m.first[:imdb_id]
|
|
34
|
+
#=> "tt0095159"
|
|
35
|
+
|
|
36
|
+
To get a movie by it's imdb-id:
|
|
37
|
+
|
|
38
|
+
m = Imdb.find_movie_by_id("tt095159")
|
|
39
|
+
m.title
|
|
40
|
+
#=> "A Fish Called Wanda"
|
|
41
|
+
|
|
42
|
+
== REQUIREMENTS:
|
|
43
|
+
Following gems are needed:
|
|
44
|
+
* Hpricot
|
|
45
|
+
* htmlentities
|
|
46
|
+
|
|
47
|
+
== INSTALL:
|
|
48
|
+
Install and activated the gemcutter gem if needed
|
|
49
|
+
$ gem install gemcutter
|
|
50
|
+
$ gem tumble
|
|
51
|
+
|
|
52
|
+
To install the gem itself run
|
|
53
|
+
$ gem install derobo-imdb_og
|
data/Rakefile
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rake'
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'jeweler'
|
|
6
|
+
Jeweler::Tasks.new do |gem|
|
|
7
|
+
gem.name = "derobo-imdb_og"
|
|
8
|
+
gem.summary = %Q{Fork of Jon Maddox's simple library to look up movies on IMDB}
|
|
9
|
+
gem.description = %Q{Simple library to look up movies on IMDB}
|
|
10
|
+
gem.email = "rodarmy@gmail.com"
|
|
11
|
+
gem.homepage = "http://github.com/derobo/imdb"
|
|
12
|
+
gem.authors = ["Robert Mrasek","Jon Maddox"]
|
|
13
|
+
gem.add_development_dependency "shoulda"
|
|
14
|
+
gem.add_development_dependency "rcov"
|
|
15
|
+
gem.add_dependency "htmlentities"
|
|
16
|
+
gem.add_dependency "hpricot"
|
|
17
|
+
end
|
|
18
|
+
Jeweler::GemcutterTasks.new
|
|
19
|
+
rescue LoadError
|
|
20
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
require 'rake/testtask'
|
|
24
|
+
Rake::TestTask.new(:test) do |test|
|
|
25
|
+
test.libs << 'lib' << 'test'
|
|
26
|
+
test.pattern = 'test/**/*_test.rb'
|
|
27
|
+
test.verbose = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
begin
|
|
31
|
+
require 'rcov/rcovtask'
|
|
32
|
+
Rcov::RcovTask.new do |test|
|
|
33
|
+
test.libs << 'test'
|
|
34
|
+
test.pattern = 'test/**/*_test.rb'
|
|
35
|
+
test.verbose = true
|
|
36
|
+
end
|
|
37
|
+
rescue LoadError
|
|
38
|
+
task :rcov do
|
|
39
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
task :test => :check_dependencies
|
|
44
|
+
|
|
45
|
+
task :default => :test
|
|
46
|
+
|
|
47
|
+
require 'rake/rdoctask'
|
|
48
|
+
Rake::RDocTask.new do |rdoc|
|
|
49
|
+
if File.exist?('VERSION')
|
|
50
|
+
version = File.read('VERSION')
|
|
51
|
+
else
|
|
52
|
+
version = ""
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
56
|
+
rdoc.title = "imdb_gem #{version}"
|
|
57
|
+
rdoc.rdoc_files.include('README*')
|
|
58
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
59
|
+
end
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.5.2
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = %q{derobo-imdb_og}
|
|
8
|
+
s.version = "0.5.2"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Robert Mrasek", "Jon Maddox"]
|
|
12
|
+
s.date = %q{2009-12-01}
|
|
13
|
+
s.description = %q{Simple library to look up movies on IMDB}
|
|
14
|
+
s.email = %q{rodarmy@gmail.com}
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"README.rdoc"
|
|
18
|
+
]
|
|
19
|
+
s.files = [
|
|
20
|
+
".gitignore",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
"README.rdoc",
|
|
23
|
+
"Rakefile",
|
|
24
|
+
"VERSION",
|
|
25
|
+
"derobo-imdb_og.gemspec",
|
|
26
|
+
"lib/imdb.rb",
|
|
27
|
+
"lib/imdb/imdb.rb",
|
|
28
|
+
"lib/imdb/imdb_company.rb",
|
|
29
|
+
"lib/imdb/imdb_genre.rb",
|
|
30
|
+
"lib/imdb/imdb_movie.rb",
|
|
31
|
+
"lib/imdb/imdb_name.rb",
|
|
32
|
+
"lib/imdb/patches.rb",
|
|
33
|
+
"test/imdb_test.rb",
|
|
34
|
+
"test/test_helper.rb"
|
|
35
|
+
]
|
|
36
|
+
s.homepage = %q{http://github.com/derobo/imdb}
|
|
37
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
|
38
|
+
s.require_paths = ["lib"]
|
|
39
|
+
s.rubygems_version = %q{1.3.5}
|
|
40
|
+
s.summary = %q{Fork of Jon Maddox's simple library to look up movies on IMDB}
|
|
41
|
+
s.test_files = [
|
|
42
|
+
"test/imdb_test.rb",
|
|
43
|
+
"test/test_helper.rb"
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
if s.respond_to? :specification_version then
|
|
47
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
48
|
+
s.specification_version = 3
|
|
49
|
+
|
|
50
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
|
51
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
|
52
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
|
53
|
+
s.add_runtime_dependency(%q<htmlentities>, [">= 0"])
|
|
54
|
+
s.add_runtime_dependency(%q<hpricot>, [">= 0"])
|
|
55
|
+
else
|
|
56
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
57
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
|
58
|
+
s.add_dependency(%q<htmlentities>, [">= 0"])
|
|
59
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
|
60
|
+
end
|
|
61
|
+
else
|
|
62
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
63
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
|
64
|
+
s.add_dependency(%q<htmlentities>, [">= 0"])
|
|
65
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
data/lib/imdb.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'hpricot'
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'date'
|
|
5
|
+
require 'cgi'
|
|
6
|
+
require 'htmlentities'
|
|
7
|
+
require 'imdb/imdb'
|
|
8
|
+
require 'imdb/imdb_company'
|
|
9
|
+
require 'imdb/imdb_movie'
|
|
10
|
+
require 'imdb/imdb_name'
|
|
11
|
+
require 'imdb/imdb_genre'
|
|
12
|
+
require 'imdb/patches'
|
data/lib/imdb/imdb.rb
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
class Imdb
|
|
2
|
+
|
|
3
|
+
IMDB_MOVIE_BASE_URL = "http://www.imdb.com/title/"
|
|
4
|
+
IMDB_NAME_BASE_URL = "http://www.imdb.com/name/"
|
|
5
|
+
IMDB_COMPANY_BASE_URL = "http://www.imdb.com/company/"
|
|
6
|
+
IMDB_GENRE_BASE_URL = "http://www.imdb.com/Sections/Genres/"
|
|
7
|
+
IMDB_SEARCH_BASE_URL = "http://imdb.com/find?s=all&q="
|
|
8
|
+
|
|
9
|
+
# Returns an Array of Hashes of {:imdb_id => String of imdb-id, :title => String of the title}.
|
|
10
|
+
#
|
|
11
|
+
# If use_akas is set alternative titles will be included in the search.
|
|
12
|
+
def self.search_movies_by_title(title, use_akas = nil)
|
|
13
|
+
document = Hpricot(open("#{IMDB_SEARCH_BASE_URL}#{CGI::escape(title)};s=tt#{";site=aka" if use_akas}").read)
|
|
14
|
+
# we got search results
|
|
15
|
+
if document.search('title').inner_text == "IMDb Title Search"
|
|
16
|
+
results = document.search('a[@href^="/title/tt"]').reject do |element|
|
|
17
|
+
element.innerHTML.strip_tags.empty?
|
|
18
|
+
end.map do |element|
|
|
19
|
+
{:imdb_id => element['href'][/tt\d+/], :title => element.innerHTML.strip_tags.unescape_html}
|
|
20
|
+
end
|
|
21
|
+
results.uniq
|
|
22
|
+
else
|
|
23
|
+
[{:imdb_id => document.search('link[@href^="http://www.imdb.com/title/tt"]').first['href'].match(/tt\d+/).to_s, :title => document.search('meta[@name="title"]').first["content"].gsub(/\(\d\d\d\d\)$/, '').strip}]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns an ImdbMovie.
|
|
28
|
+
#
|
|
29
|
+
# If fetch_releasesinfos is set alternative titles and the full releases dates will be fetched.
|
|
30
|
+
def self.find_movie_by_id(id, fetch_releaseinfos = false)
|
|
31
|
+
coder = HTMLEntities.new
|
|
32
|
+
|
|
33
|
+
data = Hpricot(open(IMDB_MOVIE_BASE_URL + id))
|
|
34
|
+
|
|
35
|
+
movie = ImdbMovie.new
|
|
36
|
+
|
|
37
|
+
movie.imdb_id = id
|
|
38
|
+
movie.title = coder.decode(data.at("meta[@name='title']")['content'].gsub(/\((\d{4}(\/[^)]*)?|[A-Z]+)\)/,'').strip)
|
|
39
|
+
|
|
40
|
+
rating_text = (data/"div.rating/div.meta/b").inner_text
|
|
41
|
+
if rating_text =~ /([\d\.]+)\/10/
|
|
42
|
+
movie.rating = $1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
movie.poster_url = data.at("div.photo/a[@name='poster']/img")['src']
|
|
47
|
+
rescue
|
|
48
|
+
movie.poster_url = nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
infos = (data/"div.info")
|
|
52
|
+
infos.each do |info|
|
|
53
|
+
info_title = (info/"h5").inner_text
|
|
54
|
+
case info_title
|
|
55
|
+
when /Directors?:/
|
|
56
|
+
movie.directors = parse_names(info)
|
|
57
|
+
when /Writers?[^:]+:/
|
|
58
|
+
movie.writers = parse_names(info)
|
|
59
|
+
when /Company:/
|
|
60
|
+
movie.company = parse_company(info)
|
|
61
|
+
when "Tagline:"
|
|
62
|
+
movie.tagline = coder.decode(parse_info(info).strip)
|
|
63
|
+
when "Runtime:"
|
|
64
|
+
movie.runtime = parse_info(info).strip
|
|
65
|
+
if (movie.runtime)
|
|
66
|
+
movie.runtime.gsub!(/^[^:]+:\s*/, '')
|
|
67
|
+
movie.runtime.gsub!(/min .*/, 'min')
|
|
68
|
+
end
|
|
69
|
+
when "Plot:"
|
|
70
|
+
movie.plot = parse_info(info).strip
|
|
71
|
+
movie.plot = movie.plot.gsub(/\s*\|\s*add synopsis$/, '')
|
|
72
|
+
movie.plot = movie.plot.gsub(/\s*\|\s*full synopsis$/, '')
|
|
73
|
+
movie.plot = movie.plot.gsub(/\s*\|\s*add summary$/, '')
|
|
74
|
+
movie.plot = movie.plot.gsub(/full summary$/, '')
|
|
75
|
+
movie.plot = movie.plot.gsub(/more$/, '')
|
|
76
|
+
movie.plot = coder.decode(movie.plot.strip)
|
|
77
|
+
when "Genre:"
|
|
78
|
+
movie.genres = parse_genres(info)
|
|
79
|
+
when "Release Date:"
|
|
80
|
+
begin
|
|
81
|
+
if (parse_info(info).strip =~ /(\d{1,2}) ([a-zA-Z]+) (\d{4})/)
|
|
82
|
+
movie.release_date = Date.parse("#{$2} #{$1}, #{$3}")
|
|
83
|
+
end
|
|
84
|
+
rescue
|
|
85
|
+
movie.release_date = nil
|
|
86
|
+
end
|
|
87
|
+
when "Certification:"
|
|
88
|
+
begin
|
|
89
|
+
movie.certification = (info/"a").map { |v| v.inner_html }.select { |v| v =~ /^USA:/ && v !~ /Unrated/ }.map { |v| v[/^USA:/]=''; v.strip }.first
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
cast = (data/"table.cast"/"tr")
|
|
95
|
+
cast.each do |cast_member|
|
|
96
|
+
actor_a = (cast_member/"td.nm").inner_html
|
|
97
|
+
actor_a =~ /name\/([^"]+)\//
|
|
98
|
+
actor_id = $1
|
|
99
|
+
actor_name = coder.decode((cast_member/"td.nm"/"a").inner_text)
|
|
100
|
+
actor_role = coder.decode((cast_member/"td.char").inner_text)
|
|
101
|
+
movie.actors = movie.actors << ImdbName.new(actor_id, actor_name, actor_role)
|
|
102
|
+
end
|
|
103
|
+
self.parse_releaseinfo(id, movie) if fetch_releaseinfos
|
|
104
|
+
movie # return movie
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
protected
|
|
110
|
+
|
|
111
|
+
def self.parse_releaseinfo(id, movie)
|
|
112
|
+
coder = HTMLEntities.new
|
|
113
|
+
data = Hpricot(open(IMDB_MOVIE_BASE_URL + id + '/releaseinfo'))
|
|
114
|
+
infos = data/"div#tn15content/table"
|
|
115
|
+
|
|
116
|
+
dates = (infos.first/'tr').map do |e| e.inner_text.squeeze(' ').gsub("\n \n", "\n").strip.split("\n ") end.compact.reject{|a| true if a.size != 2}
|
|
117
|
+
|
|
118
|
+
titles = (infos[1]/"tr").map {|e| e.inner_text.strip.split("\n\n")}.map{|a| a[1].split(" / ").map{|c| {:country => coder.decode(c), :title => coder.decode(a[0])} }}.flatten
|
|
119
|
+
|
|
120
|
+
movie.releases = {}
|
|
121
|
+
dates.each do |d|
|
|
122
|
+
title = titles.reject{|t| t[:country] != d[0] }
|
|
123
|
+
begin
|
|
124
|
+
release_date = Date.parse("#{$2} #{$1}, #{$3}") if (d[1] =~ /(\d{1,2}) ([a-zA-Z]+) (\d{4})/)
|
|
125
|
+
rescue
|
|
126
|
+
release_date = nil
|
|
127
|
+
end
|
|
128
|
+
movie.releases[d[0]] = {:date => release_date, :title => title.size > 0 ? title.first[:title] : movie.title }
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def self.parse_info(info)
|
|
133
|
+
value = info.inner_text.gsub(/\n/,'')
|
|
134
|
+
if value =~ /\:(.+)/
|
|
135
|
+
value = $1
|
|
136
|
+
end
|
|
137
|
+
value.gsub(/ more$/, '')
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def self.parse_names(info)
|
|
141
|
+
coder = HTMLEntities.new
|
|
142
|
+
|
|
143
|
+
# <a href="/name/nm0083348/">Brad Bird</a><br/><a href="/name/nm0684342/">Jan Pinkava</a> (co-director)<br/>N
|
|
144
|
+
info.inner_html.scan(/<a href="\/name\/([^"]+)\/"[^>]*>([^<]+)<\/a>( \(([^)]+)\))?/).map do |match|
|
|
145
|
+
ImdbName.new(coder.decode(match[0]), coder.decode(match[1]), coder.decode(match[3]))
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def self.parse_company(info)
|
|
150
|
+
coder = HTMLEntities.new
|
|
151
|
+
# <a href="/company/co0017902/">Pixar Animation Studios</a>
|
|
152
|
+
match = info.inner_html =~ /<a href="\/company\/([^"]+)\/">([^<]+)<\/a>/
|
|
153
|
+
ImdbCompany.new(coder.decode($1), coder.decode($2))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.parse_genres(info)
|
|
157
|
+
coder = HTMLEntities.new
|
|
158
|
+
# <a href="/Sections/Genres/Animation/">Animation</a> / <a href="/Sections/Genres/Adventure/">Adventure</a>
|
|
159
|
+
genre_links = (info/"a").find_all do |link|
|
|
160
|
+
link['href'] =~ /^\/Sections\/Genres/
|
|
161
|
+
end
|
|
162
|
+
genre_links.map do |link|
|
|
163
|
+
genre = link['href'] =~ /([^\/]+)\/$/
|
|
164
|
+
ImdbGenre.new(coder.decode($1), coder.decode($1))
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class ImdbMovie
|
|
2
|
+
attr_accessor :imdb_id, :title, :directors, :writers, :releases, :tagline, :company, :plot, :runtime, :rating, :poster_url, :release_date, :certification, :genres, :actors
|
|
3
|
+
|
|
4
|
+
def writers
|
|
5
|
+
self.instance_variable_get(:@writers) || []
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def actors
|
|
9
|
+
self.instance_variable_get(:@actors) || []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def directors
|
|
13
|
+
self.instance_variable_get(:@directors) || []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def genres
|
|
17
|
+
self.instance_variable_get(:@genres) || []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def releases
|
|
21
|
+
self.instance_variable_get(:@releases) || {}
|
|
22
|
+
end
|
|
23
|
+
end
|
data/lib/imdb/patches.rb
ADDED
data/test/imdb_test.rb
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class ImdbTest < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
context "Imdb" do
|
|
6
|
+
should "have an imdb movie base url" do
|
|
7
|
+
assert_equal "http://www.imdb.com/title/", Imdb::IMDB_MOVIE_BASE_URL
|
|
8
|
+
end
|
|
9
|
+
should "have an imdb search base url" do
|
|
10
|
+
assert_equal "http://imdb.com/find?s=all&q=", Imdb::IMDB_SEARCH_BASE_URL
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
context "when searching" do
|
|
14
|
+
context "for an ambiguous title" do
|
|
15
|
+
setup do
|
|
16
|
+
@results = Imdb.search_movies_by_title('transformers')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
should "return an array of results" do
|
|
20
|
+
assert_equal Array, @results.class
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "return an array of hashes" do
|
|
24
|
+
assert_equal Hash, @results.first.class
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
should "return an array of hashes with the right keys" do
|
|
28
|
+
assert @results.first.has_key?(:title)
|
|
29
|
+
assert @results.first.has_key?(:imdb_id)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "for a distinct title" do
|
|
34
|
+
setup do
|
|
35
|
+
@result = Imdb.search_movies_by_title('the september issue')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "return a single hash of the exact result" do
|
|
39
|
+
assert_equal Hash, @result.first.class
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "return an the correct movie title" do
|
|
43
|
+
assert @result.first.has_key?(:title)
|
|
44
|
+
assert_equal "The September Issue", @result.first[:title]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
should "return an the correct imdb id" do
|
|
48
|
+
assert @result.first.has_key?(:imdb_id)
|
|
49
|
+
assert_equal "tt1331025", @result.first[:imdb_id]
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context "when searching with akas" do
|
|
56
|
+
setup do
|
|
57
|
+
@results = Imdb.search_movies_by_title('Eine Weihnachtsgeschichte', true)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
should "return an 'A Fish Called Wanda' id " do
|
|
61
|
+
assert_equal "tt1067106", @results.reject {|r| r[:imdb_id] != "tt1067106" }.first[:imdb_id]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "ImdbMovie" do
|
|
66
|
+
context "when first created" do
|
|
67
|
+
should "not have an imdb_id" do
|
|
68
|
+
movie = ImdbMovie.new
|
|
69
|
+
assert_nil movie.imdb_id
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "after an Imdb.find_by_id returns it" do
|
|
74
|
+
setup do
|
|
75
|
+
@movie = Imdb.find_movie_by_id('tt0382932')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
should "have an imdb_id" do
|
|
79
|
+
assert_equal 'tt0382932', @movie.imdb_id
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
should "have a title" do
|
|
83
|
+
assert_equal 'Ratatouille', @movie.title
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
should "have a release date" do
|
|
87
|
+
# Fails for my, because imdb.com serves my the german release date (my ip should be the reason)
|
|
88
|
+
# assert_equal Date.new(2007, 06, 29), @movie.release_date
|
|
89
|
+
assert_equal Date.new(2007, 10, 3), @movie.release_date
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
should "have a G certification" do
|
|
93
|
+
assert_equal 'G', @movie.certification
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
should "have a company" do
|
|
97
|
+
assert_equal 'co0017902', @movie.company.imdb_id
|
|
98
|
+
assert_equal 'Pixar Animation Studios', @movie.company.name
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
should "have two directors" do
|
|
102
|
+
assert_equal 2, @movie.directors.length
|
|
103
|
+
assert_equal 'nm0083348', @movie.directors[0].imdb_id
|
|
104
|
+
assert_equal 'Brad Bird', @movie.directors[0].name
|
|
105
|
+
assert_equal '', @movie.directors[0].role
|
|
106
|
+
|
|
107
|
+
assert_equal 'nm0684342', @movie.directors[1].imdb_id
|
|
108
|
+
assert_equal 'Jan Pinkava', @movie.directors[1].name
|
|
109
|
+
assert_equal 'co-director', @movie.directors[1].role
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
should "have two writers" do
|
|
113
|
+
assert_equal 2, @movie.writers.length
|
|
114
|
+
assert_equal 'nm0083348', @movie.writers[0].imdb_id
|
|
115
|
+
assert_equal 'Brad Bird', @movie.writers[0].name
|
|
116
|
+
assert_equal 'screenplay', @movie.writers[0].role
|
|
117
|
+
|
|
118
|
+
assert_equal 'nm0684342', @movie.writers[1].imdb_id
|
|
119
|
+
assert_equal 'Jan Pinkava', @movie.writers[1].name
|
|
120
|
+
assert_equal 'story', @movie.writers[1].role
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
should "have 15 actors" do
|
|
124
|
+
assert_equal 15, @movie.actors.length
|
|
125
|
+
assert_equal 'nm0652663', @movie.actors[0].imdb_id
|
|
126
|
+
assert_equal 'Patton Oswalt', @movie.actors[0].name
|
|
127
|
+
assert_equal 'Remy (voice)', @movie.actors[0].role
|
|
128
|
+
|
|
129
|
+
assert_equal 'nm0826039', @movie.actors[14].imdb_id
|
|
130
|
+
assert_equal 'Jake Steinfeld', @movie.actors[14].name
|
|
131
|
+
assert_equal 'Git (Lab Rat) (voice)', @movie.actors[14].role
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
should "have five genres" do
|
|
135
|
+
assert_equal 4, @movie.genres.length
|
|
136
|
+
assert_equal 'Animation', @movie.genres[0].name
|
|
137
|
+
assert_equal 'Comedy', @movie.genres[1].name
|
|
138
|
+
assert_equal 'Family', @movie.genres[2].name
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
should "have a tagline" do
|
|
142
|
+
assert_equal 'Dinner is served... Summer 2007', @movie.tagline
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
should "have a rating" do
|
|
146
|
+
assert_match /\d.\d/, @movie.rating
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
should "have a poster_url" do
|
|
150
|
+
assert_match /http:\/\/.*\.jpg/, @movie.poster_url
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
should "have a runtime" do
|
|
154
|
+
assert_match /\d+ min/, @movie.runtime
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
should "have a plot" do
|
|
158
|
+
assert_equal %{Remy is a young rat in the French countryside who arrives in Paris, only to find out that his cooking idol is dead. When he makes an unusual alliance with a restaurant's new garbage boy, the culinary and personal adventures begin despite Remy's family's skepticism and the rat-hating world of humans.}, @movie.plot
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
should "return an empty array if writers is nil" do
|
|
162
|
+
@movie.writers = nil
|
|
163
|
+
assert_equal [], @movie.writers
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
should "return an empty array if directors is nil" do
|
|
167
|
+
@movie.directors = nil
|
|
168
|
+
assert_equal [], @movie.directors
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
should "return an empty array if genres is nil" do
|
|
172
|
+
@movie.genres = nil
|
|
173
|
+
assert_equal [], @movie.genres
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
context "after an Imdb.find_by_id with release fetching returns it" do
|
|
177
|
+
setup do
|
|
178
|
+
@movie = Imdb.find_movie_by_id('tt0382932', true)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
should "have releases" do
|
|
182
|
+
assert_equal 53, @movie.releases.size
|
|
183
|
+
assert_equal 'UK', @movie.releases.keys.first
|
|
184
|
+
assert_equal Date.new(2007, 10, 12), @movie.releases['UK'][:date]
|
|
185
|
+
assert_equal 'Ratatouille', @movie.releases['UK'][:title]
|
|
186
|
+
assert_equal 'Taiwan', @movie.releases.keys.last
|
|
187
|
+
assert_equal Date.new(2007, 8, 3), @movie.releases['Taiwan'][:date]
|
|
188
|
+
assert_equal 'Ratatouille', @movie.releases['Taiwan'][:title]
|
|
189
|
+
assert_equal Date.new(2007, 10, 19), @movie.releases['Poland'][:date]
|
|
190
|
+
assert_equal 'Ratatuj', @movie.releases['Poland'][:title]
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: derobo-imdb_og
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.5.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Robert Mrasek
|
|
8
|
+
- Jon Maddox
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
|
|
13
|
+
date: 2009-12-01 00:00:00 +01:00
|
|
14
|
+
default_executable:
|
|
15
|
+
dependencies:
|
|
16
|
+
- !ruby/object:Gem::Dependency
|
|
17
|
+
name: shoulda
|
|
18
|
+
type: :development
|
|
19
|
+
version_requirement:
|
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
21
|
+
requirements:
|
|
22
|
+
- - ">="
|
|
23
|
+
- !ruby/object:Gem::Version
|
|
24
|
+
version: "0"
|
|
25
|
+
version:
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rcov
|
|
28
|
+
type: :development
|
|
29
|
+
version_requirement:
|
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - ">="
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: "0"
|
|
35
|
+
version:
|
|
36
|
+
- !ruby/object:Gem::Dependency
|
|
37
|
+
name: htmlentities
|
|
38
|
+
type: :runtime
|
|
39
|
+
version_requirement:
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
requirements:
|
|
42
|
+
- - ">="
|
|
43
|
+
- !ruby/object:Gem::Version
|
|
44
|
+
version: "0"
|
|
45
|
+
version:
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: hpricot
|
|
48
|
+
type: :runtime
|
|
49
|
+
version_requirement:
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: "0"
|
|
55
|
+
version:
|
|
56
|
+
description: Simple library to look up movies on IMDB
|
|
57
|
+
email: rodarmy@gmail.com
|
|
58
|
+
executables: []
|
|
59
|
+
|
|
60
|
+
extensions: []
|
|
61
|
+
|
|
62
|
+
extra_rdoc_files:
|
|
63
|
+
- LICENSE
|
|
64
|
+
- README.rdoc
|
|
65
|
+
files:
|
|
66
|
+
- .gitignore
|
|
67
|
+
- LICENSE
|
|
68
|
+
- README.rdoc
|
|
69
|
+
- Rakefile
|
|
70
|
+
- VERSION
|
|
71
|
+
- derobo-imdb_og.gemspec
|
|
72
|
+
- lib/imdb.rb
|
|
73
|
+
- lib/imdb/imdb.rb
|
|
74
|
+
- lib/imdb/imdb_company.rb
|
|
75
|
+
- lib/imdb/imdb_genre.rb
|
|
76
|
+
- lib/imdb/imdb_movie.rb
|
|
77
|
+
- lib/imdb/imdb_name.rb
|
|
78
|
+
- lib/imdb/patches.rb
|
|
79
|
+
- test/imdb_test.rb
|
|
80
|
+
- test/test_helper.rb
|
|
81
|
+
has_rdoc: true
|
|
82
|
+
homepage: http://github.com/derobo/imdb
|
|
83
|
+
licenses: []
|
|
84
|
+
|
|
85
|
+
post_install_message:
|
|
86
|
+
rdoc_options:
|
|
87
|
+
- --charset=UTF-8
|
|
88
|
+
require_paths:
|
|
89
|
+
- lib
|
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - ">="
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: "0"
|
|
95
|
+
version:
|
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
|
+
requirements:
|
|
98
|
+
- - ">="
|
|
99
|
+
- !ruby/object:Gem::Version
|
|
100
|
+
version: "0"
|
|
101
|
+
version:
|
|
102
|
+
requirements: []
|
|
103
|
+
|
|
104
|
+
rubyforge_project:
|
|
105
|
+
rubygems_version: 1.3.5
|
|
106
|
+
signing_key:
|
|
107
|
+
specification_version: 3
|
|
108
|
+
summary: Fork of Jon Maddox's simple library to look up movies on IMDB
|
|
109
|
+
test_files:
|
|
110
|
+
- test/imdb_test.rb
|
|
111
|
+
- test/test_helper.rb
|