spotlite 0.8.2 → 0.8.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +5 -5
- data/Rakefile +1 -1
- data/lib/spotlite.rb +2 -1
- data/lib/spotlite/http_client.rb +18 -0
- data/lib/spotlite/movie.rb +92 -83
- data/lib/spotlite/person.rb +32 -34
- data/lib/spotlite/string_extensions.rb +13 -13
- data/lib/spotlite/version.rb +1 -1
- data/spec/fixtures/movie_find_conan +248 -213
- data/spec/fixtures/movie_find_no_results +246 -212
- data/spec/fixtures/nm0000233/index +2139 -1374
- data/spec/fixtures/nm0005132/index +1081 -698
- data/spec/fixtures/nm0864666/index +393 -329
- data/spec/fixtures/nm1659547/index +1065 -686
- data/spec/fixtures/person_find_conan +247 -212
- data/spec/fixtures/person_find_no_results +246 -212
- data/spec/fixtures/search_name_count_50 +178 -180
- data/spec/fixtures/search_title_count_50 +251 -251
- data/spec/fixtures/tt0002186/index +2439 -492
- data/spec/fixtures/tt0047396/releaseinfo +583 -411
- data/spec/fixtures/tt0112873/index +1157 -864
- data/spec/fixtures/tt0120338/technical +353 -283
- data/spec/fixtures/tt0133093/criticreviews +329 -269
- data/spec/fixtures/tt0133093/fullcredits +1610 -893
- data/spec/fixtures/tt0133093/index +1360 -949
- data/spec/fixtures/tt0133093/keywords +5134 -1015
- data/spec/fixtures/tt0133093/mediaindex_still_frame +323 -250
- data/spec/fixtures/tt0133093/releaseinfo +579 -410
- data/spec/fixtures/tt0133093/trivia +1974 -1447
- data/spec/fixtures/tt0169547/index +1296 -901
- data/spec/fixtures/tt0317248/index +1308 -888
- data/spec/fixtures/tt1134629/fullcredits +1022 -598
- data/spec/spec_helper.rb +4 -4
- data/spec/spotlite/find_spec.rb +3 -3
- data/spec/spotlite/movie_spec.rb +48 -51
- data/spec/spotlite/person_spec.rb +25 -25
- data/spotlite.gemspec +3 -1
- metadata +32 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c105673d29a0a0bae4ea7c336e5fdaedd5cc6340
|
4
|
+
data.tar.gz: 284715b2189e721d3355e905a02e7ac88ea5abf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc9057597d1da13f16e58af1261c32952b5182ed11a125b9f85e85b9201cc624076bf358f3549ab09011cd2872e01ee14284f48174810cb30c28c99b63bb9125
|
7
|
+
data.tar.gz: 0125f5259dd412008c7ad8b22b48fca6f1c3cdf9c63d6ea3262a975d81b57f18f24ceb126c38e638dbec869a8f198b2223798d4f3915946c5e083e9ff6772ef9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## v0.8.3 14-Dec-2014
|
2
|
+
|
3
|
+
* Spotlite now uses HTTParty as HTTP client, adding `response` attribute to Movie instance
|
4
|
+
* Fixed #parse_crew method failing when crew category was missing
|
5
|
+
* Recommended movies will now include only feature films
|
6
|
+
|
1
7
|
## v0.8.2 18-Jul-2014
|
2
8
|
|
3
9
|
* Clean some junk from credits text (particularly writers credits)
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ Or install it yourself as:
|
|
38
38
|
=> [#<Spotlite::Person:0x007f96a092be70 @imdb_id="0905152", @name="Andy Wachowski", @url="http://www.imdb.com/name/nm0905152/", @credits_category="Directed by", @credits_text="(as The Wachowski Brothers)">, #<Spotlite::Person:0x007f96a092bda8 @imdb_id="0905154", @name="Lana Wachowski", @url="http://www.imdb.com/name/nm0905154/", @credits_category="Directed by", @credits_text="(as The Wachowski Brothers)">]
|
39
39
|
> movie.cast[0..2]
|
40
40
|
=> [#<Spotlite::Person:0x007f96a19521a0 @imdb_id="0000206", @name="Keanu Reeves", @url="http://www.imdb.com/name/nm0000206/", @credits_category="Cast", @credits_text="Neo">, #<Spotlite::Person:0x007f96a1951c28 @imdb_id="0000401", @name="Laurence Fishburne", @url="http://www.imdb.com/name/nm0000401/", @credits_category="Cast", @credits_text="Morpheus">, #<Spotlite::Person:0x007f96a1951a70 @imdb_id="0005251", @name="Carrie-Anne Moss", @url="http://www.imdb.com/name/nm0005251/", @credits_category="Cast", @credits_text="Trinity">]
|
41
|
-
|
41
|
+
|
42
42
|
## Important notice
|
43
43
|
|
44
44
|
Movie titles will be localized if movie has an alternative title specific to your country.
|
@@ -60,11 +60,11 @@ Sorry, there is nothing I can do about it at the moment.
|
|
60
60
|
Spotlite uses RSpec as a test framework. So, first make sure you have it installed
|
61
61
|
|
62
62
|
$ gem install rspec
|
63
|
-
|
63
|
+
|
64
64
|
Run the tests
|
65
65
|
|
66
66
|
$ rake
|
67
|
-
|
67
|
+
|
68
68
|
Spotlite uses gem FakeWeb in order to stub out HTTP responses from IMDb. These
|
69
69
|
stubs are located in `spec/fixtures` directory.
|
70
70
|
|
@@ -76,7 +76,7 @@ If you want to make a new feature that uses data from a page which is not stubbe
|
|
76
76
|
|
77
77
|
$ cd spotlite
|
78
78
|
$ curl -isH "Accept-Language: en-us" http://www.imdb.com/title/tt[IMDB_ID]/ > spec/fixtures/tt[IMDB_ID]/index
|
79
|
-
|
79
|
+
|
80
80
|
or, for example:
|
81
81
|
|
82
82
|
$ curl -isH "Accept-Language: en-us" http://www.imdb.com/title/tt[IMDB_ID]/fullcredits > spec/fixtures/tt[IMDB_ID]/fullcredits
|
@@ -89,7 +89,7 @@ expected data, or more likely, methods will return nil or empty arrays.
|
|
89
89
|
First, run tests with `LIVE_TEST=true` environment variable:
|
90
90
|
|
91
91
|
$ LIVE_TEST=true rake
|
92
|
-
|
92
|
+
|
93
93
|
Adjust methods that are failing, according to the new layout. And refresh fixtures:
|
94
94
|
|
95
95
|
$ rake refresh_fixtures
|
data/Rakefile
CHANGED
data/lib/spotlite.rb
CHANGED
@@ -2,10 +2,11 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
require "rubygems"
|
5
|
-
require "
|
5
|
+
require "httparty"
|
6
6
|
require "nokogiri"
|
7
7
|
|
8
8
|
require "spotlite/version"
|
9
|
+
require "spotlite/http_client"
|
9
10
|
require "spotlite/movie"
|
10
11
|
require "spotlite/person"
|
11
12
|
require "spotlite/string_extensions"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class HtmlParserIncluded < HTTParty::Parser
|
2
|
+
SupportedFormats.merge!('text/html' => :html)
|
3
|
+
|
4
|
+
def html
|
5
|
+
Nokogiri::HTML(body)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module Spotlite
|
10
|
+
class Client
|
11
|
+
include HTTParty
|
12
|
+
parser HtmlParserIncluded
|
13
|
+
|
14
|
+
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.77.4 (KHTML, like Gecko) Version/7.0.5 Safari/537.77.4'
|
15
|
+
|
16
|
+
headers 'Accept-Language' => 'en-US,en;q=0.5', 'User-Agent' => USER_AGENT
|
17
|
+
end
|
18
|
+
end
|
data/lib/spotlite/movie.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
1
|
module Spotlite
|
4
2
|
# Represents a movie on IMDb.com
|
5
3
|
class Movie
|
6
|
-
attr_accessor :imdb_id, :url
|
7
|
-
|
4
|
+
attr_accessor :imdb_id, :url, :response
|
5
|
+
|
8
6
|
# Initialize a new movie object by its IMDb ID as a string
|
9
7
|
#
|
10
8
|
# movie = Spotlite::Movie.new('0133093')
|
@@ -20,96 +18,97 @@ module Spotlite
|
|
20
18
|
@year = year
|
21
19
|
@url = "http://www.imdb.com/title/tt#{@imdb_id}/"
|
22
20
|
end
|
23
|
-
|
21
|
+
|
24
22
|
# Returns a list of movies as an array of +Spotlite::Movie+ objects
|
25
23
|
# Takes single parameter and searches for movies by title and alternative titles
|
26
24
|
def self.find(query)
|
27
|
-
results =
|
25
|
+
results = Spotlite::Client.get 'http://www.imdb.com/find', query: {q: query, s: 'tt', ttype: 'ft'}
|
28
26
|
results.css('.result_text').map do |result|
|
29
27
|
imdb_id = result.at('a')['href'].parse_imdb_id
|
30
28
|
title = result.at('a').text.strip
|
31
29
|
year = result.children.take(3).last.text.parse_year
|
32
|
-
|
30
|
+
|
33
31
|
[imdb_id, title, year]
|
34
32
|
end.map do |values|
|
35
33
|
self.new(*values)
|
36
34
|
end
|
37
35
|
end
|
38
|
-
|
36
|
+
|
39
37
|
# Returns a list of movies as an array of +Spotlite::Movie+ objects
|
40
38
|
# Takes optional parameters as a hash
|
41
39
|
# See https://github.com/defeed/spotlite/wiki/Advanced-movie-search for details
|
42
40
|
def self.search(params = {})
|
43
41
|
defaults = {
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
42
|
+
title_type: 'feature',
|
43
|
+
view: 'simple',
|
44
|
+
count: 250,
|
45
|
+
start: 1,
|
46
|
+
sort: 'moviemeter,asc'
|
49
47
|
}
|
50
|
-
params = defaults.merge(params)
|
51
|
-
results =
|
48
|
+
params = defaults.merge(params)
|
49
|
+
results = Spotlite::Client.get 'http://www.imdb.com/search/title', query: params
|
52
50
|
results.css('td.title').map do |result|
|
53
51
|
imdb_id = result.at('a')['href'].parse_imdb_id
|
54
52
|
title = result.at('a').text.strip
|
55
53
|
year = result.at('.year_type').text.parse_year
|
56
|
-
|
54
|
+
|
57
55
|
[imdb_id, title, year]
|
58
56
|
end.map do |values|
|
59
57
|
self.new(*values)
|
60
58
|
end
|
61
59
|
end
|
62
|
-
|
60
|
+
|
63
61
|
# Returns title as a string
|
64
62
|
def title
|
65
|
-
@title ||= details.at("h1.header span[itemprop='name']").text.strip
|
63
|
+
@title ||= details.at("h1.header span[itemprop='name']").text.strip rescue nil
|
66
64
|
end
|
67
|
-
|
65
|
+
|
68
66
|
# Returns original non-english title as a string
|
69
67
|
def original_title
|
70
68
|
details.at("h1.header span.title-extra[itemprop='name']").children.first.text.gsub('"', '').strip rescue nil
|
71
69
|
end
|
72
|
-
|
70
|
+
|
73
71
|
# Returns year of original release as an integer
|
74
72
|
def year
|
75
73
|
@year ||= details.at("h1.header a[href^='/year/']").text.parse_year rescue nil
|
76
74
|
end
|
77
|
-
|
75
|
+
|
78
76
|
# Returns IMDb rating as a float
|
79
77
|
def rating
|
80
78
|
details.at("div.star-box-details span[itemprop='ratingValue']").text.to_f rescue nil
|
81
79
|
end
|
82
|
-
|
80
|
+
|
83
81
|
# Returns Metascore rating as an integer
|
84
82
|
def metascore
|
85
83
|
details.at("div.star-box-details a[href^=criticreviews]").text.strip.split('/').first.to_i rescue nil
|
86
84
|
end
|
87
|
-
|
85
|
+
|
88
86
|
# Returns number of votes as an integer
|
89
87
|
def votes
|
90
88
|
details.at("div.star-box-details span[itemprop='ratingCount']").text.gsub(/[^\d+]/, '').to_i rescue nil
|
91
89
|
end
|
92
|
-
|
90
|
+
|
93
91
|
# Returns short description as a string
|
94
92
|
def description
|
95
|
-
details.at("p[itemprop='description']").text.strip.clean_description rescue nil
|
93
|
+
desc = details.at("p[itemprop='description']").text.strip.clean_description rescue nil
|
94
|
+
(desc.nil? || desc.empty?) ? nil : desc
|
96
95
|
end
|
97
|
-
|
96
|
+
|
98
97
|
# Returns storyline as a string. Often is the same as description
|
99
98
|
def storyline
|
100
99
|
details.at("#titleStoryLine div[itemprop='description'] p").text.strip.clean_description rescue nil
|
101
100
|
end
|
102
|
-
|
101
|
+
|
103
102
|
# Returns content rating as a string
|
104
103
|
def content_rating
|
105
104
|
details.at(".infobar span[itemprop='contentRating']")['title'] rescue nil
|
106
105
|
end
|
107
|
-
|
106
|
+
|
108
107
|
# Returns a list of genres as an array of strings
|
109
108
|
def genres
|
110
109
|
details.css("div.infobar a[href^='/genre/']").map { |genre| genre.text } rescue []
|
111
110
|
end
|
112
|
-
|
111
|
+
|
113
112
|
# Returns a list of countries as an array of hashes
|
114
113
|
# with keys: +code+ (string) and +name+ (string)
|
115
114
|
def countries
|
@@ -117,10 +116,10 @@ module Spotlite
|
|
117
116
|
details.css("div.txt-block a[href^='/country/']").each do |node|
|
118
117
|
array << {:code => node['href'].clean_href, :name => node.text.strip}
|
119
118
|
end
|
120
|
-
|
119
|
+
|
121
120
|
array
|
122
121
|
end
|
123
|
-
|
122
|
+
|
124
123
|
# Returns a list of languages as an array of hashes
|
125
124
|
# with keys: +code+ (string) and +name+ (string)
|
126
125
|
def languages
|
@@ -128,47 +127,54 @@ module Spotlite
|
|
128
127
|
details.css("div.txt-block a[href^='/language/']").each do |node|
|
129
128
|
array << {:code => node['href'].clean_href, :name => node.text.strip}
|
130
129
|
end
|
131
|
-
|
130
|
+
|
132
131
|
array
|
133
132
|
end
|
134
|
-
|
133
|
+
|
135
134
|
# Returns runtime (length) in minutes as an integer
|
136
135
|
def runtime
|
137
136
|
details.at("time[itemprop='duration']").text.gsub(',', '').to_i rescue nil
|
138
137
|
end
|
139
|
-
|
138
|
+
|
140
139
|
# Returns primary poster URL as a string
|
141
140
|
def poster_url
|
142
141
|
src = details.at('#img_primary img')['src'] rescue nil
|
143
|
-
|
142
|
+
|
144
143
|
if src =~ /^(http:.+@@)/ || src =~ /^(http:.+?)\.[^\/]+$/
|
145
144
|
$1 + '.jpg'
|
146
145
|
end
|
147
146
|
end
|
148
|
-
|
147
|
+
|
149
148
|
# Returns an array of recommended movies as an array of initialized objects of +Movie+ class
|
150
149
|
def recommended_movies
|
151
|
-
details.css('.rec-title').
|
150
|
+
details.css('.rec-title').reject do |node|
|
151
|
+
# reject movies that don't have a release year yet
|
152
|
+
node.at('span').nil?
|
153
|
+
end.reject do |node|
|
154
|
+
# reject everything other than featured film
|
155
|
+
/\d{4}-\d{4}/.match(node.at('span').text) ||
|
156
|
+
/Series|Episode|Video|Documentary|Movie|Special|Short|Game|Unknown/.match(node.at('span').text)
|
157
|
+
end.map do |node|
|
152
158
|
imdb_id = node.at("a[href^='/title/tt']")['href'].parse_imdb_id
|
153
159
|
title = node.at('a').text.strip
|
154
160
|
year = node.at('span').text.parse_year
|
155
|
-
|
161
|
+
|
156
162
|
[imdb_id, title, year]
|
157
163
|
end.map do |values|
|
158
164
|
Spotlite::Movie.new(*values)
|
159
165
|
end
|
160
166
|
end
|
161
|
-
|
167
|
+
|
162
168
|
# Returns a list of keywords as an array of strings
|
163
169
|
def keywords
|
164
170
|
plot_keywords.css("a[href^='/keyword/']").map { |keyword| keyword.text.strip } rescue []
|
165
171
|
end
|
166
|
-
|
172
|
+
|
167
173
|
# Returns a list of trivia facts as an array of strings
|
168
174
|
def trivia
|
169
175
|
movie_trivia.css("div.sodatext").map { |node| node.text.strip } rescue []
|
170
176
|
end
|
171
|
-
|
177
|
+
|
172
178
|
# Returns a list of movie alternative titles as an array of hashes
|
173
179
|
# with keys +title+ (string) and +comment+ (string)
|
174
180
|
def alternative_titles
|
@@ -177,37 +183,37 @@ module Spotlite
|
|
177
183
|
cells = row.css('td')
|
178
184
|
array << { :title => cells.last.text.strip, :comment => cells.first.text.strip }
|
179
185
|
end
|
180
|
-
|
186
|
+
|
181
187
|
array
|
182
188
|
end
|
183
|
-
|
189
|
+
|
184
190
|
# Returns a list of directors as an array of +Spotlite::Person+ objects
|
185
191
|
def directors
|
186
192
|
parse_crew('Directed by')
|
187
193
|
end
|
188
|
-
|
194
|
+
|
189
195
|
# Returns a list of writers as an array of +Spotlite::Person+ objects
|
190
196
|
def writers
|
191
197
|
parse_crew('Writing Credits')
|
192
198
|
end
|
193
|
-
|
199
|
+
|
194
200
|
# Returns a list of producers as an array of +Spotlite::Person+ objects
|
195
201
|
def producers
|
196
202
|
parse_crew('Produced by')
|
197
203
|
end
|
198
|
-
|
204
|
+
|
199
205
|
# Returns a list of starred actors as an array of +Spotlite::Person+ objects
|
200
206
|
def stars
|
201
207
|
details.css("td#overview-top div[itemprop='actors'] a[href^='/name/nm']").map do |node|
|
202
208
|
imdb_id = node['href'].parse_imdb_id
|
203
209
|
name = node.text.strip
|
204
|
-
|
210
|
+
|
205
211
|
[imdb_id, name]
|
206
212
|
end.map do |values|
|
207
213
|
Spotlite::Person.new(*values)
|
208
214
|
end
|
209
215
|
end
|
210
|
-
|
216
|
+
|
211
217
|
# Returns a list of actors as an array +Spotlite::Person+ objects
|
212
218
|
def cast
|
213
219
|
full_credits.css('table.cast_list tr').reject do |row|
|
@@ -217,16 +223,16 @@ module Spotlite
|
|
217
223
|
imdb_id = row.at('td:nth-child(2) a')['href'].parse_imdb_id
|
218
224
|
name = row.at('td:nth-child(2) a').text.strip_whitespace
|
219
225
|
credits_text = row.last_element_child.text.strip_whitespace
|
220
|
-
|
226
|
+
|
221
227
|
[imdb_id, name, 'Cast', credits_text]
|
222
228
|
end.map do |values|
|
223
229
|
Spotlite::Person.new(*values)
|
224
230
|
end
|
225
231
|
end
|
226
|
-
|
232
|
+
|
227
233
|
# Returns a list of crew members of a certain category as an array +Spotlite::Person+ objects
|
228
234
|
def parse_crew(category)
|
229
|
-
table = full_credits.search("[text()^='#{category}']").first.next_element rescue
|
235
|
+
table = full_credits.search("[text()^='#{category}']").first.next_element rescue nil
|
230
236
|
if table && table.name == 'table'
|
231
237
|
table.css('tr').reject do |row|
|
232
238
|
# Skip empty table rows with one non-braking space
|
@@ -235,34 +241,36 @@ module Spotlite
|
|
235
241
|
imdb_id = row.first_element_child.at('a')['href'].parse_imdb_id
|
236
242
|
name = row.first_element_child.at('a').text.strip_whitespace
|
237
243
|
credits_text = row.last_element_child.text.strip_whitespace.clean_credits_text
|
238
|
-
|
244
|
+
|
239
245
|
[imdb_id, name, category, credits_text]
|
240
246
|
end.map do |values|
|
241
247
|
Spotlite::Person.new(*values)
|
242
248
|
end
|
249
|
+
else
|
250
|
+
[]
|
243
251
|
end
|
244
252
|
end
|
245
|
-
|
253
|
+
|
246
254
|
# Combines all crew categories and returns an array of +Spotlite::Person+ objects
|
247
255
|
def crew
|
248
256
|
crew_categories.map{ |category| parse_crew(category) }.flatten
|
249
257
|
end
|
250
|
-
|
258
|
+
|
251
259
|
# Returns combined `cast` and `crew` as an array of +Spotlite::Person+ objects
|
252
260
|
def credits
|
253
261
|
cast + crew
|
254
262
|
end
|
255
|
-
|
263
|
+
|
256
264
|
# Returns available crew categories, e.g. "Art Department", "Writing Credits", or "Stunts", as an array of strings
|
257
265
|
def crew_categories
|
258
266
|
array = []
|
259
267
|
full_credits.css('h4.dataHeaderWithBorder').reject{ |h| h['id'] == 'cast' }.map do |node|
|
260
268
|
array << (node.children.size > 1 ? node.children.first.text.strip_whitespace : node.children.text.strip_whitespace)
|
261
269
|
end
|
262
|
-
|
270
|
+
|
263
271
|
array
|
264
272
|
end
|
265
|
-
|
273
|
+
|
266
274
|
# Returns a list of regions and corresponding release dates
|
267
275
|
# as an array of hashes with keys:
|
268
276
|
# region +code+ (string), +region+ name (string), +date+ (date), and +comment+ (string)
|
@@ -278,18 +286,18 @@ module Spotlite
|
|
278
286
|
date = cells.at('.release_date').text.strip.parse_date
|
279
287
|
comment = cells.last.text.strip.clean_release_comment
|
280
288
|
comment = nil if comment.empty?
|
281
|
-
|
289
|
+
|
282
290
|
array << {:code => code, :region => region, :date => date, :comment => comment}
|
283
291
|
end unless table.nil?
|
284
|
-
|
292
|
+
|
285
293
|
array
|
286
294
|
end
|
287
|
-
|
295
|
+
|
288
296
|
# Returns original release date as a date
|
289
297
|
def release_date
|
290
298
|
release_dates.first[:date] rescue nil
|
291
299
|
end
|
292
|
-
|
300
|
+
|
293
301
|
# Returns a list of critic reviews as an array of hashes
|
294
302
|
# with keys: +source+ (string), +author+ (string), +excerpt+ (string), and +score+ (integer)
|
295
303
|
def critic_reviews
|
@@ -299,32 +307,32 @@ module Spotlite
|
|
299
307
|
author = review.at("span[itemprop='author'] span[itemprop='name']").text
|
300
308
|
excerpt = review.at("div[itemprop='reviewbody']").text.strip
|
301
309
|
score = review.at("span[itemprop='ratingValue']").text.to_i
|
302
|
-
|
310
|
+
|
303
311
|
array << {:source => source, :author => author, :excerpt => excerpt, :score => score}
|
304
312
|
end
|
305
|
-
|
313
|
+
|
306
314
|
array
|
307
315
|
end
|
308
|
-
|
316
|
+
|
309
317
|
# Returns URLs of movie still frames as an array of strings
|
310
318
|
def images
|
311
319
|
array = []
|
312
320
|
still_frames.css('#media_index_thumbnail_grid img').map do |image|
|
313
321
|
src = image['src'] rescue nil
|
314
|
-
|
322
|
+
|
315
323
|
if src =~ /^(http:.+@@)/ || src =~ /^(http:.+?)\.[^\/]+$/
|
316
324
|
array << $1 + '.jpg'
|
317
325
|
end
|
318
326
|
end
|
319
|
-
|
327
|
+
|
320
328
|
array
|
321
329
|
end
|
322
|
-
|
330
|
+
|
323
331
|
# Returns technical information like film length, aspect ratio, cameras, etc. as a hash of arrays of strings
|
324
332
|
def technical
|
325
333
|
hash = {}
|
326
334
|
table = technical_info.at_css('#technical_content table') rescue nil
|
327
|
-
|
335
|
+
|
328
336
|
table.css('tr').map do |row|
|
329
337
|
hash[row.css('td').first.text.strip] = row.css('td').last.children.
|
330
338
|
map(&:text).
|
@@ -334,46 +342,47 @@ module Spotlite
|
|
334
342
|
slice_before{|i| /^[^\(]/.match i}.
|
335
343
|
map{|i| i.join(' ')}
|
336
344
|
end unless table.nil?
|
337
|
-
|
345
|
+
|
338
346
|
hash
|
339
347
|
end
|
340
|
-
|
348
|
+
|
341
349
|
private
|
342
|
-
|
350
|
+
|
343
351
|
def details # :nodoc:
|
344
352
|
@details ||= open_page
|
345
353
|
end
|
346
|
-
|
354
|
+
|
347
355
|
def release_info # :nodoc:
|
348
356
|
@release_info ||= open_page('releaseinfo')
|
349
357
|
end
|
350
|
-
|
358
|
+
|
351
359
|
def full_credits # :nodoc:
|
352
360
|
@full_credits ||= open_page('fullcredits')
|
353
361
|
end
|
354
|
-
|
362
|
+
|
355
363
|
def plot_keywords # :nodoc:
|
356
364
|
@plot_keywords ||= open_page('keywords')
|
357
365
|
end
|
358
|
-
|
366
|
+
|
359
367
|
def movie_trivia # :nodoc:
|
360
368
|
@movie_trivia ||= open_page('trivia')
|
361
369
|
end
|
362
|
-
|
370
|
+
|
363
371
|
def reviews
|
364
372
|
@reviews ||= open_page('criticreviews')
|
365
373
|
end
|
366
|
-
|
374
|
+
|
367
375
|
def still_frames # :nodoc:
|
368
|
-
@still_frames ||= open_page('mediaindex
|
376
|
+
@still_frames ||= open_page('mediaindex', {refine: 'still_frame'})
|
369
377
|
end
|
370
|
-
|
371
|
-
def technical_info
|
378
|
+
|
379
|
+
def technical_info # :nodoc:
|
372
380
|
@technical_info ||= open_page('technical')
|
373
381
|
end
|
374
|
-
|
375
|
-
def open_page(page = nil) # :nodoc:
|
376
|
-
|
382
|
+
|
383
|
+
def open_page(page = nil, query = {}) # :nodoc:
|
384
|
+
response = Spotlite::Client.get "#{@url}#{page}", query: query
|
385
|
+
@response = { code: response.code, message: response.message } and response
|
377
386
|
end
|
378
387
|
end
|
379
388
|
|