onebox 1.5.21 → 1.5.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/onebox/engine.rb +18 -2
- data/lib/onebox/engine/amazon_onebox.rb +12 -6
- data/lib/onebox/engine/audio_onebox.rb +4 -0
- data/lib/onebox/engine/github_blob_onebox.rb +1 -1
- data/lib/onebox/engine/github_commit_onebox.rb +4 -2
- data/lib/onebox/engine/github_gist_onebox.rb +1 -0
- data/lib/onebox/engine/github_issue_onebox.rb +5 -3
- data/lib/onebox/engine/github_pullrequest_onebox.rb +4 -2
- data/lib/onebox/engine/google_calendar_onebox.rb +1 -0
- data/lib/onebox/engine/google_docs_onebox.rb +1 -0
- data/lib/onebox/engine/google_maps_onebox.rb +5 -3
- data/lib/onebox/engine/google_play_app_onebox.rb +2 -1
- data/lib/onebox/engine/image_onebox.rb +4 -0
- data/lib/onebox/engine/pubmed_onebox.rb +1 -1
- data/lib/onebox/engine/soundcloud_onebox.rb +2 -1
- data/lib/onebox/engine/stack_exchange_onebox.rb +6 -2
- data/lib/onebox/engine/standard_embed.rb +6 -1
- data/lib/onebox/engine/twitter_status_onebox.rb +2 -1
- data/lib/onebox/engine/video_onebox.rb +4 -0
- data/lib/onebox/engine/whitelisted_generic_onebox.rb +6 -7
- data/lib/onebox/engine/wikipedia_onebox.rb +1 -0
- data/lib/onebox/engine/youtube_onebox.rb +2 -6
- data/lib/onebox/version.rb +1 -1
- data/spec/fixtures/amazon.response +2845 -1268
- data/spec/lib/onebox/engine/amazon_onebox_spec.rb +10 -2
- data/spec/lib/onebox/engine/stack_exchange_onebox_spec.rb +1 -1
- data/spec/lib/onebox/engine/whitelisted_generic_onebox_spec.rb +3 -3
- data/spec/lib/onebox/engine/wikipedia_onebox_spec.rb +1 -0
- data/spec/lib/onebox/engine/youtube_onebox_spec.rb +4 -2
- data/spec/lib/onebox/engine_spec.rb +22 -2
- data/spec/lib/onebox/preview_spec.rb +1 -1
- data/templates/amazon.mustache +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fb92353f1527a271605471d0115a60931073832
|
4
|
+
data.tar.gz: c97622b3d51890dd888e15f0be87493e910901a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3af69983a71d88760ffeb61123c414cbc6ba999bff37e4e326a482637d248b3869bd93e4ae49c2d6c601fb2c79da4116e12df40993c7509c539a481a9d2751e6
|
7
|
+
data.tar.gz: 2468de3c42c9dcf6fd8532e9790fa4432a6d8e185238e7e73011c19f008de281780448b76db420744c5452047c5d3590ec7e99b1901d159e64ed95c566d62704
|
data/lib/onebox/engine.rb
CHANGED
@@ -10,7 +10,7 @@ module Onebox
|
|
10
10
|
end.map(&method(:const_get))
|
11
11
|
end
|
12
12
|
|
13
|
-
attr_reader :url
|
13
|
+
attr_reader :url, :uri
|
14
14
|
attr_reader :cache
|
15
15
|
attr_reader :timeout
|
16
16
|
|
@@ -37,6 +37,11 @@ module Onebox
|
|
37
37
|
self.options = Onebox.options[class_name] || {} #Set the engine options extracted from global options.
|
38
38
|
|
39
39
|
@url = link
|
40
|
+
@uri = URI(link)
|
41
|
+
if always_https?
|
42
|
+
@uri.scheme = 'https'
|
43
|
+
@url = @uri.to_s
|
44
|
+
end
|
40
45
|
@cache = cache || Onebox.options.cache
|
41
46
|
@timeout = timeout || Onebox.options.timeout
|
42
47
|
end
|
@@ -81,7 +86,7 @@ module Onebox
|
|
81
86
|
end
|
82
87
|
|
83
88
|
def link
|
84
|
-
@url.gsub(/['\"
|
89
|
+
@url.gsub(/['\"&<>]/, {
|
85
90
|
"'" => ''',
|
86
91
|
'&' => '&',
|
87
92
|
'"' => '"',
|
@@ -90,6 +95,10 @@ module Onebox
|
|
90
95
|
})
|
91
96
|
end
|
92
97
|
|
98
|
+
def always_https?
|
99
|
+
self.class.always_https?
|
100
|
+
end
|
101
|
+
|
93
102
|
module ClassMethods
|
94
103
|
def ===(other)
|
95
104
|
if other.kind_of?(URI)
|
@@ -112,6 +121,13 @@ module Onebox
|
|
112
121
|
name.split("::").last.downcase.gsub(/onebox/, "")
|
113
122
|
end
|
114
123
|
|
124
|
+
def always_https
|
125
|
+
@https = true
|
126
|
+
end
|
127
|
+
|
128
|
+
def always_https?
|
129
|
+
@https
|
130
|
+
end
|
115
131
|
end
|
116
132
|
end
|
117
133
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
module Onebox
|
2
4
|
module Engine
|
3
5
|
class AmazonOnebox
|
@@ -6,7 +8,7 @@ module Onebox
|
|
6
8
|
include HTML
|
7
9
|
|
8
10
|
|
9
|
-
matches_regexp(/^
|
11
|
+
matches_regexp(/^https?:\/\/(?:www)\.amazon\.(?<tld>com|ca|de|it|es|fr|co\.jp|co\.uk|cn|in|com\.br)\//)
|
10
12
|
|
11
13
|
def url
|
12
14
|
return "http://www.amazon.#{tld}/gp/aw/d/" + URI::encode(match[:id]) if match && match[:id]
|
@@ -30,7 +32,11 @@ module Onebox
|
|
30
32
|
def image
|
31
33
|
case
|
32
34
|
when raw.css("#main-image").any?
|
33
|
-
|
35
|
+
::JSON.parse(
|
36
|
+
raw.css("#main-image").first
|
37
|
+
.attributes["data-a-dynamic-image"]
|
38
|
+
.value
|
39
|
+
).keys.first
|
34
40
|
when raw.css("#landingImage").any?
|
35
41
|
raw.css("#landingImage").first["src"]
|
36
42
|
end
|
@@ -38,15 +44,15 @@ module Onebox
|
|
38
44
|
|
39
45
|
def data
|
40
46
|
result = { link: link,
|
41
|
-
title: raw.css("
|
47
|
+
title: raw.css("title").inner_text,
|
42
48
|
image: image,
|
43
|
-
price: raw.css("
|
49
|
+
price: raw.css("#priceblock_ourprice").inner_text }
|
44
50
|
|
45
51
|
result[:by_info] = raw.at("#by-line")
|
46
52
|
result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
|
47
53
|
|
48
|
-
summary = raw.at("#
|
49
|
-
result[:description] = summary.
|
54
|
+
summary = raw.at("#productDescription")
|
55
|
+
result[:description] = summary.inner_text if summary
|
50
56
|
result
|
51
57
|
end
|
52
58
|
end
|
@@ -5,6 +5,10 @@ module Onebox
|
|
5
5
|
|
6
6
|
matches_regexp /^(https?:)?\/\/.*\.(mp3|ogg|wav)(\?.*)?$/
|
7
7
|
|
8
|
+
def always_https?
|
9
|
+
WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.https_hosts)
|
10
|
+
end
|
11
|
+
|
8
12
|
def to_html
|
9
13
|
"<audio controls><source src='#{@url}'><a href='#{@url}'>#{@url}</a></audio>"
|
10
14
|
end
|
@@ -5,7 +5,8 @@ module Onebox
|
|
5
5
|
include LayoutSupport
|
6
6
|
include JSON
|
7
7
|
|
8
|
-
matches_regexp Regexp.new("^
|
8
|
+
matches_regexp Regexp.new("^https?://(?:www\.)?(?:(?:\w)+\.)?(github)\.com(?:/)?(?:.)*/commit/")
|
9
|
+
always_https
|
9
10
|
|
10
11
|
def url
|
11
12
|
"https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/commits/#{match[:sha]}"
|
@@ -26,8 +27,9 @@ module Onebox
|
|
26
27
|
result['message'] = result['commit']['message'].split("\n", 2).last.strip
|
27
28
|
end
|
28
29
|
|
30
|
+
ulink = URI(link)
|
29
31
|
result['commit_date'] = Time.parse(result['commit']['author']['date']).strftime("%I:%M%p - %d %b %y")
|
30
|
-
result['repository_path'] = "#{
|
32
|
+
result['repository_path'] = "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}"
|
31
33
|
result['repository_url'] = "https://#{result['repository_path']}"
|
32
34
|
result
|
33
35
|
end
|
@@ -5,7 +5,8 @@ module Onebox
|
|
5
5
|
include Engine
|
6
6
|
include LayoutSupport
|
7
7
|
include JSON
|
8
|
-
matches_regexp Regexp.new("^
|
8
|
+
matches_regexp Regexp.new("^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/issues\/([[:digit:]]+)")
|
9
|
+
always_https
|
9
10
|
|
10
11
|
def url
|
11
12
|
m = match
|
@@ -29,6 +30,7 @@ module Onebox
|
|
29
30
|
short_content = content_words[0..max_words].join(" ")
|
30
31
|
short_content << "..." if content_words.length > max_words
|
31
32
|
|
33
|
+
ulink = URI(link)
|
32
34
|
status_color = {"open"=>"#6cc644","closed"=>"#bd2c00","merged"=>"#6e5494"}
|
33
35
|
result = { link: @url,
|
34
36
|
title: "Issue: " + @raw["title"],
|
@@ -39,8 +41,8 @@ module Onebox
|
|
39
41
|
closed_at: (@raw['closed_at'].nil? ? "" : @raw['closed_at'].split("T")[0]),
|
40
42
|
closed_by: @raw['closed_by'],
|
41
43
|
avatar: "https://avatars1.githubusercontent.com/u/#{@raw['user']['id']}?v=2&s=96",
|
42
|
-
repository_path: "#{
|
43
|
-
repository_url: "https://#{
|
44
|
+
repository_path: "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}",
|
45
|
+
repository_url: "https://#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}",
|
44
46
|
}
|
45
47
|
end
|
46
48
|
end
|
@@ -5,7 +5,8 @@ module Onebox
|
|
5
5
|
include LayoutSupport
|
6
6
|
include JSON
|
7
7
|
|
8
|
-
matches_regexp Regexp.new("^
|
8
|
+
matches_regexp Regexp.new("^https?://(?:www\\.)?(?:(?:\\w)+\\.)?(github)\\.com(?:/)?(?:.)*/pull/")
|
9
|
+
always_https
|
9
10
|
|
10
11
|
def url
|
11
12
|
"https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/pulls/#{match[:number]}"
|
@@ -21,7 +22,8 @@ module Onebox
|
|
21
22
|
result = raw.clone
|
22
23
|
result['link'] = link
|
23
24
|
result['created_at'] = Time.parse(result['created_at']).strftime("%I:%M%p - %d %b %y")
|
24
|
-
|
25
|
+
ulink = URI(link)
|
26
|
+
result['repository_path'] = "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}"
|
25
27
|
result['repository_url'] = "https://#{result['repository_path']}"
|
26
28
|
result
|
27
29
|
end
|
@@ -19,6 +19,8 @@ module Onebox
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
always_https
|
23
|
+
|
22
24
|
# Matches shortened Google Maps URLs
|
23
25
|
matches_regexp :short, %r"^(https?:)?//goo\.gl/maps/"
|
24
26
|
|
@@ -95,7 +97,7 @@ module Onebox
|
|
95
97
|
url += "&q=#{$1}" if match = @url.match(/\/place\/([^\/\?]+)/)
|
96
98
|
url += "&cid=#{($1 + $2).to_i(16)}" if @url.match(/!3m1!1s0x(\h{16}):0x(\h{16})/)
|
97
99
|
@url = url
|
98
|
-
@placeholder = "
|
100
|
+
@placeholder = "https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap¢er=#{location}&zoom=#{zoom}&size=690x400&sensor=false"
|
99
101
|
|
100
102
|
when :custom
|
101
103
|
url = @url.dup
|
@@ -113,7 +115,7 @@ module Onebox
|
|
113
115
|
fov = (match[:zoom].to_f / 100.0).round(4).to_s
|
114
116
|
zoom = match[:zoom].to_f.round
|
115
117
|
@url = "https://www.google.com/maps/embed?pb=!3m2!2sen!4v0!6m8!1m7!1s#{panoid}!2m2!1d#{lon}!2d#{lat}!3f#{heading}!4f#{pitch}!5f#{fov}"
|
116
|
-
@placeholder = "
|
118
|
+
@placeholder = "https://maps.googleapis.com/maps/api/streetview?size=690x400&location=#{lon},#{lat}&pano=#{panoid}&fov=#{zoom}&heading=#{heading}&pitch=#{pitch}&sensor=false"
|
117
119
|
|
118
120
|
when :canonical
|
119
121
|
uri = URI(@url)
|
@@ -136,7 +138,7 @@ module Onebox
|
|
136
138
|
zoom = query["z"]
|
137
139
|
end
|
138
140
|
@url = @url.sub('output=classic', 'output=embed')
|
139
|
-
@placeholder = "
|
141
|
+
@placeholder = "https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&size=690x400&sensor=false¢er=#{location}&zoom=#{zoom}"
|
140
142
|
|
141
143
|
else
|
142
144
|
raise "unexpected url type #{type.inspect}"
|
@@ -5,6 +5,10 @@ module Onebox
|
|
5
5
|
|
6
6
|
matches_regexp /^(https?:)?\/\/.+\.(png|jpg|jpeg|gif|bmp|tif|tiff)(\?.*)?$/i
|
7
7
|
|
8
|
+
def always_https?
|
9
|
+
WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.https_hosts)
|
10
|
+
end
|
11
|
+
|
8
12
|
def to_html
|
9
13
|
# Fix Dropbox image links
|
10
14
|
if /^https:\/\/www.dropbox.com\/s\//.match @url
|
@@ -4,7 +4,7 @@ module Onebox
|
|
4
4
|
include Engine
|
5
5
|
include LayoutSupport
|
6
6
|
|
7
|
-
matches_regexp Regexp.new("^
|
7
|
+
matches_regexp Regexp.new("^https?://(?:(?:\\w)+\\.)?(www.ncbi.nlm.nih)\\.gov(?:/)?/pubmed/")
|
8
8
|
|
9
9
|
private
|
10
10
|
|
@@ -5,6 +5,7 @@ module Onebox
|
|
5
5
|
include StandardEmbed
|
6
6
|
|
7
7
|
matches_regexp(/^https?:\/\/.*soundcloud\.com/)
|
8
|
+
always_https
|
8
9
|
|
9
10
|
def to_html
|
10
11
|
get_oembed_data[:html].gsub!('height="400"', 'height="250"')
|
@@ -17,7 +18,7 @@ module Onebox
|
|
17
18
|
private
|
18
19
|
|
19
20
|
def get_oembed_data
|
20
|
-
Onebox::Helpers.symbolize_keys(::MultiJson.load(Onebox::Helpers.fetch_response("
|
21
|
+
Onebox::Helpers.symbolize_keys(::MultiJson.load(Onebox::Helpers.fetch_response("https://soundcloud.com/oembed.json?url=#{url}").body))
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
@@ -9,7 +9,11 @@ module Onebox
|
|
9
9
|
%w(stackexchange stackoverflow superuser serverfault askubuntu)
|
10
10
|
end
|
11
11
|
|
12
|
-
matches_regexp /^
|
12
|
+
matches_regexp /^https?:\/\/(?:(?:(?<subsubdomain>\w*)\.)?(?<subdomain>\w*)\.)?(?<domain>#{domains.join('|')})\.com\/(?:questions|q)\/(?<question>\d*)/
|
13
|
+
|
14
|
+
def always_https?
|
15
|
+
uri.host.split('.').length <= 3
|
16
|
+
end
|
13
17
|
|
14
18
|
private
|
15
19
|
|
@@ -19,7 +23,7 @@ module Onebox
|
|
19
23
|
|
20
24
|
def url
|
21
25
|
domain = URI(@url).host
|
22
|
-
"
|
26
|
+
"https://api.stackexchange.com/2.1/questions/#{match[:question]}?site=#{domain}"
|
23
27
|
end
|
24
28
|
|
25
29
|
def data
|
@@ -20,13 +20,18 @@ module Onebox
|
|
20
20
|
|
21
21
|
# Some oembed providers (like meetup.com) don't provide links to themselves
|
22
22
|
add_oembed_provider /www\.flickr\.com\//, 'http://www.flickr.com/services/oembed.json'
|
23
|
+
add_oembed_provider /(.*\.)?gfycat\.com\//, 'http://gfycat.com/cajax/oembed'
|
23
24
|
add_oembed_provider /www\.kickstarter\.com\//, 'https://www.kickstarter.com/services/oembed'
|
24
25
|
add_oembed_provider /www\.meetup\.com\//, 'http://api.meetup.com/oembed'
|
25
26
|
add_oembed_provider /www\.ted\.com\//, 'http://www.ted.com/services/v1/oembed.json'
|
26
27
|
add_oembed_provider /(.*\.)?vimeo\.com\//, 'http://vimeo.com/api/oembed.json'
|
27
28
|
|
28
29
|
# Sites that work better with OpenGraph
|
29
|
-
add_opengraph_provider /gfycat\.com\//
|
30
|
+
# add_opengraph_provider /gfycat\.com\//
|
31
|
+
|
32
|
+
def always_https?
|
33
|
+
WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.https_hosts)
|
34
|
+
end
|
30
35
|
|
31
36
|
def raw
|
32
37
|
return @raw if @raw
|
@@ -5,7 +5,8 @@ module Onebox
|
|
5
5
|
include LayoutSupport
|
6
6
|
include HTML
|
7
7
|
|
8
|
-
matches_regexp Regexp.new("^
|
8
|
+
matches_regexp Regexp.new("^https?://(?:www\\.)?(?:(?:\\w)+\\.)?(twitter)\\.com(?:/)?(?:.)*/status(es)?/")
|
9
|
+
always_https
|
9
10
|
|
10
11
|
private
|
11
12
|
|
@@ -5,6 +5,10 @@ module Onebox
|
|
5
5
|
|
6
6
|
matches_regexp /^(https?:)?\/\/.*\.(mov|mp4|webm|ogv)(\?.*)?$/
|
7
7
|
|
8
|
+
def always_https?
|
9
|
+
WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.https_hosts)
|
10
|
+
end
|
11
|
+
|
8
12
|
def to_html
|
9
13
|
"<video width='100%' height='100%' controls><source src='#{@url}'><a href='#{@url}'>#{@url}</a></video>"
|
10
14
|
end
|
@@ -142,17 +142,16 @@ module Onebox
|
|
142
142
|
@html_providers = new_provs
|
143
143
|
end
|
144
144
|
|
145
|
-
# A re-written URL coverts
|
146
|
-
# youtube for example
|
145
|
+
# A re-written URL coverts http:// -> https://
|
147
146
|
def self.rewrites
|
148
|
-
@rewrites ||=
|
147
|
+
@rewrites ||= https_hosts.dup
|
149
148
|
end
|
150
149
|
|
151
150
|
def self.rewrites=(new_list)
|
152
151
|
@rewrites = new_list
|
153
152
|
end
|
154
153
|
|
155
|
-
def self.
|
154
|
+
def self.https_hosts
|
156
155
|
%w(slideshare.net imgur.com dailymotion.com livestream.com)
|
157
156
|
end
|
158
157
|
|
@@ -187,11 +186,11 @@ module Onebox
|
|
187
186
|
data[:type] == "article"
|
188
187
|
end
|
189
188
|
|
190
|
-
def
|
189
|
+
def rewrite_https(html)
|
191
190
|
return html unless html
|
192
191
|
uri = URI(@url)
|
193
192
|
if WhitelistedGenericOnebox.host_matches(uri, WhitelistedGenericOnebox.rewrites)
|
194
|
-
html.gsub!(/
|
193
|
+
html.gsub!(/http:\/\//, 'https://')
|
195
194
|
end
|
196
195
|
html
|
197
196
|
end
|
@@ -217,7 +216,7 @@ module Onebox
|
|
217
216
|
end
|
218
217
|
|
219
218
|
def to_html
|
220
|
-
|
219
|
+
rewrite_https(generic_html)
|
221
220
|
end
|
222
221
|
|
223
222
|
def placeholder_html
|
@@ -5,6 +5,7 @@ module Onebox
|
|
5
5
|
include StandardEmbed
|
6
6
|
|
7
7
|
matches_regexp(/^https?:\/\/(?:www\.)?(?:m\.)?(?:youtube\.com|youtu\.be)\/.+$/)
|
8
|
+
always_https
|
8
9
|
|
9
10
|
# Try to get the video ID. Works for URLs of the form:
|
10
11
|
# * https://www.youtube.com/watch?v=Z0UISCEe52Y
|
@@ -58,7 +59,7 @@ module Onebox
|
|
58
59
|
end
|
59
60
|
|
60
61
|
def video_title
|
61
|
-
yt_oembed_url = "
|
62
|
+
yt_oembed_url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=#{video_id.split('?')[0]}"
|
62
63
|
yt_oembed_data = Onebox::Helpers.symbolize_keys(::MultiJson.load(Onebox::Helpers.fetch_response(yt_oembed_url).body))
|
63
64
|
yt_oembed_data[:title]
|
64
65
|
rescue
|
@@ -114,11 +115,6 @@ module Onebox
|
|
114
115
|
end
|
115
116
|
end
|
116
117
|
|
117
|
-
# Note: May throw! Make sure to recue.
|
118
|
-
def uri
|
119
|
-
@_uri ||= URI(@url)
|
120
|
-
end
|
121
|
-
|
122
118
|
def params
|
123
119
|
return {} unless uri.query
|
124
120
|
# This mapping is necessary because CGI.parse returns a hash of keys to arrays.
|