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