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 CHANGED
@@ -1,3 +1,7 @@
1
1
  .bundle
2
2
  pkg
3
3
  ruby-imdb*.gem
4
+ .idea
5
+ .yardoc
6
+ doc
7
+
data/README CHANGED
@@ -1,9 +1,29 @@
1
- Installation
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
- example:
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 "bundler"
14
- s.add_dependency "nokogiri"
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.2.2
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
- class Movie
3
- attr_accessor :link, :id
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
- def initialize(id)
6
- @id = id
7
- @link = "http://www.imdb.com/title/tt#{id}"
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, picture, picture) if name and char and picture != nil
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
- attr_accessor :name, :char, :profile, :picture
4
-
5
- def initialize(name, char, profile, picture)
6
- @name = name
7
- @char = char
8
- @profile = profile
9
- @picture = picture
10
- end
11
- end # Person
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.2.2"
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-04}
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<bundler>, [">= 0"])
47
- s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
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<bundler>, [">= 0"])
50
- s.add_dependency(%q<nokogiri>, [">= 0"])
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<bundler>, [">= 0"])
54
- s.add_dependency(%q<nokogiri>, [">= 0"])
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
- - 2
8
- - 2
9
- version: 0.2.2
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-04 00:00:00 -04:00
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: bundler
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
- - 0
29
- version: "0"
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: nokogiri
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
- - 0
41
- version: "0"
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