ruby-tmdb3 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -98,8 +98,9 @@ To find out more about the information each object offers on retrieved items hav
98
98
 
99
99
  === Author & Credits
100
100
 
101
- Author:: {Irio Irineu Musskopf Junior}[mailto:iirineu@gmail.com], {Aaron Gough}[mailto:aaron@aarongough.com]
102
- Contributors:: {Alex Hayes}[https://github.com/alexhayes], {Alvaro Pereyra Rabanal}[https://github.com/xenda], {Linus Oleander}[https://github.com/oleander], {aristides}[https://github.com/aristides], {Robin Boutros}[https://github.com/niuage]
101
+ Authors:: {Irio Irineu Musskopf Junior}[mailto:iirineu@gmail.com], {Aaron Gough}[mailto:aaron@aarongough.com]
102
+ Contributors:: {Alex Hayes}[https://github.com/alexhayes], {Alvaro Pereyra Rabanal}[https://github.com/xenda], {Linus Oleander}[https://github.com/oleander], {aristides}[https://github.com/aristides], {Robin Boutros}[https://github.com/niuage], {Loïc Guitaut}[https://github.com/Flink]
103
103
 
104
104
  Copyright (c) 2012 {Irio Irineu Musskopf Junior}[http://irio.posterous.com/] ({irio.posterous.com}[http://irio.posterous.com/])
105
+
105
106
  Copyright (c) 2010 {Aaron Gough}[http://thingsaaronmade.com/] ({thingsaaronmade.com}[http://thingsaaronmade.com/]), released under the MIT license
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -10,6 +10,17 @@ class Tmdb
10
10
  @@api_key = ""
11
11
  @@default_language = "en"
12
12
  @@api_response = {}
13
+
14
+ # TODO: Should be refreshed and cached from API
15
+ CONFIGURATION = DeepOpenStruct.load({ "images" =>
16
+ {
17
+ "base_url" => "http://cf2.imgobject.com/t/p/",
18
+ "posters_sizes" => ["w92", "w154", "w185", "w342", "w500", "original"],
19
+ "backdrops_sizes" => ["w300", "w780", "w1280", "original"],
20
+ "profiles_sizes" => ["w45", "w185", "h632", "original"],
21
+ "logos_sizes" => ["w45", "w92", "w154", "w185", "w300", "w500", "original"]
22
+ }
23
+ })
13
24
 
14
25
  def self.api_key
15
26
  @@api_key
@@ -28,13 +39,15 @@ class Tmdb
28
39
  end
29
40
 
30
41
  def self.base_api_url
31
- "http://api.themoviedb.org/3/"
42
+ "http://api.themoviedb.org/3"
32
43
  end
33
44
 
34
45
  def self.api_call(method, data, language = @@default_language)
35
46
  raise ArgumentError, "Tmdb.api_key must be set before using the API" if(Tmdb.api_key.nil? || Tmdb.api_key.empty?)
36
47
  raise ArgumentError, "Invalid data." if(data.nil? || (data.class != Hash))
37
48
 
49
+ method, action = method.split '/'
50
+
38
51
  data = {
39
52
  api_key: Tmdb.api_key,
40
53
  language: language
@@ -55,21 +68,17 @@ class Tmdb
55
68
  # Construct URL for queries with id
56
69
  if data.has_key?(:id)
57
70
  uri.query_values = query_values
58
-
59
- url = Tmdb.base_api_url + method + "/" + data[:id].to_s + "?" + uri.query
60
-
61
71
  # Construct URL other queries
62
72
  else
63
73
  query_values = {
64
74
  query: CGI::escape(data[:query])
65
75
  }.merge(query_values)
66
-
67
76
  uri.query_values = query_values
68
-
69
- url = Tmdb.base_api_url + method + "?" + uri.query
70
77
  end
78
+ url = [Tmdb.base_api_url, method, data[:id], action].compact.join '/'
79
+ url_with_query = [url, uri.query].compact.join '?'
71
80
 
72
- response = Tmdb.get_url(url)
81
+ response = Tmdb.get_url(url_with_query)
73
82
  if(response.code.to_i != 200)
74
83
  raise RuntimeError, "Tmdb API returned status code '#{response.code}' for URL: '#{url}'"
75
84
  end
@@ -100,22 +109,20 @@ class Tmdb
100
109
  end
101
110
 
102
111
  def self.data_to_object(data)
103
- object = DeepOpenStruct.load(data)
112
+ object = DeepOpenStruct.load(data)
104
113
  object.raw_data = data
105
- ["posters", "backdrops", "profile"].each do |image_array_name|
106
- if(object.respond_to?(image_array_name))
107
- image_array = object.send(image_array_name)
108
- image_array.each_index do |x|
109
- image_array[x] = image_array[x].image
110
- image_array[x].instance_eval <<-EOD
111
- def self.data
112
- return Tmdb.get_url(self.url).body
113
- end
114
- EOD
114
+ ["posters", "backdrops"].each do |image_array_name|
115
+ image_array = Array object.send(image_array_name)
116
+ single_name = image_array_name.slice 0..-2 # singularize name
117
+ single_path = object.send "#{single_name}_path" # default poster/backdrop image
118
+ image_array << object.send("#{image_array_name.slice 0..-2}=", DeepOpenStruct.load({file_path: single_path}))
119
+ # build a struct containing availables sizes with their urls
120
+ image_array.each do |image|
121
+ urls = CONFIGURATION.images.send("#{image_array_name}_sizes").inject({}) do |hash, size|
122
+ hash[size] = {'url' => [CONFIGURATION.images.base_url, size, image.file_path].join}
123
+ hash
115
124
  end
116
- end
117
- if(object.profile)
118
- object.profiles = object.profile
125
+ image.sizes = DeepOpenStruct.load urls
119
126
  end
120
127
  end
121
128
  unless(object.cast.nil?)
@@ -130,4 +137,4 @@ class Tmdb
130
137
  return object
131
138
  end
132
139
 
133
- end
140
+ end
@@ -40,14 +40,22 @@ class TmdbMovie
40
40
 
41
41
  def self.new(raw_data, expand_results = false, language = nil)
42
42
  # expand the result by calling movie unless :expand_results is false or the data is already complete
43
- # (as determined by checking for the runtime property in the raw data)
44
- if(expand_results && !raw_data.has_key?("runtime"))
43
+ # (as determined by checking for the posters property in the raw data)
44
+ if(expand_results && (!raw_data.has_key?("posters") || !raw_data['releases'] || !raw_data['cast']))
45
45
  begin
46
- expanded_data = Tmdb.api_call("movie", {id: raw_data["id"].to_s}, language)
47
- rescue RuntimeError => e
48
- raise ArgumentError, "Unable to fetch expanded info for Movie ID: '#{raw_data["id"]}'" if expanded_data.nil?
46
+ movie_id = raw_data['id']
47
+ raw_data = Tmdb.api_call 'movie', { id: movie_id }, language
48
+ @images_data = Tmdb.api_call("movie/images", {id: movie_id}, language)
49
+ @releases_data = Tmdb.api_call('movie/releases', {id: movie_id}, language)
50
+ @cast_data = Tmdb.api_call('movie/casts', {id: movie_id}, language)
51
+ raw_data['posters'] = @images_data['posters']
52
+ raw_data['backdrops'] = @images_data['backdrops']
53
+ raw_data['releases'] = @releases_data['countries']
54
+ raw_data['cast'] = @cast_data['cast']
55
+ raw_data['crew'] = @cast_data['crew']
56
+ rescue => e
57
+ raise ArgumentError, "Unable to fetch expanded infos for Movie ID: '#{movie_id}'" if @images_data.nil? || @releases_data.nil? || @cast_data.nil?
49
58
  end
50
- raw_data = expanded_data
51
59
  end
52
60
  return Tmdb.data_to_object(raw_data)
53
61
  end
@@ -57,4 +65,4 @@ class TmdbMovie
57
65
  return @raw_data == other.raw_data
58
66
  end
59
67
 
60
- end
68
+ end
data/ruby-tmdb3.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ruby-tmdb3"
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Irio Irineu Musskopf Junior", "Aaron Gough"]
12
- s.date = "2012-06-19"
12
+ s.date = "2012-07-11"
13
13
  s.description = "An ActiveRecord-style API wrapper for TheMovieDB.org"
14
14
  s.email = "iirineu@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -30,8 +30,11 @@ Gem::Specification.new do |s|
30
30
  "test/fixtures/example_com.txt",
31
31
  "test/fixtures/image.jpg",
32
32
  "test/fixtures/incorrect_api_url.txt",
33
+ "test/fixtures/movie_casts.txt",
33
34
  "test/fixtures/movie_get_info.txt",
34
35
  "test/fixtures/movie_imdb_lookup.txt",
36
+ "test/fixtures/movie_posters.txt",
37
+ "test/fixtures/movie_releases.txt",
35
38
  "test/fixtures/movie_search.txt",
36
39
  "test/fixtures/person_get_info.txt",
37
40
  "test/fixtures/person_search.txt",
@@ -47,7 +50,7 @@ Gem::Specification.new do |s|
47
50
  s.homepage = "https://github.com/Irio/ruby-tmdb"
48
51
  s.rdoc_options = ["--line-numbers", "--inline-source"]
49
52
  s.require_paths = ["lib"]
50
- s.rubygems_version = "1.8.19"
53
+ s.rubygems_version = "1.8.24"
51
54
  s.summary = "An ActiveRecord-style API wrapper for TheMovieDB.org"
52
55
 
53
56
  if s.respond_to? :specification_version then
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"cast":[{"id":5472,"name":"Colin Firth","character":"Bill Haydon","order":0,"profile_path":"/gqcM1rKobitst1mZ999fRmXPjru.jpg"},{"id":2983,"name":"Mark Strong","character":"Jim Prideaux","order":1,"profile_path":"/vC1a35KBxx8f2rkMKyaik7bTOud.jpg"},{"id":2524,"name":"Tom Hardy","character":"Ricki Tarr","order":2,"profile_path":"/aYWIZ7ywOFzyK7B1HHCQj2nq8s4.jpg"},{"id":64,"name":"Gary Oldman","character":"George Smiley","order":3,"profile_path":"/kCWUeBkZ2sf8LObSpUFgRngawQb.jpg"},{"id":71580,"name":"Benedict Cumberbatch","character":"Peter Guillam","order":4,"profile_path":"/pFNkVEjlgls3e9r4PwKuN0VBLQN.jpg"},{"id":13014,"name":"Toby Jones","character":"Percy Alleline","order":5,"profile_path":"/8HDeyCbDzjeylqfDIIs8Bmv40vX.jpg"},{"id":93236,"name":"David Dencik","character":"Toby Esterhase","order":6,"profile_path":null},{"id":8785,"name":"Ciarán Hinds","character":"Roy Bland","order":7,"profile_path":"/8kOafsmtTjY5IxdDUAhFrHKALK5.jpg"},{"id":5049,"name":"John Hurt","character":"Control","order":8,"profile_path":"/zUQ7WL3xg9C532Aa8hftcJUnk9j.jpg"},{"id":42069,"name":"Zoltán Mucsi","character":"Magyar","order":9,"profile_path":"/z4S9Bg4f8gDvBtduEV3vdieHQey.jpg"},{"id":89645,"name":"Péter Kálloy Molnár","character":"Hungarian Waiter","order":10,"profile_path":null},{"id":933031,"name":"Ilona Kassai","character":"Woman in Window","order":11,"profile_path":null},{"id":82364,"name":"Imre Csuja","character":"KGB Agent","order":12,"profile_path":null},{"id":37759,"name":"Kathy Burke","character":"Connie Sachs","order":13,"profile_path":"/vqCHCywlp7HfoKBW6ZzCuQmnJx9.jpg"},{"id":1115,"name":"Stephen Graham","character":"Jerry Westerby","order":14,"profile_path":"/81VZiCA6w8nXG0UjqXCgSJare5N.jpg"},{"id":186275,"name":"Arthur Nightingale","character":"Bryant","order":15,"profile_path":null},{"id":16358,"name":"Simon McBurney","character":"Oliver Lacon","order":16,"profile_path":"/3SMFfBtmoDQncXBtICD61plB04W.jpg"},{"id":235837,"name":"Amanda Fairbank-Hynes","character":"Belinda","order":17,"profile_path":"/127xlkSaLK92NaYdStJQxWkqR1I.jpg"}],"crew":[{"id":74396,"name":"Tomas Alfredson","department":"Directing","job":"Director","profile_path":"/sRl6QzCtO7SlLspfFSvnv8u7ITi.jpg"},{"id":20422,"name":"John le Carré","department":"Writing","job":"Novel","profile_path":null},{"id":64814,"name":"Peter Straughan","department":"Writing","job":"Screenplay","profile_path":null},{"id":227094,"name":"Bridget O'Connor","department":"Writing","job":"Screenplay","profile_path":null}]}
@@ -12,4 +12,4 @@ Age: 1000
12
12
  Via: 1.1 varnish
13
13
  X-Cache: HIT
14
14
 
15
- {"adult":false,"backdrop_path":"/kftq445wZNaKEqJ9gXwYOIfI2p1.jpg","belongs_to_collection":{"id":188,"name":"Sin City","poster_path":"/mYxbfd8pZz9YTtEFRaOcQboOvMk.jpg","backdrop_path":"/wyey4NS4Z1z7293R8FFBETL6DSr.jpg"},"budget":40000000,"genres":[{"id":28,"name":"Action"},{"id":80,"name":"Crime"},{"id":18,"name":"Drama"},{"id":53,"name":"Thriller"}],"homepage":"http://www.sincitythemovie.com/","id":187,"imdb_id":"tt0401792","original_title":"Sin City","overview":"Sin City is a neo-noir crime thriller based on Frank Miller's graphic novel series of the same name.The film is primarily based on three of Miller's works: The Hard Goodbye, about a man who embarks on a brutal rampage in search of his one-time sweetheart's killer; The Big Fat Kill, which focuses on a street war between a group of prostitutes and a group of mercenaries; and That Yellow Bastard, which follows an aging police officer who protects a young woman from a grotesquely disfigured serial killer.","popularity":1993.887,"poster_path":"/eCJkepVJslq1nEtqURLaC1zLPAL.jpg","production_companies":[{"name":"Miramax Films","id":14}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2005-04-01","revenue":158733820,"runtime":124,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"There is no justice without sin.","title":"Sin City","vote_average":8.4,"vote_count":59}
15
+ {"adult":false,"backdrop_path":"/hqLNDL7ugQzAbK79uvzjIkmfDN2.jpg","belongs_to_collection":{"id":86311,"name":"The Avengers Theatrical Movie Collection","poster_path":"/hiLkVTP34V24JtzOQ22r7Uu8eMc.jpg","backdrop_path":"/xCbb3hIID1AnEOBxPzsnBXG3n2h.jpg"},"budget":140000000,"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://www.ironmanmovie.com/","id":1726,"imdb_id":"tt0371746","original_title":"Iron Man","overview":"After escaping from kidnappers using makeshift power armor, an ultrarich inventor and weapons maker turns his creation into a force for good by using it to fight crime. But his skills are stretched to the limit when he must face the evil Iron Monger.","popularity":68803.606,"poster_path":"/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg","production_companies":[{"name":"Marvel Studios","id":420}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2008-05-02","revenue":585174222,"runtime":126,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"Heroes aren't born. They're built.","title":"Iron Man","vote_average":8.4,"vote_count":103}
@@ -12,4 +12,4 @@ Age: 0
12
12
  Via: 1.1 varnish
13
13
  X-Cache: MISS
14
14
 
15
- {"adult":false,"backdrop_path":"/kftq445wZNaKEqJ9gXwYOIfI2p1.jpg","belongs_to_collection":{"id":188,"name":"Sin City","poster_path":"/mYxbfd8pZz9YTtEFRaOcQboOvMk.jpg","backdrop_path":"/wyey4NS4Z1z7293R8FFBETL6DSr.jpg"},"budget":40000000,"genres":[{"id":28,"name":"Action"},{"id":80,"name":"Crime"},{"id":18,"name":"Drama"},{"id":53,"name":"Thriller"}],"homepage":"http://www.sincitythemovie.com/","id":187,"imdb_id":"tt0401792","original_title":"Sin City","overview":"Sin City is a neo-noir crime thriller based on Frank Miller's graphic novel series of the same name.The film is primarily based on three of Miller's works: The Hard Goodbye, about a man who embarks on a brutal rampage in search of his one-time sweetheart's killer; The Big Fat Kill, which focuses on a street war between a group of prostitutes and a group of mercenaries; and That Yellow Bastard, which follows an aging police officer who protects a young woman from a grotesquely disfigured serial killer.","popularity":1993.887,"poster_path":"/eCJkepVJslq1nEtqURLaC1zLPAL.jpg","production_companies":[{"name":"Miramax Films","id":14}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2005-04-01","revenue":158733820,"runtime":124,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"There is no justice without sin.","title":"Sin City","vote_average":8.4,"vote_count":59}
15
+ {"adult":false,"backdrop_path":"/hqLNDL7ugQzAbK79uvzjIkmfDN2.jpg","belongs_to_collection":{"id":86311,"name":"The Avengers Theatrical Movie Collection","poster_path":"/hiLkVTP34V24JtzOQ22r7Uu8eMc.jpg","backdrop_path":"/xCbb3hIID1AnEOBxPzsnBXG3n2h.jpg"},"budget":140000000,"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"},{"id":878,"name":"Science Fiction"},{"id":53,"name":"Thriller"}],"homepage":"http://www.ironmanmovie.com/","id":1726,"imdb_id":"tt0371746","original_title":"Iron Man","overview":"After escaping from kidnappers using makeshift power armor, an ultrarich inventor and weapons maker turns his creation into a force for good by using it to fight crime. But his skills are stretched to the limit when he must face the evil Iron Monger.","popularity":68803.606,"poster_path":"/s2IG9qXfhJYxIttKyroYFBsHwzQ.jpg","production_companies":[{"name":"Marvel Studios","id":420}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2008-05-02","revenue":585174222,"runtime":126,"spoken_languages":[{"iso_639_1":"en","name":"English"}],"tagline":"Heroes aren't born. They're built.","title":"Iron Man","vote_average":8.4,"vote_count":103}
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"backdrops":[{"file_path":"/4rYvCgyPx8eOEMLSaeuDOPdyQvB.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":8.0,"vote_count":3},{"file_path":"/jFhMjUmxSEh9vKMgHiViEqQCmiM.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":7.5,"vote_count":1},{"file_path":"/lRrYvUwR2vwxR6Fs8PKWIOSVLkp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.75,"vote_count":2},{"file_path":"/97ib91kLwDlyB31pbqPtVYLzr2N.jpg","width":1600,"height":900,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.625,"vote_count":4},{"file_path":"/5oS5Qx6yAkdQCzLMXl5BQSCFhBI.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.5,"vote_count":5},{"file_path":"/dk6vIA6sWY11YHqIZWVlnp3CUhK.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":6.1,"vote_count":5},{"file_path":"/9M7aadoZIM1Atz3tToDjxJ6EJGa.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.833333333333333,"vote_count":6},{"file_path":"/kP09gF5nPu3OTIrhrl2x0w2LUD8.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.5,"vote_count":1},{"file_path":"/eDidONF03foKowW6MxJz7LTrLd1.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":5.166666666666667,"vote_count":3},{"file_path":"/68Hkre0dyPaz1FYEHvYWV3HoVM1.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":4.5,"vote_count":2},{"file_path":"/cXrJJLDQLKS5wsMjG4wS00tJ3Dn.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":4.0,"vote_count":1},{"file_path":"/cbcOWRsiMcAXGMxOu6klv4B20mp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":3.0,"vote_count":1},{"file_path":"/8enB6zxS4ZoOoQ52TveIgJNEnAa.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.5,"vote_count":1},{"file_path":"/i1Kl77Z2Gio4ZEVZOMLjxWhBHtI.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/me1lCjal7vHNN5J0OefN5wmaNpp.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/wCcvWWzFUSQw1dUshp53wd71eKk.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/7mrdovWse6N66LC1XqlvkLsE2sP.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/l7N9SraMyj7MtGacoGnuR0bTJNG.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/eEKCDuZAsnugIBsksNTsPjnvI4x.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":2.0,"vote_count":1},{"file_path":"/4smv3B2gorWogu5ahMJTAjG7QG1.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":1.0,"vote_count":1},{"file_path":"/okvKba6NLBW78K5UT0qtL0wwy4K.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0},{"file_path":"/ugaaNPbKF2sQAqzIOhlnSpkNpRx.jpg","width":1280,"height":720,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0},{"file_path":"/6y5YQMb38aTNdAi6Li9SWtXm2IG.jpg","width":1920,"height":1080,"iso_639_1":null,"aspect_ratio":1.78,"vote_average":0.0,"vote_count":0}],"posters":[{"file_path":"/2N3P730TYXEcNL0BO8WBuMc6yJz.jpg","width":1000,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":7.5,"vote_count":8},{"file_path":"/xXkkNXJRGEHD0QjPjHgaTtuhbZV.jpg","width":4051,"height":6001,"iso_639_1":"en","aspect_ratio":0.68,"vote_average":7.35,"vote_count":20},{"file_path":"/ggu2lYqxSAObuK82wk1TmEyyWGr.jpg","width":1000,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":6.809523809523809,"vote_count":21},{"file_path":"/u2HlQA0VFeeNBfHesLSPoWZodwe.jpg","width":1131,"height":1600,"iso_639_1":"en","aspect_ratio":0.71,"vote_average":6.690476190476191,"vote_count":21},{"file_path":"/imDQdA47IfWOL13BiRLyDu6Q2b1.jpg","width":800,"height":1200,"iso_639_1":"ru","aspect_ratio":0.67,"vote_average":5.25,"vote_count":4},{"file_path":"/3sjSl5uaNLeIa7fySK5Cz1fF5Fz.jpg","width":1400,"height":2240,"iso_639_1":"en","aspect_ratio":0.63,"vote_average":5.125,"vote_count":8},{"file_path":"/ypCnGGSgIS93aLx0GcL8DPUbTZX.jpg","width":740,"height":1046,"iso_639_1":"de","aspect_ratio":0.71,"vote_average":4.5,"vote_count":3},{"file_path":"/49ohCbedmB4S1IgpN09Fv08B5Bf.jpg","width":420,"height":600,"iso_639_1":"it","aspect_ratio":0.7,"vote_average":4.125,"vote_count":4},{"file_path":"/aADb4oVjxeTujuisL7S25Ge4J0z.jpg","width":1181,"height":1757,"iso_639_1":"pt","aspect_ratio":0.67,"vote_average":3.75,"vote_count":2},{"file_path":"/xSFqKRbhXWMOsbDMqljwntJekue.jpg","width":1012,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":2.4,"vote_count":5},{"file_path":"/t2gAZJuTZGTbMP4ymXyVFVmhh7R.jpg","width":1012,"height":1500,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":2.0,"vote_count":4},{"file_path":"/dVaaL1NwEgKXcmlMxIOab49iuya.jpg","width":1455,"height":2081,"iso_639_1":"hu","aspect_ratio":0.7,"vote_average":1.0,"vote_count":1},{"file_path":"/5rONpcG54LqtDFcLrRrfbeUilto.jpg","width":1013,"height":1500,"iso_639_1":"en","aspect_ratio":0.68,"vote_average":0.5,"vote_count":2},{"file_path":"/1fudfIPnLOFl7jJFsRYbOPisoV6.jpg","width":1500,"height":2000,"iso_639_1":"fr","aspect_ratio":0.75,"vote_average":0.0,"vote_count":0},{"file_path":"/ozKFQ9uCyxqGxeYfJfrwkPq93r9.jpg","width":800,"height":1200,"iso_639_1":"en","aspect_ratio":0.67,"vote_average":0.0,"vote_count":0},{"file_path":"/5msUg8U2S64eFBhaVfziLpnlc2i.jpg","width":423,"height":630,"iso_639_1":"da","aspect_ratio":0.67,"vote_average":0.0,"vote_count":0},{"file_path":"/tHvYtrRU9iORz96GYlxqk98FTSN.jpg","width":458,"height":660,"iso_639_1":"es","aspect_ratio":0.69,"vote_average":0.0,"vote_count":0},{"file_path":"/qwzs6DKqb00aD7GkNbyCEQQ1CES.jpg","width":600,"height":800,"iso_639_1":"fr","aspect_ratio":0.75,"vote_average":0.0,"vote_count":0}]}
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx
3
+ Date: Mon, 23 Aug 2010 16:45:21 GMT
4
+ Content-Type: text/json; charset=utf-8
5
+ Transfer-Encoding: chunked
6
+ Connection: keep-alive
7
+ Keep-Alive: timeout=20
8
+ Status: 200 OK
9
+ Cache-Control: public, max-age=21600
10
+ X-Varnish: 2542127928 2542059531
11
+ Age: 1000
12
+ Via: 1.1 varnish
13
+ X-Cache: HIT
14
+
15
+ {"id":49517,"countries":[{"iso_3166_1":"GB","certification":"15","release_date":"2011-09-16"},{"iso_3166_1":"US","certification":"R","release_date":"2011-12-09"},{"iso_3166_1":"IE","certification":"","release_date":"2011-09-16"},{"iso_3166_1":"AU","certification":"","release_date":"2011-10-27"},{"iso_3166_1":"DE","certification":"12","release_date":"2011-11-10"},{"iso_3166_1":"SE","certification":"","release_date":"2011-12-25"},{"iso_3166_1":"FR","certification":"","release_date":"2012-02-08"},{"iso_3166_1":"HU","certification":"16 éven aluliak számára nem ajánlott","release_date":"2012-01-26"},{"iso_3166_1":"CZ","certification":"","release_date":"2012-02-02"},{"iso_3166_1":"PT","certification":"M12","release_date":"2011-12-22"},{"iso_3166_1":"IT","certification":"","release_date":"2011-09-05"},{"iso_3166_1":"AT","certification":"","release_date":"2012-02-02"}]}
@@ -2,9 +2,9 @@ begin
2
2
  file_path = File.absolute_path('tmdb_api_key.txt', File.dirname(__FILE__))
3
3
 
4
4
  File.open(file_path) do |file|
5
- Tmdb.api_key = file.read
5
+ Tmdb.api_key = file.read.chomp
6
6
  end
7
7
  rescue Errno::ENOENT => e
8
8
  $stderr.puts "You need place your api key in #{file_path}"
9
9
  exit
10
- end
10
+ end
@@ -2,27 +2,39 @@ def register_api_url_stubs
2
2
  unless(TEST_LIVE_API)
3
3
 
4
4
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_search.txt")) do |file|
5
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "search/movie" + ".*")).to_return(file)
5
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/search/movie" + ".*")).to_return(file)
6
6
  end
7
7
 
8
8
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_get_info.txt")) do |file|
9
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "movie/" + ".*")).to_return(file)
9
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/movie/" + ".*")).to_return(file)
10
+ end
11
+
12
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_posters.txt")) do |file|
13
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/images')).to_return(file)
14
+ end
15
+
16
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_releases.txt")) do |file|
17
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/releases')).to_return(file)
18
+ end
19
+
20
+ File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_casts.txt")) do |file|
21
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + '/movie/\d+/casts')).to_return(file)
10
22
  end
11
23
 
12
24
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "movie_imdb_lookup.txt")) do |file|
13
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "movie/tt" + ".*")).to_return(file)
25
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/movie/tt" + ".*")).to_return(file)
14
26
  end
