ruby-imdb 0.2.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/README +34 -4
- data/Rakefile +4 -2
- data/VERSION +1 -1
- data/lib/configuration.rb +22 -0
- data/lib/imdb.rb +14 -0
- data/lib/imdb/movie.rb +34 -13
- data/lib/imdb/person.rb +42 -10
- data/lib/imdb/skeleton.rb +84 -0
- data/ruby-imdb.gemspec +29 -8
- metadata +57 -10
data/.gitignore
CHANGED
data/README
CHANGED
@@ -1,9 +1,29 @@
|
|
1
|
-
|
2
|
-
-------------
|
3
|
-
[sudo] gem i ruby-imdb
|
1
|
+
== Welcome to Ruby IMDB
|
4
2
|
|
3
|
+
ruby-imdb is IMDB parsing library for Ruby.
|
5
4
|
|
6
|
-
|
5
|
+
== Features
|
6
|
+
|
7
|
+
* Dynamic Caching with MongoDB backend
|
8
|
+
* Object Oriented design
|
9
|
+
* Fast access to data
|
10
|
+
|
11
|
+
== Download
|
12
|
+
|
13
|
+
* [sudo] gem i ruby-imdb
|
14
|
+
* http://github.com/yalcin/ruby-imdb
|
15
|
+
* git clone git://github.com/yalcin/ruby-imdb.git
|
16
|
+
|
17
|
+
|
18
|
+
== Enable caching
|
19
|
+
|
20
|
+
require 'rubygems'
|
21
|
+
require 'imdb'
|
22
|
+
|
23
|
+
IMDB::Configuration.caching = true
|
24
|
+
IMDB::Configuration.db(:hostname => "localhost", :database => "imdb")
|
25
|
+
|
26
|
+
== Usage
|
7
27
|
|
8
28
|
require 'rubygems'
|
9
29
|
require 'imdb'
|
@@ -21,3 +41,13 @@ end
|
|
21
41
|
|
22
42
|
movie = IMDB::Movie.new('0120669')
|
23
43
|
p movie.poster
|
44
|
+
|
45
|
+
== Examples
|
46
|
+
|
47
|
+
Under the features directory
|
48
|
+
|
49
|
+
== Authors
|
50
|
+
* Yalcin ACIKYILDIZ (mailto:yalcin@webliyacelebi.com)
|
51
|
+
|
52
|
+
|
53
|
+
This library is released under the terms of the GNU/GPL.
|
data/Rakefile
CHANGED
@@ -10,8 +10,10 @@ begin
|
|
10
10
|
s.homepage = "http://github.com/yalcin/ruby-imdb"
|
11
11
|
s.authors = ["Yalcin Acikyildiz"]
|
12
12
|
s.files = FileList["[A-Za-z]*", "{lib,features}/**/*", ".gitignore"]
|
13
|
-
s.add_dependency "
|
14
|
-
s.add_dependency "
|
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"
|
15
17
|
end
|
16
18
|
rescue LoadError
|
17
19
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
@@ -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
CHANGED
@@ -2,7 +2,21 @@ require "cgi"
|
|
2
2
|
require "open-uri"
|
3
3
|
|
4
4
|
require "nokogiri"
|
5
|
+
require "json"
|
6
|
+
require "mongo_mapper"
|
5
7
|
|
8
|
+
|
9
|
+
class Array
|
10
|
+
def to_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"
|
6
18
|
require "imdb/search"
|
7
19
|
require "imdb/movie"
|
8
20
|
require "imdb/person"
|
21
|
+
|
22
|
+
|
data/lib/imdb/movie.rb
CHANGED
@@ -1,29 +1,50 @@
|
|
1
1
|
module IMDB
|
2
|
-
|
3
|
-
|
2
|
+
# Get movie information with IMDB movie id.
|
3
|
+
# @example Get Yahsi Bati movie title and cast listing [http://www.imdb.com/title/tt1567448/]
|
4
|
+
# m = IMDB::Movie.new('1567448')
|
5
|
+
# puts m.title
|
6
|
+
class Movie < IMDB::Skeleton
|
7
|
+
attr_accessor :link, :imdb_id
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
9
|
+
|
10
|
+
def initialize(id_of)
|
11
|
+
super("Movie", {:imdb_id => String,
|
12
|
+
:poster => String,
|
13
|
+
:title => String,
|
14
|
+
:cast => Array,
|
15
|
+
:photos => Array}, [:imdb_id])
|
16
|
+
|
17
|
+
@imdb_id = id_of
|
18
|
+
|
19
|
+
@link = "http://www.imdb.com/title/tt#{@imdb_id}"
|
8
20
|
end
|
9
|
-
|
21
|
+
|
22
|
+
# Get movie poster address
|
23
|
+
# @return [String]
|
10
24
|
def poster
|
11
25
|
doc.at("a[@name='poster'] img")['src'][/http:.+/] + '.jpg' rescue nil
|
12
26
|
end
|
13
|
-
|
27
|
+
|
28
|
+
# Get movie title
|
29
|
+
# @return [String]
|
14
30
|
def title
|
15
31
|
doc.at("//head/meta[@name='title']")["content"].split(/\(\d+\)/)[0].strip!
|
16
32
|
end
|
17
33
|
|
34
|
+
# Get movie cast listing
|
35
|
+
# @return [Array]
|
18
36
|
def cast
|
19
37
|
doc.search("table.cast tr").map do |link|
|
20
38
|
picture = link.children[0].search("img")[0]["src"] rescue nil
|
21
39
|
name = link.children[1].content rescue nil
|
40
|
+
profile_id = link.children[1].search('a[@href^="/name/nm"]').first["href"].split("nm")[1].gsub(/\//,'') rescue nil
|
22
41
|
char = link.children[3].content rescue nil
|
23
|
-
IMDB::Person.new(name, char,
|
42
|
+
IMDB::Person.new(@imdb_id, name, char, profile_id, picture) unless name.nil? and char.nil? and picture.nil? and profile_id.nil?
|
24
43
|
end
|
25
44
|
end
|
26
|
-
|
45
|
+
|
46
|
+
# Get movie photos
|
47
|
+
# @return [Array]
|
27
48
|
def photos
|
28
49
|
begin
|
29
50
|
doc.search("img").map do |img|
|
@@ -31,21 +52,21 @@ module IMDB
|
|
31
52
|
img["src"]
|
32
53
|
end
|
33
54
|
end
|
34
|
-
rescue
|
55
|
+
rescue
|
35
56
|
nil
|
36
57
|
end
|
37
58
|
end
|
38
|
-
|
59
|
+
|
39
60
|
private
|
40
|
-
|
61
|
+
|
41
62
|
def doc
|
42
63
|
if caller[0] =~ /`([^']*)'/ and $1 == "cast"
|
43
64
|
@doc = Nokogiri::HTML(open("#{@link}/fullcredits"))
|
44
65
|
else
|
45
66
|
@doc = Nokogiri::HTML(open("#{@link}"))
|
46
67
|
end
|
47
|
-
|
48
68
|
end
|
69
|
+
|
49
70
|
end # Movie
|
50
71
|
end # IMDB
|
51
72
|
|
data/lib/imdb/person.rb
CHANGED
@@ -1,13 +1,45 @@
|
|
1
1
|
module IMDB
|
2
|
-
class Person
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
class Person < IMDB::Skeleton
|
3
|
+
def initialize(imdb_id, name, char, profile, picture)
|
4
|
+
super("Person",{:imdb_id => String,
|
5
|
+
:name => String,
|
6
|
+
:char => String,
|
7
|
+
:profile => String,
|
8
|
+
:picture => String}, [:imdb_id, :profile])
|
9
|
+
@imdb_id = imdb_id
|
10
|
+
@name = name
|
11
|
+
@char = char
|
12
|
+
@profile = profile
|
13
|
+
@picture = picture
|
14
|
+
end
|
15
|
+
|
16
|
+
def imdb_id
|
17
|
+
@imdb_id
|
18
|
+
end
|
19
|
+
|
20
|
+
def name
|
21
|
+
@name
|
22
|
+
end
|
23
|
+
|
24
|
+
def char
|
25
|
+
@char
|
26
|
+
end
|
27
|
+
|
28
|
+
def profile
|
29
|
+
@profile
|
30
|
+
end
|
31
|
+
|
32
|
+
def picture
|
33
|
+
@picture
|
34
|
+
end
|
35
|
+
|
36
|
+
def profile
|
37
|
+
@profile
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"Name: #{@name} \n Char: #{@char} \n"
|
42
|
+
end
|
43
|
+
end # Person
|
12
44
|
end
|
13
45
|
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module IMDB
|
2
|
+
# Interface of IMDB data classes.
|
3
|
+
class Skeleton
|
4
|
+
attr_accessor :model, :method_names
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(model_name = "", method_names = {}, keys = [])
|
11
|
+
if IMDB::Configuration.caching
|
12
|
+
@model = Class.new do
|
13
|
+
include MongoMapper::Document
|
14
|
+
set_collection_name model_name
|
15
|
+
method_names.each { |m, t|
|
16
|
+
key m, t
|
17
|
+
}
|
18
|
+
end
|
19
|
+
class_eval do
|
20
|
+
method_names.each_key { |meth|
|
21
|
+
unless keys.include?(meth)
|
22
|
+
old_meth = "old_#{meth}".to_sym
|
23
|
+
alias_method old_meth, meth.to_sym
|
24
|
+
define_method meth do
|
25
|
+
k = keys.to_hash { |k| k; self.send(k) }
|
26
|
+
@db_query = self.model.first(k)
|
27
|
+
|
28
|
+
if @db_query.nil?
|
29
|
+
@db_query = self.model.new(keys.to_hash { |k| k; self.send(k)})
|
30
|
+
@db_query.save
|
31
|
+
end
|
32
|
+
|
33
|
+
if @db_query[meth].nil? or (@db_query[meth].length.zero? if @db_query[meth].kind_of?(Array))
|
34
|
+
|
35
|
+
a = send(old_meth)
|
36
|
+
if a.kind_of?(Array)
|
37
|
+
a.compact!
|
38
|
+
a.map! {
|
39
|
+
|c|
|
40
|
+
c.to_hash
|
41
|
+
}
|
42
|
+
@db_query[meth] = a
|
43
|
+
else
|
44
|
+
@db_query[meth] = a
|
45
|
+
end
|
46
|
+
@db_query.save
|
47
|
+
end
|
48
|
+
@db_query[meth]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@method_names = method_names
|
55
|
+
end
|
56
|
+
|
57
|
+
# Serialize method's output to json
|
58
|
+
def to_json(*a)
|
59
|
+
tmp_hash = to_hash
|
60
|
+
|
61
|
+
tmp_hash.to_json(*a)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def to_hash(*a)
|
66
|
+
tmp_hash = {}
|
67
|
+
@method_names.each_key { |x|
|
68
|
+
evaled = self.send x
|
69
|
+
if evaled.kind_of?(Array)
|
70
|
+
tmp_hash[x] = evaled.collect! {|e|
|
71
|
+
e
|
72
|
+
}
|
73
|
+
elsif evaled.kind_of?(String)
|
74
|
+
tmp_hash[x] = evaled
|
75
|
+
end
|
76
|
+
}
|
77
|
+
tmp_hash
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.json_create(o)
|
81
|
+
new(*o['data'])
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/ruby-imdb.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruby-imdb}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Yalcin Acikyildiz"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-21}
|
13
13
|
s.description = %q{Ruby IMDB Parsing Library}
|
14
14
|
s.email = %q{yalcin@webliyacelebi.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,10 +26,25 @@ Gem::Specification.new do |s|
|
|
26
26
|
"features/search.feature",
|
27
27
|
"features/step_definitions/movie_steps.rb",
|
28
28
|
"features/step_definitions/search_steps.rb",
|
29
|
+
"lib/configuration.rb",
|
30
|
+
"lib/doc/_index.html",
|
31
|
+
"lib/doc/class_list.html",
|
32
|
+
"lib/doc/css/common.css",
|
33
|
+
"lib/doc/css/full_list.css",
|
34
|
+
"lib/doc/css/style.css",
|
35
|
+
"lib/doc/file_list.html",
|
36
|
+
"lib/doc/frames.html",
|
37
|
+
"lib/doc/index.html",
|
38
|
+
"lib/doc/js/app.js",
|
39
|
+
"lib/doc/js/full_list.js",
|
40
|
+
"lib/doc/js/jquery.js",
|
41
|
+
"lib/doc/method_list.html",
|
42
|
+
"lib/doc/top-level-namespace.html",
|
29
43
|
"lib/imdb.rb",
|
30
44
|
"lib/imdb/movie.rb",
|
31
45
|
"lib/imdb/person.rb",
|
32
46
|
"lib/imdb/search.rb",
|
47
|
+
"lib/imdb/skeleton.rb",
|
33
48
|
"ruby-imdb.gemspec"
|
34
49
|
]
|
35
50
|
s.homepage = %q{http://github.com/yalcin/ruby-imdb}
|
@@ -43,15 +58,21 @@ Gem::Specification.new do |s|
|
|
43
58
|
s.specification_version = 3
|
44
59
|
|
45
60
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
46
|
-
s.add_runtime_dependency(%q<
|
47
|
-
s.add_runtime_dependency(%q<
|
61
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.1"])
|
62
|
+
s.add_runtime_dependency(%q<json>, [">= 1.4.3"])
|
63
|
+
s.add_runtime_dependency(%q<mongo>, [">= 1.0.1"])
|
64
|
+
s.add_runtime_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
48
65
|
else
|
49
|
-
s.add_dependency(%q<
|
50
|
-
s.add_dependency(%q<
|
66
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
|
67
|
+
s.add_dependency(%q<json>, [">= 1.4.3"])
|
68
|
+
s.add_dependency(%q<mongo>, [">= 1.0.1"])
|
69
|
+
s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
51
70
|
end
|
52
71
|
else
|
53
|
-
s.add_dependency(%q<
|
54
|
-
s.add_dependency(%q<
|
72
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.1"])
|
73
|
+
s.add_dependency(%q<json>, [">= 1.4.3"])
|
74
|
+
s.add_dependency(%q<mongo>, [">= 1.0.1"])
|
75
|
+
s.add_dependency(%q<mongo_mapper>, [">= 0.7.5"])
|
55
76
|
end
|
56
77
|
end
|
57
78
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 6
|
8
|
+
- 0
|
9
|
+
version: 0.6.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Yalcin Acikyildiz
|
@@ -14,33 +14,65 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-21 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: nokogiri
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
|
-
-
|
29
|
-
|
28
|
+
- 1
|
29
|
+
- 4
|
30
|
+
- 1
|
31
|
+
version: 1.4.1
|
30
32
|
type: :runtime
|
31
33
|
version_requirements: *id001
|
32
34
|
- !ruby/object:Gem::Dependency
|
33
|
-
name:
|
35
|
+
name: json
|
34
36
|
prerelease: false
|
35
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
36
38
|
requirements:
|
37
39
|
- - ">="
|
38
40
|
- !ruby/object:Gem::Version
|
39
41
|
segments:
|
40
|
-
-
|
41
|
-
|
42
|
+
- 1
|
43
|
+
- 4
|
44
|
+
- 3
|
45
|
+
version: 1.4.3
|
42
46
|
type: :runtime
|
43
47
|
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: mongo
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 0
|
58
|
+
- 1
|
59
|
+
version: 1.0.1
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: mongo_mapper
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 7
|
72
|
+
- 5
|
73
|
+
version: 0.7.5
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
44
76
|
description: Ruby IMDB Parsing Library
|
45
77
|
email: yalcin@webliyacelebi.com
|
46
78
|
executables: []
|
@@ -60,10 +92,25 @@ files:
|
|
60
92
|
- features/search.feature
|
61
93
|
- features/step_definitions/movie_steps.rb
|
62
94
|
- features/step_definitions/search_steps.rb
|
95
|
+
- lib/configuration.rb
|
96
|
+
- lib/doc/_index.html
|
97
|
+
- lib/doc/class_list.html
|
98
|
+
- lib/doc/css/common.css
|
99
|
+
- lib/doc/css/full_list.css
|
100
|
+
- lib/doc/css/style.css
|
101
|
+
- lib/doc/file_list.html
|
102
|
+
- lib/doc/frames.html
|
103
|
+
- lib/doc/index.html
|
104
|
+
- lib/doc/js/app.js
|
105
|
+
- lib/doc/js/full_list.js
|
106
|
+
- lib/doc/js/jquery.js
|
107
|
+
- lib/doc/method_list.html
|
108
|
+
- lib/doc/top-level-namespace.html
|
63
109
|
- lib/imdb.rb
|
64
110
|
- lib/imdb/movie.rb
|
65
111
|
- lib/imdb/person.rb
|
66
112
|
- lib/imdb/search.rb
|
113
|
+
- lib/imdb/skeleton.rb
|
67
114
|
- ruby-imdb.gemspec
|
68
115
|
has_rdoc: true
|
69
116
|
homepage: http://github.com/yalcin/ruby-imdb
|