moviemeter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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