15
27
 
16
28
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "person_get_info.txt")) do |file|
17
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "person/" + ".*")).to_return(file)
29
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/person/" + ".*")).to_return(file)
18
30
  end
19
31
 
20
32
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "person_search.txt")) do |file|
21
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "search/person" + ".*")).to_return(file)
33
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/search/person" + ".*")).to_return(file)
22
34
  end
23
35
 
24
36
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "incorrect_api_url.txt")) do |file|
25
- stub_request(:get, Regexp.new(Tmdb.base_api_url + "Movie.blarg/" + ".*")).to_return(file)
37
+ stub_request(:get, Regexp.new(Tmdb.base_api_url + "/Movie.blarg/" + ".*")).to_return(file)
26
38
  end
27
39
 
28
40
  File.open(File.join(File.dirname(__FILE__), "..", "fixtures", "example_com.txt")) do |file|
@@ -43,4 +55,4 @@ def register_api_url_stubs
43
55
 
44
56
  stub_request(:get, 'http://thisisaurlthatdoesntexist.co.nz').to_return(:body => "", :status => 404, :headers => {'content-length' => 0})
45
57
  end
46
- end
58
+ end
@@ -35,8 +35,8 @@ class TmdbMovieTest < Test::Unit::TestCase
35
35
  end
36
36
 
