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.
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README +1 -0
- data/Rakefile +1 -0
- data/lib/moviemeter.rb +12 -0
- data/lib/moviemeter/client.rb +113 -0
- data/lib/moviemeter/director.rb +17 -0
- data/lib/moviemeter/image.rb +13 -0
- data/lib/moviemeter/movie.rb +57 -0
- data/lib/moviemeter/release.rb +10 -0
- data/lib/moviemeter/review.rb +13 -0
- data/lib/moviemeter/screening.rb +11 -0
- data/lib/moviemeter/version.rb +3 -0
- data/moviemeter.gemspec +23 -0
- data/spec/config.yml.default +1 -0
- data/spec/moviemeter_spec.rb +124 -0
- data/spec/spec_helper.rb +12 -0
- metadata +82 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Simple library to talk to the MovieMeter API (Dutch)
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/moviemeter.rb
ADDED
@@ -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,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
|
data/moviemeter.gemspec
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|