moviemeter 0.0.1

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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ spec/config.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in moviemeter.gemspec
4
+ gemspec
data/README ADDED
@@ -0,0 +1 @@
1
+ Simple library to talk to the MovieMeter API (Dutch)
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,12 @@
1
+ require "moviemeter/version"
2
+
3
+ require 'xmlrpc/client'
4
+
5
+ directory = File.expand_path(File.dirname(__FILE__))
6
+ require File.join(directory, 'moviemeter', 'client')
7
+ require File.join(directory, 'moviemeter', 'movie')
8
+ require File.join(directory, 'moviemeter', 'review')
9
+ require File.join(directory, 'moviemeter', 'screening')
10
+ require File.join(directory, 'moviemeter', 'release')
11
+ require File.join(directory, 'moviemeter', 'image')
12
+ require File.join(directory, 'moviemeter', 'director')
@@ -0,0 +1,113 @@
1
+ module Moviemeter
2
+ class Client
3
+ attr_writer :api_key, :session_key
4
+
5
+ def initialize(api_key)
6
+ @api_key = api_key
7
+ end
8
+
9
+ def search(title)
10
+ results = rpc_client.call('film.search', session_key, title);
11
+ results.map! do |r|
12
+ {
13
+ 'id' => r['filmId'],
14
+ 'title' => r['title'],
15
+ 'alternative_title' => r['alternative_title'],
16
+ 'year' => r['year'].to_i,
17
+ 'url' => r['url'],
18
+ 'thumbnail' => r['thumbnail'],
19
+ 'rating' => r['average'].to_f,
20
+ 'votes' => r['votes_count'].to_i,
21
+ 'similarity' => r['similarity'],
22
+ 'duration' => r['duration'].to_i,
23
+ 'directors_text' => r['directors_text'],
24
+ 'actors_text' => r['actors_text'],
25
+ 'genres_text' => r['genres_text']
26
+ }
27
+ end
28
+ end
29
+
30
+ def movie_by_id(movie_id)
31
+ data = rpc_client.call("film.retrieveDetails", session_key, movie_id)
32
+ Movie.new(data, self)
33
+ end
34
+
35
+ def movie_by_imdb_id(imdb_id)
36
+ movie_id = rpc_client.call("film.retrieveByImdb", session_key, imdb_id)
37
+ movie_by_id(movie_id.to_i)
38
+ end
39
+
40
+ def imdb_info_by_movie_id(movie_id)
41
+ begin
42
+ rpc_client.call("film.retrieveImdb", session_key, movie_id)
43
+ rescue Exception => e
44
+ nil
45
+ end
46
+ end
47
+
48
+ def score_info_by_movie_id(movie_id)
49
+ rpc_client.call("film.retrieveScore", session_key, movie_id)
50
+ end
51
+
52
+ def reviews_by_movie_id(movie_id)
53
+ data = rpc_client.call("film.retrieveReviews", session_key, movie_id)
54
+ end
55
+ def review_by_id(movie_id, review_id)
56
+ rpc_client.call("film.retrieveReview", session_key, movie_id, review_id)
57
+ end
58
+
59
+ def images_by_movie_id(movie_id)
60
+ data = rpc_client.call("film.retrieveImage", session_key, movie_id)
61
+ data.map { |i| Image.new(i) }
62
+ end
63
+
64
+ def tv_guide(extended=false)
65
+ method = extended ? "film.retrieveTvAll" : "film.retrieveTv"
66
+ data = rpc_client.call(method, session_key)
67
+ data.map { |e| e[1].map! { |m| Screening.new(e[0].to_i, m, self) } }.flatten!
68
+ end
69
+
70
+ def cinema_movies
71
+ data = rpc_client.call("film.retrieveCinema", session_key)
72
+ data.map { |e| e[1].map! { |m| Release.new(e[0], m, self) } }.flatten!
73
+ end
74
+
75
+ def videos
76
+ raise "Not yet implemented"
77
+ end
78
+
79
+ def director_search(name)
80
+ directors = rpc_client.call("director.search", session_key, name)
81
+ directors.map { |d| Director.new(d, self) }
82
+ end
83
+
84
+ def director_by_id(director_id)
85
+ data = rpc_client.call("director.retrieveDetails", session_key, director_id)
86
+ data['directorId'] = director_id
87
+ Director.new(data, self)
88
+ end
89
+
90
+ def movies_by_director_id(director_id)
91
+ data = rpc_client.call("director.retrieveFilms", session_key, director_id)
92
+ data.map { |m| Movie.new(m, self) }
93
+ end
94
+
95
+ def close_session
96
+ rpc_client.call("api.closeSession", session_key)
97
+ @session_key = nil
98
+ end
99
+
100
+ private
101
+ def rpc_client
102
+ @rpc_client ||= XMLRPC::Client.new2("http://www.moviemeter.nl/ws/", nil, 60)
103
+ end
104
+
105
+ def session_key
106
+ if @session_key.nil?
107
+ response = @rpc_client.call("api.startSession", @api_key)
108
+ @session_key = response["session_key"]
109
+ end
110
+ @session_key
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,17 @@
1
+ module Moviemeter
2
+ class Director
3
+ attr_reader :id, :url, :name
4
+
5
+ def initialize(values, client)
6
+ @client = client
7
+
8
+ @id = values['directorId'].to_i unless values['directorId'].nil?
9
+ @url = values['url']
10
+ @name = values['name']
11
+ end
12
+
13
+ def movies
14
+ @client.movies_by_director_id(self.id)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Moviemeter
2
+ class Image
3
+ attr_reader :type, :width, :height, :filetype, :encoded_contents
4
+
5
+ def initialize(values)
6
+ @type = values[0]
7
+ @width = values[1]['width'].to_i
8
+ @height = values[1]['height'].to_i
9
+ @filetype = values[1]['filetype']
10
+ @encoded_contents = values[1]['base64_encoded_contents']
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,57 @@
1
+ module Moviemeter
2
+ class Movie
3
+ attr_reader :id, :title, :year, :reviews, :url, :alternative_titles, :plot, :actors, :duration, :directors, :countries, :genres, :cinema_dates, :video_dates, :score, :votes
4
+
5
+ def initialize(values, client)
6
+ @client = client
7
+
8
+ @id = values['filmId'].to_i
9
+ @title = values['title']
10
+ @year = values['year'].to_i
11
+ @url = values['url']
12
+ @alternative_titles = values['alternative_titles']
13
+ @plot = values['plot']
14
+ @duration = values['duration'].to_i
15
+ @actors = values['actors'].collect { |a| a['name'] } unless values['actors'].nil?
16
+ @directors = values['directors'].collect { |d| d['name'] } unless values['directors'].nil?
17
+ @countries = values['countries'].collect { |c| c['name'] } unless values['countries'].nil?
18
+ @genres = values['genres']
19
+ @cinema_dates = values['dates_cinema'].collect { |c| c['date'] } unless values['dates_cinema'].nil?
20
+ @video_dates = values['dates_video'].collect { |c| c['date'] } unless values['dates_video'].nil?
21
+ @score = values['average'].to_f
22
+ @votes = values['votes_count'].to_i
23
+ end
24
+
25
+ def reviews
26
+ @reviews ||= @client.reviews_by_movie_id(self.id)
27
+ end
28
+
29
+ # def score
30
+ # score_info['average'].to_f
31
+ # end
32
+
33
+ # def votes
34
+ # score_info['votes'].to_i
35
+ # end
36
+
37
+ # def score_info
38
+ # @score_info ||= @client.score_info_by_movie_id(self.id)
39
+ # end
40
+
41
+ def imdb_score
42
+ imdb_info['score'].to_f unless imdb_info.nil?
43
+ end
44
+
45
+ def imdb_votes
46
+ imdb_info['votes'].to_i unless imdb_info.nil?
47
+ end
48
+
49
+ def imdb_id
50
+ "tt#{imdb_info['code']}" unless imdb_info.nil?
51
+ end
52
+
53
+ def imdb_info
54
+ @imdb_info ||= @client.imdb_info_by_movie_id(self.id)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ module Moviemeter
2
+ class Release
3
+ attr_reader :date, :movie
4
+
5
+ def initialize(date, values, client)
6
+ @date = Date.strptime(date.gsub('00', '01'), '%Y-%m-%d')
7
+ @movie = Movie.new(values, client)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module Moviemeter
2
+ class Review
3
+ attr_reader :id, :username, :score, :avatar_url
4
+
5
+ def initialize(values)
6
+ @id = values['messageId'].to_i
7
+ @username = values['username']
8
+ @score = values['user_vote'].to_f
9
+ @avatar_url = values['url_avatar']
10
+ @message = values['message']
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Moviemeter
2
+ class Screening
3
+ attr_reader :time, :channel, :movie
4
+
5
+ def initialize(time, values, client)
6
+ @time = time
7
+ @movie = Movie.new(values, client)
8
+ @channel = values['channel']
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Moviemeter
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "moviemeter/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "moviemeter"
7
+ s.version = Moviemeter::VERSION
8
+ s.authors = ["Erik van der Wal"]
9
+ s.email = ["erikvdwal@gmail.com"]
10
+ s.homepage = "http://www.erikvdwal.nl/"
11
+ s.summary = %q{Simple library to talk to the MovieMeter API (Dutch)}
12
+ s.description = %q{Simple library to talk to the MovieMeter API (Dutch)}
13
+
14
+ s.rubyforge_project = "moviemeter"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rspec"
23
+ end
@@ -0,0 +1 @@
1
+ api_key: ""
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+ require 'moviemeter'
3
+
4
+ describe Moviemeter do
5
+ before(:all) do
6
+ config = YAML.load_file(File.join(File.dirname(__FILE__), "config.yml"))
7
+ @client = Moviemeter::Client.new(config['api_key'])
8
+ end
9
+
10
+ after(:all) do
11
+ @client.close_session
12
+ end
13
+
14
+ describe "search" do
15
+ it "should return results" do
16
+ results = @client.search("Inception")
17
+ results.count.should be > 0
18
+ results[0]['title'].should == "Inception"
19
+ end
20
+
21
+ it "should return no results on bogus search" do
22
+ results = @client.search("Some Bogus Title")
23
+ results.count.should == 0
24
+ end
25
+ end
26
+
27
+ describe "movie" do
28
+ it "should return movie info" do
29
+ movie = @client.movie_by_id(59666)
30
+ movie.should be_a(Moviemeter::Movie)
31
+ movie.id.should be_a(Integer)
32
+ movie.id == 59666
33
+ movie.title.should == "Inception"
34
+ movie.year.should == 2010
35
+ movie.reviews.count.should > 0
36
+ movie.imdb_id.should == "tt1375666"
37
+ movie.imdb_score.should be_a(Float)
38
+ movie.imdb_score.should > 8.0 # should be a fairly safe assumption ;-)
39
+ movie.imdb_votes.should > 0
40
+ movie.votes.should > 0
41
+ movie.score.should > 0
42
+ movie.plot.should_not be_nil
43
+ movie.countries.first.should == "Verenigde Staten"
44
+ movie.directors.first.should == "Christopher Nolan"
45
+ end
46
+
47
+ it "should return movie info by imdb id" do
48
+ movie = @client.movie_by_imdb_id("tt1375666")
49
+ movie.should be_a(Moviemeter::Movie)
50
+ movie.id == 59666
51
+ movie.title.should == "Inception"
52
+ movie.year.should == 2010
53
+ movie.reviews.count.should > 0
54
+ movie.imdb_id.should == "tt1375666"
55
+ movie.imdb_score.should > 8.0 # should be a fairly safe assumption ;-)
56
+ movie.imdb_votes.should > 0
57
+ movie.votes.should > 0
58
+ movie.score.should > 0
59
+ movie.plot.should_not be_nil
60
+ movie.countries.first.should == "Verenigde Staten"
61
+ movie.directors.first.should == "Christopher Nolan"
62
+ end
63
+
64
+ it "should handle movies without imdb info" do
65
+ movie = @client.movie_by_id(75867)
66
+ movie.title.should == "Zwarte Soldaten"
67
+ movie.imdb_id.should be_nil
68
+ movie.imdb_score.should be_nil
69
+ movie.imdb_votes.should be_nil
70
+ end
71
+
72
+ it "should return image data" do
73
+ images = @client.images_by_movie_id(59666)
74
+ images.count.should > 0
75
+ images.first.filetype.should == 'jpg'
76
+ images.first.type.should == 'image'
77
+ images.first.encoded_contents.should_not == nil
78
+ end
79
+ end
80
+
81
+ describe "tvguide" do
82
+ it "should return tv guide with screenings" do
83
+ screenings = @client.tv_guide
84
+ screenings.count.should > 0
85
+ screenings.first.should be_a(Moviemeter::Screening)
86
+ screenings.first.movie.should be_a(Moviemeter::Movie)
87
+ end
88
+
89
+ it "should retrieve extended tv guide with screenings" do
90
+ screenings = @client.tv_guide(false)
91
+ screenings_extended = @client.tv_guide(true)
92
+ screenings_extended.count.should > screenings.count
93
+ screenings_extended.first.should be_a(Moviemeter::Screening)
94
+ screenings_extended.first.movie.should be_a(Moviemeter::Movie)
95
+ end
96
+ end
97
+
98
+ describe "cinema" do
99
+ it "should return cinema movies" do
100
+ releases = @client.cinema_movies
101
+ releases.count.should > 0
102
+ releases.first.date.should be_a_kind_of(Date)
103
+ releases.first.movie.should be_a_kind_of(Moviemeter::Movie)
104
+ end
105
+ end
106
+
107
+ describe "director" do
108
+ it "should return directors on search" do
109
+ directors = @client.director_search("Christopher Nolan")
110
+ directors.count.should > 0
111
+ directors.first.should be_a(Moviemeter::Director)
112
+ directors.first.movies.count.should > 0
113
+ directors.first.movies.collect { |m| m.title }.should include "Inception"
114
+ end
115
+
116
+ it "should return one director by its id" do
117
+ director = @client.director_by_id(2128)
118
+ director.should be_a(Moviemeter::Director)
119
+ director.id.should == 2128
120
+ director.name.should == "Christopher Nolan"
121
+ end
122
+ end
123
+
124
+ end
@@ -0,0 +1,12 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+ # config.fail_fast = true
12
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moviemeter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Erik van der Wal
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Simple library to talk to the MovieMeter API (Dutch)
31
+ email:
32
+ - erikvdwal@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - .rspec
39
+ - Gemfile
40
+ - README
41
+ - Rakefile
42
+ - lib/moviemeter.rb
43
+ - lib/moviemeter/client.rb
44
+ - lib/moviemeter/director.rb
45
+ - lib/moviemeter/image.rb
46
+ - lib/moviemeter/movie.rb
47
+ - lib/moviemeter/release.rb
48
+ - lib/moviemeter/review.rb
49
+ - lib/moviemeter/screening.rb
50
+ - lib/moviemeter/version.rb
51
+ - moviemeter.gemspec
52
+ - spec/config.yml.default
53
+ - spec/moviemeter_spec.rb
54
+ - spec/spec_helper.rb
55
+ homepage: http://www.erikvdwal.nl/
56
+ licenses: []
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project: moviemeter
75
+ rubygems_version: 1.8.24
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Simple library to talk to the MovieMeter API (Dutch)
79
+ test_files:
80
+ - spec/config.yml.default
81
+ - spec/moviemeter_spec.rb
82
+ - spec/spec_helper.rb