37
37
  test "find by title should return the full movie data when expand_results set to true" do
38
- movie = TmdbMovie.find(:title => "Sin City", :limit => 1, :expand_results => true)
39
- assert_movie_methodized(movie, 187)
38
+ movie = TmdbMovie.find(:title => "Iron Man", :limit => 1, :expand_results => true)
39
+ assert_movie_methodized(movie, 1726)
40
40
  end
41
41
 
42
42
  test "should raise exception if no arguments supplied to find" do
@@ -105,7 +105,10 @@ class TmdbMovieTest < Test::Unit::TestCase
105
105
  end
106
106
 
107
107
  test "TmdbMovie.new should raise error if supplied with raw data for movie that doesn't exist" do
108
- Tmdb.expects(:api_call).with("movie", {id: "999999999999"}, nil).returns(nil)
108
+ Tmdb.expects(:api_call).with("movie", {id: 999999999999}, nil).returns(nil)
109
+ Tmdb.expects(:api_call).with("movie/images", {id: 999999999999}, nil).returns(nil)
110
+ Tmdb.expects(:api_call).with("movie/releases", {id: 999999999999}, nil).returns(nil)
111
+ Tmdb.expects(:api_call).with("movie/casts", {id: 999999999999}, nil).returns(nil)
109
112
  assert_raise ArgumentError do
