onebox 1.6.9 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36f15273d10858172cd6d0b0668c25395658e891
4
- data.tar.gz: 7d0c3595d380b65c8d9295af3bf7e7776a880130
3
+ metadata.gz: da1cb3e58693506b68988b477855a2058bf0b878
4
+ data.tar.gz: 81f59c2fee6f69e6903a4d928d4eafa2ab784026
5
5
  SHA512:
6
- metadata.gz: cfba0462966d9fe253e909068eb9f0d44544241e9e5cfc854f88559aa05d798b3dbe0e6780df4a2a77809de1532c343579edeb237e1dfa23f335fa11748016a5
7
- data.tar.gz: be7b95948b00676be78a720158ed51fe446ec845c4f7a4e04e4959299d2050f2a013c2843ed76630f96f1ecf4ff4e8619c562b23c30496ea4fc79cc70e1b27c5
6
+ metadata.gz: 5ccc65c55cf7a0b6b6caf8249db8c998e53eb27d40fe3f06e54a51977a8d3b7d856d6a058615f4e85c6e040fe3f8efe79abde319228a93a006b7bbc425ad8400
7
+ data.tar.gz: 09cbb07a7b3275dffb6ddb076f07b04b806474e682c9aabd7311d9400fc280b0daa2bd4787d9be5a3f1970403aebb5c6c0baaf6f36e811e821b74454bf7e63ef
data/lib/onebox.rb CHANGED
@@ -33,8 +33,7 @@ module Onebox
33
33
  end
34
34
 
35
35
  def self.has_matcher?(url)
36
- result = Matcher.new(url).oneboxed
37
- !!result
36
+ !!Matcher.new(url).oneboxed
38
37
  end
39
38
 
40
39
  def self.options=(options)
data/lib/onebox/engine.rb CHANGED
@@ -168,3 +168,6 @@ require_relative "engine/sketchfab_onebox"
168
168
  require_relative "engine/audioboom_onebox"
169
169
  require_relative "engine/replit_onebox"
170
170
  require_relative "engine/asciinema_onebox"
