ruby-imdb 0.2.2 → 0.6.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/.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
|