110
113
  TmdbMovie.new({"id" => 999999999999}, true)
111
114
  end
@@ -155,4 +158,4 @@ class TmdbMovieTest < Test::Unit::TestCase
155
158
  end
156
159
  end
157
160
 
158
- end
161
+ end
@@ -31,7 +31,7 @@ class TmdbTest < Test::Unit::TestCase
31
31
  end
32
32
 
33
33
  test "should return base API url" do
34
- assert_equal "http://api.themoviedb.org/3/", Tmdb.base_api_url
34
+ assert_equal "http://api.themoviedb.org/3", Tmdb.base_api_url
35
35
  end
36
36
 
37
37
  test "get url returns a response object" do
@@ -48,7 +48,7 @@ class TmdbTest < Test::Unit::TestCase
48
48
  method = "search/movie"
49
49
  data = "hello"
50
50
  Tmdb.default_language = "es"
51
- url = Tmdb.base_api_url + method + '?api_key=' + Tmdb.api_key + '&language=' + Tmdb.default_language + '&query=' + CGI::escape(data.to_s)
51
+ url = Tmdb.base_api_url + '/' + method + '?api_key=' + Tmdb.api_key + '&language=' + Tmdb.default_language + '&query=' + CGI::escape(data.to_s)
52
52
  mock_response = stub(:code => "200", :body => '{"page":1,"results":[],"total_pages":0,"total_results":0}')