171
+ require_relative "engine/mixcloud_onebox"
172
+ require_relative "engine/bandcamp_onebox"
173
+ require_relative "engine/coub_onebox"
@@ -0,0 +1,32 @@
1
+ module Onebox
2
+ module Engine
3
+ class BandCampOnebox
4
+ include Engine
5
+ include StandardEmbed
6
+
7
+ matches_regexp(/^https?:\/\/.*bandcamp\.com\/album\//)
8
+ always_https
9
+
10
+ def placeholder_html
11
+ og = get_opengraph
12
+ "<img src='#{og[:image]}' height='#{og[:video_height]}' #{Helpers.title_attr(og)}>"
13
+ end
14
+
15
+ def to_html
16
+ og = get_opengraph
17
+ src = og[:video_secure_url] || og[:video]
18
+
19
+ <<-HTML
20
+ <iframe src="#{src}"
21
+ width="#{og[:video_width]}"
22
+ height="#{og[:video_height]}"
23
+ scrolling="no"
24
+ frameborder="0"
25
+ allowfullscreen>
26
+ </iframe>
27
+ HTML
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ module Onebox
2
+ module Engine
3
+ class CoubOnebox
4
+ include Engine
5
+ include StandardEmbed
6
+
7
+ matches_regexp(/^https?:\/\/coub\.com\/view\//)
8
+ always_https
9
+
10
+ def placeholder_html
11
+ oembed = get_oembed
12
+ "<img src='#{oembed[:thumbnail_url]}' height='#{oembed[:thumbnail_height]}' width='#{oembed[:thumbnail_width]}' #{Helpers.title_attr(oembed)}>"
13
+ end
14
+
15
+ def to_html
16
+ get_oembed[:html]
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module Onebox
2
+ module Engine
3
+ class MixcloudOnebox
4
+ include Engine
5
+ include StandardEmbed
6
+
7
+ matches_regexp(/^https?:\/\/www\.mixcloud\.com\//)
8
+ always_https
9
+
10
+ def placeholder_html
11
+ oembed = get_oembed
12
+ "<img src='#{oembed[:image]}' height='#{oembed[:height]}' #{Helpers.title_attr(oembed)}>"
13
+ end
14
+
15
+ def to_html
16
+ get_oembed[:html]
17
+ end
18
+ end
19
+ end
20
+ end
@@ -22,6 +22,8 @@ module Onebox
22
22
  add_oembed_provider(/www\.meetup\.com\//, 'http://api.meetup.com/oembed')
23
23
  # In order to support Private Videos
24
24
  add_oembed_provider(/vimeo\.com\//, 'https://vimeo.com/api/oembed.json')
25
+ # NYT requires login so use oembed only
26
+ add_oembed_provider(/nytimes\.com\//, 'https://www.nytimes.com/svc/oembed/json/')
25
27
 
26
28
  def always_https?
27
29
  WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.https_hosts) || super
@@ -46,9 +48,7 @@ module Onebox
46
48
  protected
47
49
 
48
50
  def html_doc
49
- return @html_doc if @html_doc
50
- response = Onebox::Helpers.fetch_response(url)
51
- @html_doc = Nokogiri::HTML(response.body)
51
+ @html_doc ||= Nokogiri::HTML(Onebox::Helpers.fetch_response(url).body) rescue nil
52
52
  end
53
53
 
54
54
  def get_oembed
@@ -79,11 +79,13 @@ module Onebox
79
79
  oe.delete(:html) if oe[:html] && oe[:html]["wp-embedded-content"]
80
80
 
81
81
  oe
82
- rescue Errno::ECONNREFUSED, Net::HTTPError, MultiJson::LoadError
82
+ rescue Errno::ECONNREFUSED, Net::HTTPError, Net::HTTPFatalError, MultiJson::LoadError
83
83
  {}
84
84
  end
85
85
 
86
86
  def get_opengraph
87
+ return {} unless html_doc
88
+
87
89
  og = {}
88
90
 
89
91
  html_doc.css('meta').each do |m|
@@ -103,6 +105,8 @@ module Onebox
103
105
  end
104
106
 
105
107
  def get_twitter
108
+ return {} unless html_doc
109
+
106
110
  twitter = {}
107
111
 
108
112
  html_doc.css('meta').each do |m|
@@ -177,11 +177,9 @@ module Onebox
177
177
  end
178
178
 
179
179
  def self.===(other)
180
- if other.kind_of?(URI)
181
- host_matches(other, whitelist) || probable_wordpress(other) || probable_discourse(other)
182
- else
180
+ other.kind_of?(URI) ?
181
+ host_matches(other, whitelist) || probable_wordpress(other) || probable_discourse(other) :
183
182
  super
184
- end
185
183
  end
186
184
 
187
185
  def to_html
@@ -199,16 +197,25 @@ module Onebox
199
197
  @data ||= begin
200
198
  html_entities = HTMLEntities.new
201
199
  d = { link: link }.merge(raw)
200
+
202
201
  if !Onebox::Helpers.blank?(d[:title])
203
202
  d[:title] = html_entities.decode(Onebox::Helpers.truncate(d[:title].strip, 80))
204
203
  end
204
+
205
+ d[:description] ||= d[:summary]
205
206
  if !Onebox::Helpers.blank?(d[:description])
206
207
  d[:description] = html_entities.decode(Onebox::Helpers.truncate(d[:description].strip, 250))
207
208
  end
209
+
208
210
  if !Onebox::Helpers.blank?(d[:domain])
209
211
  d[:domain] = "http://#{d[:domain]}" unless d[:domain] =~ /^https?:\/\//
210
212
  d[:domain] = URI(d[:domain]).host.to_s.sub(/^www\./, '')
211
213
  end
214
+
215
+ # prefer secure URLs
216
+ d[:image] = d[:image_secure_url] || d[:image_url] || d[:thumbnail_url] || d[:image]
217
+ d[:video] = d[:video_secure_url] || d[:video_url] || d[:video]
218
+
212
219
  d
213
220
  end
214
221
  end
@@ -226,8 +233,8 @@ module Onebox
226
233
  return article_html if is_article?
227
234
  return video_html if is_video?
228
235
  return image_html if is_image?
229
- return article_html if has_text?
230
236
  return embedded_html if is_embedded?
237
+ return article_html if has_text?
231
238
  end
232
239
 
233
240
  def is_article?
@@ -247,8 +254,7 @@ module Onebox
247
254
  end
248
255
 
249
256
  def has_image?
250
- !Onebox::Helpers.blank?(data[:image]) ||
251
- !Onebox::Helpers.blank?(data[:thumbnail_url])
257
+ !Onebox::Helpers.blank?(data[:image])
252
258
  end
253
259
 
254
260
  def is_video?
@@ -269,17 +275,15 @@ module Onebox
269
275
  end
270
276
 
271
277
  def image_html
272
- src = data[:image] || data[:thumbnail_url]
273
- return if Onebox::Helpers.blank?(src)
278
+ return if Onebox::Helpers.blank?(data[:image])
274
279
 
275
280
  alt = data[:description] || data[:title]
276
281
  width = data[:image_width] || data[:thumbnail_width]
277
282
  height = data[:image_height] || data[:thumbnail_height]
278
- "<img src='#{src}' alt='#{alt}' width='#{width}' height='#{height}'>"
283
+ "<img src='#{data[:image]}' alt='#{alt}' width='#{width}' height='#{height}'>"
279
284
  end
280
285
 
281
286
  def video_html
282
- video_url = !Onebox::Helpers.blank?(data[:video_secure_url]) ? data[:video_secure_url] : data[:video]
283
287
  if data[:video_type] == "video/mp4"
284
288
  <<-HTML
285
289
  <video title='#{data[:title]}'
@@ -287,12 +291,12 @@ module Onebox
287
291
  height='#{data[:video_height]}'
288
292
  style='max-width:100%'
289
293
  controls=''>
290
- <source src='#{video_url}'>
294
+ <source src='#{data[:video]}'>
291
295
  </video>
292
296
  HTML
293
297
  else
294
298
  <<-HTML
295
- <iframe src='#{video_url}'
299
+ <iframe src='#{data[:video]}'
296
300
  title='#{data[:title]}'
297
301
  width='#{data[:video_width]}'
298
302
  height='#{data[:video_height]}'
@@ -12,15 +12,8 @@ module Onebox
12
12
 
13
13
  def oneboxed
14
14
  uri = URI(@url)
15
-
16
- # A onebox needs a path, query or fragment string to be considered
17
- return if (uri.query.nil? || uri.query.size == 0) &&
18
- (uri.fragment.nil? || uri.fragment.size == 0) &&
19
- (uri.path.size == 0 || uri.path == "/")
20
-
21
15
  ordered_engines.find { |engine| engine === uri }
22
16
  rescue URI::InvalidURIError
23
- # If it's not a valid URL, don't even match
24
17
  nil
25
18
  end
26
19
  end
@@ -1,3 +1,3 @@
1
1
  module Onebox
2
- VERSION = "1.6.9"
2
+ VERSION = "1.7.0"
3
3
  end
data/lib/onebox/web.rb CHANGED
@@ -11,6 +11,9 @@ module Onebox
11
11
  set :root, File.expand_path(File.dirname(__FILE__) + "/../../web")
12
12
  set :public_folder, Proc.new { "#{root}/assets" }
13
13
  set :views, Proc.new { "#{root}/views" }
14
+ configure :development do
15
+ enable :logging
16
+ end
14
17
 
15
18
  helpers WebHelpers
16
19
 
@@ -26,7 +26,7 @@ describe Onebox::Matcher do
26
26
 
27
27
  it "doesn't find an engine" do
28
28
  matcher.stubs(:ordered_engines).returns([TestEngine])
29
- expect(matcher.oneboxed).to be_nil
29
+ expect(matcher.oneboxed).not_to be_nil
30
30
  end
31
31
  end
32
32
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onebox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.9
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joanna Zeta
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-03 00:00:00.000000000 Z
13
+ date: 2017-01-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
@@ -318,6 +318,8 @@ files:
318
318
  - lib/onebox/engine/asciinema_onebox.rb
319
319
  - lib/onebox/engine/audio_onebox.rb
320
320
  - lib/onebox/engine/audioboom_onebox.rb
321
+ - lib/onebox/engine/bandcamp_onebox.rb
322
+ - lib/onebox/engine/coub_onebox.rb
321
323
  - lib/onebox/engine/douban_onebox.rb
322
324
  - lib/onebox/engine/gfycat_onebox.rb
323
325
  - lib/onebox/engine/giphy_onebox.rb
@@ -334,6 +336,7 @@ files:
334
336
  - lib/onebox/engine/image_onebox.rb
335
337
  - lib/onebox/engine/imgur_onebox.rb
336
338
  - lib/onebox/engine/json.rb
339
+ - lib/onebox/engine/mixcloud_onebox.rb
337
340
  - lib/onebox/engine/pastebin_onebox.rb
338
341
  - lib/onebox/engine/pubmed_onebox.rb
339
342
  - lib/onebox/engine/replit_onebox.rb
@@ -466,7 +469,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
466
469
  version: '0'
467
470
  requirements: []
468
471
  rubyforge_project:
469
- rubygems_version: 2.6.8
472
+ rubygems_version: 2.5.1
470
473
  signing_key:
471
474
  specification_version: 4
472
475
  summary: A gem for turning URLs into previews.