imdb-scan 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/LICENSE +674 -0
- data/README.md +55 -0
- data/Rakefile +22 -0
- data/VERSION +1 -0
- data/features/movie.feature +38 -0
- data/features/person.feature +11 -0
- data/features/search.feature +12 -0
- data/features/step_definitions/movie_steps.rb +94 -0
- data/features/step_definitions/person_steps.rb +48 -0
- data/features/step_definitions/search_steps.rb +33 -0
- data/imdb-scan.gemspec +48 -0
- data/lib/configuration.rb +22 -0
- data/lib/imdb.rb +22 -0
- data/lib/imdb/cast.rb +38 -0
- data/lib/imdb/movie.rb +165 -0
- data/lib/imdb/person.rb +128 -0
- data/lib/imdb/search.rb +82 -0
- data/lib/imdb/skeleton.rb +83 -0
- metadata +147 -0
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
Welcome to Ruby IMDB-SCAN
|
2
|
+
--------------------
|
3
|
+
|
4
|
+
ruby-imdb is IMDB parsing library for Ruby.
|
5
|
+
It's an upgrade from this gem: http://github.com/yalcin/ruby-imdb
|
6
|
+
|
7
|
+
Features
|
8
|
+
--------
|
9
|
+
|
10
|
+
- Object Oriented design
|
11
|
+
- Fast access to data
|
12
|
+
|
13
|
+
Download
|
14
|
+
--------
|
15
|
+
|
16
|
+
- [sudo] gem i imdb-scan
|
17
|
+
- https://github.com/oniram88/imdb-scan.git
|
18
|
+
- git clone git://github.com/oniram88/imdb-scan.git
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
Usage
|
23
|
+
-----
|
24
|
+
require 'rubygems'
|
25
|
+
require 'imdb'
|
26
|
+
|
27
|
+
s = IMDB::Search.new
|
28
|
+
s.movie("fear and loathing in las vegas").each do
|
29
|
+
|result|
|
30
|
+
movie = IMDB::Movie.new(result.id)
|
31
|
+
p movie.title
|
32
|
+
movie.cast.each do
|
33
|
+
|cast|
|
34
|
+
p "#{cast.name} as #{cast.char}"
|
35
|
+
end
|
36
|
+
p movie.poster
|
37
|
+
end
|
38
|
+
|
39
|
+
movie = IMDB::Movie.new(416320)
|
40
|
+
p movie.title => "Match Point"
|
41
|
+
p movie.cast.length => 37
|
42
|
+
p movie.cast.first.name => "Jonathan Rhys Meyers"
|
43
|
+
p movie.cast.first.char => "Chris Wilton"
|
44
|
+
p movie.cast.first.person.filmography.length => 82
|
45
|
+
p movie.director => "Woody Allen"
|
46
|
+
p movie.director_person.filmography.length => 399 (this are all Movies)
|
47
|
+
|
48
|
+
|
49
|
+
Authors
|
50
|
+
-------
|
51
|
+
- Marino Bonetti (mailto:marinobonetti@gmail.com)
|
52
|
+
|
53
|
+
|
54
|
+
This library is released under the terms of the GNU/GPL.
|
55
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "jeweler"
|
5
|
+
Jeweler::Tasks.new do |s|
|
6
|
+
s.name = "ruby-imdb"
|
7
|
+
s.summary = "Ruby IMDB Parsing Library"
|
8
|
+
s.description = s.summary
|
9
|
+
s.email = "yalcin@webliyacelebi.com"
|
10
|
+
s.homepage = "http://github.com/yalcin/ruby-imdb"
|
11
|
+
s.authors = ["Yalcin Acikyildiz"]
|
12
|
+
s.files = FileList["[A-Za-z]*", "{lib,features}/**/*", ".gitignore"]
|
13
|
+
s.add_dependency "nokogiri", ">= 1.4.1"
|
14
|
+
s.add_dependency "json", ">= 1.4.3"
|
15
|
+
s.add_dependency "mongo", ">= 1.0.1"
|
16
|
+
s.add_dependency "mongo_mapper", ">= 0.7.5"
|
17
|
+
s.add_dependency "chronic", ">= 0.2.3"
|
18
|
+
#s.add_dependency "rack", ">= 1.1.0"
|
19
|
+
end
|
20
|
+
rescue LoadError
|
21
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
22
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.7.3
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Feature: Get movie information
|
2
|
+
Scenario: Get movie information and cast list from IMDB
|
3
|
+
Given I have movie name called "Fear and Loathing In Las Vegas"
|
4
|
+
When I get first entry from result set
|
5
|
+
Then "Johnny Depp" should be act as "Raoul Duke"
|
6
|
+
And the genres should be "Adventure, Drama"
|
7
|
+
And the rating should be a number between 0 and 10
|
8
|
+
And the release year should be 1999
|
9
|
+
And the poster should be a link to an image
|
10
|
+
And the director should be "Terry Gilliam"
|
11
|
+
And the director person should be a Class of Person
|
12
|
+
And it should have many photos
|
13
|
+
And the writers should be "Hunter S. Thompson, Terry Gilliam, Tony Grisoni, Tod Davies, Alex Cox"
|
14
|
+
And the short_description should be "An oddball journalist and his psychopathic lawyer travel to Las Vegas for a series of psychadelic escapades."
|
15
|
+
And the movielength should be "118"
|
16
|
+
Scenario: Partial date: Some movies have not a full date
|
17
|
+
Given I have movie name called "Russian Roulette"
|
18
|
+
When I get first entry from result set
|
19
|
+
Then the release year should be 2010
|
20
|
+
Scenario: Some movies have no released date at all, but a year in the title
|
21
|
+
Given I have movie name called "Dr. Horrible's Sing-Along Blog"
|
22
|
+
When I get first entry from result set
|
23
|
+
Then the release year should be 2008
|
24
|
+
And the title should be "Dr. Horrible's Sing-Along Blog"
|
25
|
+
Scenario: Title of minor movies is different
|
26
|
+
Given I have movie name called "Kunpan: Legend of the Warlord"
|
27
|
+
When I get first entry from result set
|
28
|
+
Then the title should be "Kun pan"
|
29
|
+
Scenario: Whant Original Poster
|
30
|
+
Given I have movie name called "L'era glaciale 3 - L'alba dei dinosauri"
|
31
|
+
When I get first entry from result set
|
32
|
+
Then the poster should be a link to an image
|
33
|
+
And the poster should be "http://ia.media-imdb.com/images/M/MV5BMjA4NDI0Mjg4NV5BMl5BanBnXkFtZTcwOTM1NTY0Mg@@.jpg"
|
34
|
+
Scenario: Whant director name
|
35
|
+
Given I have movie with id "1067106"
|
36
|
+
Then the director should be "Robert Zemeckis"
|
37
|
+
Then the director person should be a Class of Person
|
38
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Get Person information
|
2
|
+
|
3
|
+
Scenario: Get person information and filmography list from IMDB
|
4
|
+
Given I have person with id "0000288"
|
5
|
+
When the name should be "Christian Bale"
|
6
|
+
When the films where he was actor should be "135"
|
7
|
+
When the height of the actor should be "1.83 m"
|
8
|
+
When the photo should be a link to an image
|
9
|
+
When the birth date should be "1974-01-30"
|
10
|
+
When the real name shoud be "Christian Charles Philip Bale"
|
11
|
+
When the profile path shuld be "/name/nm0000288"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Feature: Search IMDB
|
2
|
+
Scenario: Search a movie in imdb
|
3
|
+
Given I have keyword "District 9" for the search
|
4
|
+
Then the result should be equal or greater than 1
|
5
|
+
Scenario: For some unique results, imdb redirects directly to movie page, in that cases, there is no search-results page
|
6
|
+
Given I have keyword "Wo ist Fred" for the search
|
7
|
+
Then the result should be equal to 1
|
8
|
+
And the first title should be "Wo ist Fred? (2006)"
|
9
|
+
Scenario: Search a film that have many results
|
10
|
+
Given I have keyword "Match Point" for the search
|
11
|
+
Then The result 0416320 should be unique in the list
|
12
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/expectations';
|
3
|
+
rescue LoadError;
|
4
|
+
require 'spec/expectations';
|
5
|
+
end
|
6
|
+
require 'cucumber/formatter/unicode'
|
7
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
8
|
+
require 'imdb'
|
9
|
+
|
10
|
+
Before do
|
11
|
+
end
|
12
|
+
|
13
|
+
After do
|
14
|
+
end
|
15
|
+
|
16
|
+
Given /I have movie name called "(.*)"/ do |n|
|
17
|
+
@result = IMDB::Search.new.movie(n.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
Given /^I have movie with id "(.*)"/ do |n|
|
21
|
+
@movie = IMDB::Movie.new(n)
|
22
|
+
end
|
23
|
+
|
24
|
+
When /I get first entry from result set/ do
|
25
|
+
@movie = IMDB::Movie.new(@result[0].imdb_id)
|
26
|
+
end
|
27
|
+
|
28
|
+
Then /^"(.*?)" should be act as "(.*?)"$/ do |person, act_as|
|
29
|
+
@movie.cast.each do |c|
|
30
|
+
if c.name == person and c.char == act_as
|
31
|
+
c.name.should == person and c.char.should == act_as
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Then /^the genres should be "(.*?)"$/ do |arg1|
|
37
|
+
@movie.genres.should == arg1.split(/, */)
|
38
|
+
end
|
39
|
+
|
40
|
+
Then /^the rating should be a number between (\d+) and (\d+)$/ do |min, max|
|
41
|
+
@movie.rating.should be_kind_of Numeric
|
42
|
+
(min.to_f...max.to_f).should include @movie.rating
|
43
|
+
end
|
44
|
+
|
45
|
+
Then /the release year should be (\d+)/ do |year|
|
46
|
+
Date.parse(@movie.release_date).year.should == year.to_i
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
Then /^the poster should be a link to an image$/ do
|
51
|
+
@movie.poster.should be_kind_of String
|
52
|
+
@movie.poster.should =~ /^http:.*jpg$/
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
Then /^the director should be "(.*?)"$/ do |arg1|
|
57
|
+
@movie.director.should == arg1
|
58
|
+
end
|
59
|
+
|
60
|
+
Then /^the director person should be a Class of Person$/ do
|
61
|
+
@movie.director_person.should be_kind_of IMDB::Person
|
62
|
+
end
|
63
|
+
|
64
|
+
Then /^it should have many photos$/ do
|
65
|
+
@movie.photos.count.should > 3
|
66
|
+
@movie.photos.each do |photo|
|
67
|
+
photo.should =~ /^http:.*jpg$/
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
Then /^the writers should be "(.*?)"$/ do |arg1|
|
72
|
+
@movie.writers.map { |i| i.name }.join(", ").should == arg1
|
73
|
+
end
|
74
|
+
|
75
|
+
Then /^the short_description should be "(.*?)"$/ do |arg1|
|
76
|
+
@movie.short_description.should == arg1
|
77
|
+
end
|
78
|
+
|
79
|
+
Then /^the title should be "(.*)"$/ do |title|
|
80
|
+
@movie.title.should == title
|
81
|
+
end
|
82
|
+
|
83
|
+
Then /^the poster should be "(.*)"$/ do |poster|
|
84
|
+
@movie.poster.should == poster
|
85
|
+
end
|
86
|
+
|
87
|
+
Then /^the movielength should be "(.*)"$/ do |duration|
|
88
|
+
@movie.movielength.should be_kind_of Integer
|
89
|
+
@movie.movielength.should == duration.to_i
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/expectations';
|
3
|
+
rescue LoadError;
|
4
|
+
require 'spec/expectations';
|
5
|
+
end
|
6
|
+
require 'cucumber/formatter/unicode'
|
7
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
8
|
+
require 'imdb'
|
9
|
+
|
10
|
+
Before do
|
11
|
+
end
|
12
|
+
|
13
|
+
After do
|
14
|
+
end
|
15
|
+
|
16
|
+
Given /I have person with id "(.*)"/ do |n|
|
17
|
+
@result = IMDB::Person.new(n.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /^the name should be "(.*)"$/ do |name|
|
21
|
+
@result.name.should == name
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /^the films where he was actor should be "(.*)"$/ do |number|
|
25
|
+
res=@result.filmography
|
26
|
+
res.length.should == number.to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^the height of the actor should be "(.*)"$/ do |height|
|
30
|
+
@result.height.should == height.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
Then /^the photo should be a link to an image$/ do
|
34
|
+
@result.photo.should be_kind_of String
|
35
|
+
@result.photo.should =~ /^http:.*jpg$/
|
36
|
+
end
|
37
|
+
|
38
|
+
When /^the birth date should be "([^"]*)"$/ do |arg|
|
39
|
+
@result.birthdate.should == Date.parse(arg)
|
40
|
+
end
|
41
|
+
|
42
|
+
When /^the profile path shuld be "([^"]*)"$/ do |arg|
|
43
|
+
@result.profile_path.should == arg
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^the real name shoud be "([^"]*)"$/ do |arg|
|
47
|
+
@result.real_name.should == arg
|
48
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/expectations';
|
3
|
+
rescue LoadError;
|
4
|
+
require 'spec/expectations';
|
5
|
+
end
|
6
|
+
require 'cucumber/formatter/unicode'
|
7
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
8
|
+
require 'imdb'
|
9
|
+
|
10
|
+
Before do
|
11
|
+
end
|
12
|
+
|
13
|
+
After do
|
14
|
+
end
|
15
|
+
|
16
|
+
Given /I have keyword "(.*)" for the search/ do |n|
|
17
|
+
@result = IMDB::Search.new.movie(n.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /the result should be equal or greater than (\d+)/ do |result|
|
21
|
+
@result.length.should >= result.to_i
|
22
|
+
end
|
23
|
+
Then /the result should be equal to (\d+)/ do |result|
|
24
|
+
@result.length.should == result.to_i
|
25
|
+
end
|
26
|
+
Then /the first title should be "(.*)"/ do |title|
|
27
|
+
@result.first.title.should == title
|
28
|
+
end
|
29
|
+
|
30
|
+
Then /The result (\d+) should be unique in the list/ do |id|
|
31
|
+
puts @result.inspect
|
32
|
+
@result.select { |f| f.imdb_id==id }.length.should == 1
|
33
|
+
end
|
data/imdb-scan.gemspec
ADDED
@@ -0,0 +1,48 @@
|
|
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{imdb-scan}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Marino Bonetti","Yalcin Acikyildiz"]
|
12
|
+
s.date = %q{2012-09-27}
|
13
|
+
s.description = %q{Ruby IMDB Parsing Library}
|
14
|
+
s.email = %q{marinobonetti@gmail.com}
|
15
|
+
s.extra_rdoc_files = %w(LICENSE README.md)
|
16
|
+
s.files = %w(.gitignore LICENSE README.md Rakefile VERSION features/movie.feature features/person.feature features/search.feature features/step_definitions/movie_steps.rb features/step_definitions/person_steps.rb features/step_definitions/search_steps.rb lib/configuration.rb lib/imdb.rb lib/imdb/movie.rb lib/imdb/person.rb lib/imdb/search.rb lib/imdb/skeleton.rb lib/imdb/cast.rb imdb-scan.gemspec)
|
17
|
+
s.homepage = %q{http://github.com/yalcin/ruby-imdb}
|
18
|
+
s.rdoc_options = %w(--charset=UTF-8)
|
19
|
+
s.require_paths = %w(lib)
|
20
|
+
s.rubygems_version = %q{1.3.6}
|
21
|
+
s.summary = %q{Ruby IMDB Parsing Library}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.1"])
|
29
|
+
s.add_runtime_dependency(%q<json>, [">= 1.4.3"])
|
30
|
+
s.add_runtime_dependency(%q<mongo>, [">= 1.0.1"])
|
31
|
+
s.add_runtime_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
32
|
+
s.add_runtime_dependency(%q<chronic>, [">= 0.2.3"])
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
|
35
|
+
s.add_dependency(%q<json>, [">= 1.4.3"])
|
36
|
+
s.add_dependency(%q<mongo>, [">= 1.0.1"])
|
37
|
+
s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
38
|
+
s.add_dependency(%q<chronic>, [">= 0.2.3"])
|
39
|
+
end
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
|
42
|
+
s.add_dependency(%q<json>, [">= 1.4.3"])
|
43
|
+
s.add_dependency(%q<mongo>, [">= 1.0.1"])
|
44
|
+
s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
45
|
+
s.add_dependency(%q<chronic>, [">= 0.2.3"])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module IMDB
|
2
|
+
class Configuration
|
3
|
+
class << self
|
4
|
+
def caching=(caching)
|
5
|
+
@caching = caching
|
6
|
+
end
|
7
|
+
|
8
|
+
def caching
|
9
|
+
@caching
|
10
|
+
end
|
11
|
+
|
12
|
+
def db(param={})
|
13
|
+
@db_hostname = param[:hostname]
|
14
|
+
@db_name = param[:database]
|
15
|
+
if @caching
|
16
|
+
MongoMapper.connection = Mongo::Connection.new(@db_hostname)
|
17
|
+
MongoMapper.database = @db_name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/imdb.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "cgi"
|
2
|
+
require "open-uri"
|
3
|
+
|
4
|
+
require "nokogiri"
|
5
|
+
require "json"
|
6
|
+
require "mongo_mapper"
|
7
|
+
require "chronic"
|
8
|
+
|
9
|
+
class Array
|
10
|
+
def to_imdb_hash(default=nil)
|
11
|
+
Hash[ *inject([]) { |a, value| a.push value, default || yield(value) } ]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
require "configuration"
|
17
|
+
require "imdb/skeleton"
|
18
|
+
require "imdb/search"
|
19
|
+
require "imdb/movie"
|
20
|
+
require "imdb/person"
|
21
|
+
require "imdb/cast"
|
22
|
+
|
data/lib/imdb/cast.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module IMDB
|
2
|
+
class Cast < IMDB::Skeleton
|
3
|
+
attr_accessor :movie, :person, :char
|
4
|
+
|
5
|
+
def initialize(movie, person, char)
|
6
|
+
super("Cast", { :person => Person, :movie => Movie }, [:person, :char])
|
7
|
+
@movie = movie
|
8
|
+
@person = person
|
9
|
+
@char = char
|
10
|
+
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
@person.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def char
|
17
|
+
@char
|
18
|
+
end
|
19
|
+
|
20
|
+
def imdb_id
|
21
|
+
movie.imdb_id
|
22
|
+
end
|
23
|
+
|
24
|
+
def profile
|
25
|
+
@person.profile_path
|
26
|
+
end
|
27
|
+
|
28
|
+
def picture
|
29
|
+
@person.photo
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"Name: #{name} \n Char: #{char} \n"
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|