53
53
  Tmdb.expects(:get_url).with(url).returns(mock_response)
54
54
  Tmdb.api_call(method, {query: data})
@@ -58,7 +58,7 @@ class TmdbTest < Test::Unit::TestCase
58
58
  method = "movie"
59
59
  data = "hello"
60
60
  language = "blah"
61
- url = Tmdb.base_api_url + method + "?api_key=" + Tmdb.api_key + "&language=" + language + '&query=' + CGI::escape(data.to_s)
61
+ url = Tmdb.base_api_url + '/' + method + "?api_key=" + Tmdb.api_key + "&language=" + language + '&query=' + CGI::escape(data.to_s)
62
62
  mock_response = stub(:code => "200", :body => '{"page":1,"results":[],"total_pages":0,"total_results":0}')
63
63
  Tmdb.expects(:get_url).with(url).returns(mock_response)
64
64
  Tmdb.api_call(method, {query: data}, language)
@@ -92,6 +92,14 @@ class TmdbTest < Test::Unit::TestCase
92
92
  assert_not_nil result[item]
93
93
  end
94
94
  end
95
+
96
+ test "should perform movie API call with an action and return a single result" do
97
+ result = Tmdb.api_call("movie/images", {id: "187"})
98
+ assert_kind_of Hash, result
99
+ %w(posters id).each do |item|
100
+ assert_not_nil result[item]
101
+ end
102
+ end
95
103
 
