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 +4 -4
- data/lib/onebox.rb +1 -2
- data/lib/onebox/engine.rb +3 -0
- data/lib/onebox/engine/bandcamp_onebox.rb +32 -0
- data/lib/onebox/engine/coub_onebox.rb +21 -0
- data/lib/onebox/engine/mixcloud_onebox.rb +20 -0
- data/lib/onebox/engine/standard_embed.rb +8 -4
- data/lib/onebox/engine/whitelisted_generic_onebox.rb +17 -13
- data/lib/onebox/matcher.rb +0 -7
- data/lib/onebox/version.rb +1 -1
- data/lib/onebox/web.rb +3 -0
- data/spec/lib/onebox/matcher_spec.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da1cb3e58693506b68988b477855a2058bf0b878
|
4
|
+
data.tar.gz: 81f59c2fee6f69e6903a4d928d4eafa2ab784026
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ccc65c55cf7a0b6b6caf8249db8c998e53eb27d40fe3f06e54a51977a8d3b7d856d6a058615f4e85c6e040fe3f8efe79abde319228a93a006b7bbc425ad8400
|
7
|
+
data.tar.gz: 09cbb07a7b3275dffb6ddb076f07b04b806474e682c9aabd7311d9400fc280b0daa2bd4787d9be5a3f1970403aebb5c6c0baaf6f36e811e821b74454bf7e63ef
|
data/lib/onebox.rb
CHANGED
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
|
-
|
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
|
-
|
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
|
-
|
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='#{
|
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='#{
|
294
|
+
<source src='#{data[:video]}'>
|
291
295
|
</video>
|
292
296
|
HTML
|
293
297
|
else
|
294
298
|
<<-HTML
|
295
|
-
<iframe src='#{
|
299
|
+
<iframe src='#{data[:video]}'
|
296
300
|
title='#{data[:title]}'
|
297
301
|
width='#{data[:video_width]}'
|
298
302
|
height='#{data[:video_height]}'
|
data/lib/onebox/matcher.rb
CHANGED
@@ -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
|
data/lib/onebox/version.rb
CHANGED
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
|
|
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.
|
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-
|
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.
|
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.
|