96
104
  test "should perform Movie.imdbLookup API call and return a single result" do
97
105
  result = Tmdb.api_call("movie", {id: "tt0401792"})
@@ -165,9 +173,7 @@ class TmdbTest < Test::Unit::TestCase
165
173
  test_data = {
166
174
  "backdrops" => [
167
175
  {
168
- "image" => {
169
- :test => 1
170
- }
176
+ :test => 1
171
177
  }
172
178
  ]
173
179
  }
@@ -177,4 +183,4 @@ class TmdbTest < Test::Unit::TestCase
177
183
  end
178
184
  end
179
185
 
180
- end
186
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-tmdb3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-19 00:00:00.000000000 Z
13
+ date: 2012-07-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: deepopenstruct
@@ -97,8 +97,11 @@ files:
97
97
  - test/fixtures/example_com.txt
98
98
  - test/fixtures/image.jpg
99
99
  - test/fixtures/incorrect_api_url.txt
100
+ - test/fixtures/movie_casts.txt
100
101
  - test/fixtures/movie_get_info.txt
101
102
  - test/fixtures/movie_imdb_lookup.txt
103
+ - test/fixtures/movie_posters.txt
104
+ - test/fixtures/movie_releases.txt
102
105
  - test/fixtures/movie_search.txt
103
106
  - test/fixtures/person_get_info.txt
104
107
  - test/fixtures/person_search.txt