onebox 1.8.79 → 1.8.80
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/onebox/engine/amazon_onebox.rb +7 -6
- data/lib/onebox/engine/audioboom_onebox.rb +2 -4
- data/lib/onebox/engine/bandcamp_onebox.rb +4 -6
- data/lib/onebox/engine/cloudapp_onebox.rb +8 -14
- data/lib/onebox/engine/coub_onebox.rb +2 -3
- data/lib/onebox/engine/five_hundred_px_onebox.rb +1 -2
- data/lib/onebox/engine/giphy_onebox.rb +2 -3
- data/lib/onebox/engine/google_photos_onebox.rb +9 -20
- data/lib/onebox/engine/imgur_onebox.rb +9 -20
- data/lib/onebox/engine/instagram_onebox.rb +6 -12
- data/lib/onebox/engine/kaltura_onebox.rb +3 -5
- data/lib/onebox/engine/mixcloud_onebox.rb +2 -3
- data/lib/onebox/engine/opengraph_image.rb +1 -2
- data/lib/onebox/engine/replit_onebox.rb +2 -4
- data/lib/onebox/engine/sketchfab_onebox.rb +6 -10
- data/lib/onebox/engine/soundcloud_onebox.rb +10 -14
- data/lib/onebox/engine/standard_embed.rb +51 -35
- data/lib/onebox/engine/steam_store_onebox.rb +3 -4
- data/lib/onebox/engine/vimeo_onebox.rb +2 -3
- data/lib/onebox/engine/wistia_onebox.rb +7 -12
- data/lib/onebox/engine/youtube_onebox.rb +9 -11
- data/lib/onebox/helpers.rb +0 -27
- data/lib/onebox/oembed.rb +12 -0
- data/lib/onebox/open_graph.rb +88 -0
- data/lib/onebox/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f4025cb791c71ae3c8e60721222523344220036885b580ab8b95724a3919f9f
|
4
|
+
data.tar.gz: c86237739a577b807887bcab7888b79c69abe4e20a79ad3bd64a44254445a940
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab7468411bd2f318d70c1d1621f92f90f3c378df3f28ff57abfa744e3778cf1817c9ed486ad52ed00c428fdd782c43f4df68de20c8ff1b8cef0e343a552940ea
|
7
|
+
data.tar.gz: 180a8b88df76668dc6d0f73b35aa28ab21587208c42892d02f024e37dee66f403bb31cacd9cd2160b4b7c8596864652d837bdde8e793fd099204b71046e4a21f
|
data/Gemfile.lock
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'json'
|
2
|
+
require "onebox/open_graph"
|
2
3
|
|
3
4
|
module Onebox
|
4
5
|
module Engine
|
@@ -76,7 +77,7 @@ module Onebox
|
|
76
77
|
end
|
77
78
|
|
78
79
|
def data
|
79
|
-
og = ::Onebox::
|
80
|
+
og = ::Onebox::OpenGraph.new(raw)
|
80
81
|
|
81
82
|
if raw.at_css('#dp.book_mobile') #printed books
|
82
83
|
title = raw.at("h1#title")&.inner_text
|
@@ -100,7 +101,7 @@ module Onebox
|
|
100
101
|
link: link,
|
101
102
|
title: title,
|
102
103
|
by_info: authors,
|
103
|
-
image: og
|
104
|
+
image: og.image || image,
|
104
105
|
description: raw.at("#productDescription")&.inner_text,
|
105
106
|
rating: "#{rating}#{', ' if rating && (!isbn&.empty? || !price&.empty?)}",
|
106
107
|
price: price,
|
@@ -131,7 +132,7 @@ module Onebox
|
|
131
132
|
link: link,
|
132
133
|
title: title,
|
133
134
|
by_info: authors,
|
134
|
-
image: og
|
135
|
+
image: og.image || image,
|
135
136
|
description: raw.at("#productDescription")&.inner_text,
|
136
137
|
rating: "#{rating}#{', ' if rating && (!asin&.empty? || !price&.empty?)}",
|
137
138
|
price: price,
|
@@ -142,11 +143,11 @@ module Onebox
|
|
142
143
|
}
|
143
144
|
|
144
145
|
else
|
145
|
-
title = og
|
146
|
+
title = og.title || CGI.unescapeHTML(raw.css("title").inner_text)
|
146
147
|
result = {
|
147
148
|
link: link,
|
148
149
|
title: title,
|
149
|
-
image: og
|
150
|
+
image: og.image || image,
|
150
151
|
price: price
|
151
152
|
}
|
152
153
|
|
@@ -154,7 +155,7 @@ module Onebox
|
|
154
155
|
result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
|
155
156
|
|
156
157
|
summary = raw.at("#productDescription")
|
157
|
-
result[:description] = og
|
158
|
+
result[:description] = og.description || (summary && summary.inner_text)
|
158
159
|
end
|
159
160
|
|
160
161
|
result[:price] = nil if result[:price].start_with?("$0") || result[:price] == 0
|
@@ -9,16 +9,14 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
oembed = get_oembed
|
12
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(oembed[:thumbnail_url])
|
13
12
|
|
14
13
|
<<-HTML
|
15
|
-
<img src="#{
|
14
|
+
<img src="#{oembed.thumbnail_url}" style="max-width: #{oembed.width}px; max-height: #{oembed.height}px;" #{oembed.title_attr}>
|
16
15
|
HTML
|
17
16
|
end
|
18
17
|
|
19
18
|
def to_html
|
20
|
-
|
21
|
-
oembed[:html]
|
19
|
+
get_oembed.html
|
22
20
|
end
|
23
21
|
|
24
22
|
end
|
@@ -9,19 +9,17 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
og = get_opengraph
|
12
|
-
|
13
|
-
"<img src='#{escaped_src}' height='#{og[:video_height]}' #{Helpers.title_attr(og)}>"
|
12
|
+
"<img src='#{og.image}' height='#{og.video_height}' #{og.title_attr}>"
|
14
13
|
end
|
15
14
|
|
16
15
|
def to_html
|
17
16
|
og = get_opengraph
|
18
|
-
|
19
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(src)
|
17
|
+
escaped_src = og.video_secure_url || og.video
|
20
18
|
|
21
19
|
<<-HTML
|
22
20
|
<iframe src="#{escaped_src}"
|
23
|
-
width="#{og
|
24
|
-
height="#{og
|
21
|
+
width="#{og.video_width}"
|
22
|
+
height="#{og.video_height}"
|
25
23
|
scrolling="no"
|
26
24
|
frameborder="0"
|
27
25
|
allowfullscreen>
|
@@ -10,9 +10,9 @@ module Onebox
|
|
10
10
|
def to_html
|
11
11
|
og = get_opengraph
|
12
12
|
|
13
|
-
if !
|
13
|
+
if !og.image.nil?
|
14
14
|
return image_html(og)
|
15
|
-
elsif og
|
15
|
+
elsif og.title.to_s[/\.(mp4|ogv|webm)$/]
|
16
16
|
return video_html(og)
|
17
17
|
else
|
18
18
|
return link_html(og)
|
@@ -22,33 +22,27 @@ module Onebox
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def link_html(og)
|
25
|
-
escaped_url = ::Onebox::Helpers.normalize_url_for_output(og[:url])
|
26
|
-
|
27
25
|
<<-HTML
|
28
|
-
<a href='#{
|
29
|
-
#{og
|
26
|
+
<a href='#{og.url}' target='_blank'>
|
27
|
+
#{og.title}
|
30
28
|
</a>
|
31
29
|
HTML
|
32
30
|
end
|
33
31
|
|
34
32
|
def video_html(og)
|
35
|
-
|
36
|
-
title = og[:title]
|
37
|
-
direct_src = ::Onebox::Helpers.normalize_url_for_output("#{src}/#{title}")
|
33
|
+
direct_src = ::Onebox::Helpers.normalize_url_for_output("#{og.get(:url)}/#{og.title}")
|
38
34
|
|
39
35
|
<<-HTML
|
40
|
-
<video width='480' height='360' #{
|
36
|
+
<video width='480' height='360' #{og.title_attr} controls loop>
|
41
37
|
<source src='#{direct_src}' type='video/mp4'>
|
42
38
|
</video>
|
43
39
|
HTML
|
44
40
|
end
|
45
41
|
|
46
42
|
def image_html(og)
|
47
|
-
escaped_url = ::Onebox::Helpers.normalize_url_for_output(og[:url])
|
48
|
-
|
49
43
|
<<-HTML
|
50
|
-
<a href='#{
|
51
|
-
<img src='#{og
|
44
|
+
<a href='#{og.url}' target='_blank' class='onebox'>
|
45
|
+
<img src='#{og.image}' #{og.title_attr} alt='CloudApp' width='480'>
|
52
46
|
</a>
|
53
47
|
HTML
|
54
48
|
end
|
@@ -9,12 +9,11 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
oembed = get_oembed
|
12
|
-
|
13
|
-
"<img src='#{escaped_src}' height='#{oembed[:thumbnail_height]}' width='#{oembed[:thumbnail_width]}' #{Helpers.title_attr(oembed)}>"
|
12
|
+
"<img src='#{oembed.thumbnail_url}' height='#{oembed.thumbnail_height}' width='#{oembed.thumbnail_width}' #{oembed.title_attr}>"
|
14
13
|
end
|
15
14
|
|
16
15
|
def to_html
|
17
|
-
get_oembed
|
16
|
+
get_oembed.html
|
18
17
|
end
|
19
18
|
|
20
19
|
end
|
@@ -9,8 +9,7 @@ module Onebox
|
|
9
9
|
|
10
10
|
def to_html
|
11
11
|
og = get_opengraph
|
12
|
-
|
13
|
-
"<img src='#{escaped_src}' width='#{og[:image_width]}' height='#{og[:image_height]}' class='onebox' #{Helpers.title_attr(og)}>"
|
12
|
+
"<img src='#{og.image}' width='#{og.image_width}' height='#{og.image_height}' class='onebox' #{og.title_attr}>"
|
14
13
|
end
|
15
14
|
|
16
15
|
end
|
@@ -9,11 +9,10 @@ module Onebox
|
|
9
9
|
|
10
10
|
def to_html
|
11
11
|
oembed = get_oembed
|
12
|
-
escaped_url = ::Onebox::Helpers.normalize_url_for_output(oembed[:url])
|
13
12
|
|
14
13
|
<<-HTML
|
15
|
-
<a href="#{
|
16
|
-
<img src="#{
|
14
|
+
<a href="#{oembed.url}" target="_blank" class="onebox">
|
15
|
+
<img src="#{oembed.url}" width="#{oembed.width}" height="#{oembed.height}" #{oembed.title_attr}>
|
17
16
|
</a>
|
18
17
|
HTML
|
19
18
|
end
|
@@ -9,39 +9,35 @@ module Onebox
|
|
9
9
|
|
10
10
|
def to_html
|
11
11
|
og = get_opengraph
|
12
|
-
return video_html(og) if !
|
13
|
-
return album_html(og) if !
|
14
|
-
return image_html(og) if !
|
12
|
+
return video_html(og) if !og.video_secure_url.nil?
|
13
|
+
return album_html(og) if !og.type.nil? && og.type == "google_photos:photo_album"
|
14
|
+
return image_html(og) if !og.image.nil?
|
15
15
|
nil
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def video_html(og)
|
21
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(og[:video_secure_url])
|
22
|
-
escaped_image_src = ::Onebox::Helpers.normalize_url_for_output(get_secure_link(og[:image]))
|
23
|
-
|
24
21
|
<<-HTML
|
25
|
-
<video width='#{og
|
26
|
-
<source src='#{
|
22
|
+
<video width='#{og.video_width}' height='#{og.video_height}' #{og.title_attr} poster="#{og.get_secure_image}" controls loop>
|
23
|
+
<source src='#{og.video_secure_url}' type='video/mp4'>
|
27
24
|
</video>
|
28
25
|
HTML
|
29
26
|
end
|
30
27
|
|
31
28
|
def album_html(og)
|
32
29
|
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
|
33
|
-
|
34
|
-
album_title = Onebox::Helpers::blank?(og[:description]) ? og[:title].strip : "[#{og[:description].strip}] #{og[:title].strip}"
|
30
|
+
album_title = og.description.nil? ? og.title : "[#{og.description}] #{og.title}"
|
35
31
|
|
36
32
|
<<-HTML
|
37
33
|
<div class='onebox google-photos-album'>
|
38
34
|
<a href='#{escaped_url}' target='_blank'>
|
39
|
-
<span class='outer-box' style='width:#{og
|
35
|
+
<span class='outer-box' style='width:#{og.image_width}px'>
|
40
36
|
<span class='inner-box'>
|
41
37
|
<span class='album-title'>#{Onebox::Helpers.truncate(album_title, 80)}</span>
|
42
38
|
</span>
|
43
39
|
</span>
|
44
|
-
<img src='#{
|
40
|
+
<img src='#{og.get_secure_image}' #{og.title_attr} height='#{og.image_height}' width='#{og.image_width}'>
|
45
41
|
</a>
|
46
42
|
</div>
|
47
43
|
HTML
|
@@ -49,20 +45,13 @@ module Onebox
|
|
49
45
|
|
50
46
|
def image_html(og)
|
51
47
|
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
|
52
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(get_secure_link(og[:image]))
|
53
48
|
|
54
49
|
<<-HTML
|
55
50
|
<a href='#{escaped_url}' target='_blank' class="onebox">
|
56
|
-
<img src='#{
|
51
|
+
<img src='#{og.get_secure_image}' #{og.title_attr} alt='Google Photos' height='#{og.image_height}' width='#{og.image_width}'>
|
57
52
|
</a>
|
58
53
|
HTML
|
59
54
|
end
|
60
|
-
|
61
|
-
def get_secure_link(link)
|
62
|
-
secure_link = URI(link)
|
63
|
-
secure_link.scheme = 'https'
|
64
|
-
secure_link.to_s
|
65
|
-
end
|
66
55
|
end
|
67
56
|
end
|
68
57
|
end
|
@@ -9,39 +9,36 @@ module Onebox
|
|
9
9
|
|
10
10
|
def to_html
|
11
11
|
og = get_opengraph
|
12
|
-
return video_html(og) if !
|
12
|
+
return video_html(og) if !og.video_secure_url.nil?
|
13
13
|
return album_html(og) if is_album?
|
14
|
-
return image_html(og) if !
|
14
|
+
return image_html(og) if !og.image.nil?
|
15
15
|
nil
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def video_html(og)
|
21
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(og[:video_secure_url])
|
22
|
-
|
23
21
|
<<-HTML
|
24
|
-
<video width='#{og
|
25
|
-
<source src='#{
|
26
|
-
<source src='#{
|
22
|
+
<video width='#{og.video_width}' height='#{og.video_height}' #{og.title_attr} controls loop>
|
23
|
+
<source src='#{og.video_secure_url}' type='video/mp4'>
|
24
|
+
<source src='#{og.video_secure_url.gsub('mp4', 'webm')}' type='video/webm'>
|
27
25
|
</video>
|
28
26
|
HTML
|
29
27
|
end
|
30
28
|
|
31
29
|
def album_html(og)
|
32
30
|
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
|
33
|
-
|
34
|
-
album_title = "[Album] #{Onebox::Helpers.truncate(og[:title], 80)}"
|
31
|
+
album_title = "[Album] #{og.title}"
|
35
32
|
|
36
33
|
<<-HTML
|
37
34
|
<div class='onebox imgur-album'>
|
38
35
|
<a href='#{escaped_url}' target='_blank'>
|
39
|
-
<span class='outer-box' style='width:#{og
|
36
|
+
<span class='outer-box' style='width:#{og.image_width}px'>
|
40
37
|
<span class='inner-box'>
|
41
38
|
<span class='album-title'>#{album_title}</span>
|
42
39
|
</span>
|
43
40
|
</span>
|
44
|
-
<img src='#{
|
41
|
+
<img src='#{og.get_secure_image}' #{og.title_attr} height='#{og.image_height}' width='#{og.image_width}'>
|
45
42
|
</a>
|
46
43
|
</div>
|
47
44
|
HTML
|
@@ -56,21 +53,13 @@ module Onebox
|
|
56
53
|
|
57
54
|
def image_html(og)
|
58
55
|
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
|
59
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(get_secure_link(og[:image]))
|
60
56
|
|
61
57
|
<<-HTML
|
62
58
|
<a href='#{escaped_url}' target='_blank' class="onebox">
|
63
|
-
<img src='#{
|
59
|
+
<img src='#{og.get_secure_image}' #{og.title_attr} alt='Imgur' height='#{og.image_height}' width='#{og.image_width}'>
|
64
60
|
</a>
|
65
61
|
HTML
|
66
62
|
end
|
67
|
-
|
68
|
-
def get_secure_link(link)
|
69
|
-
secure_link = URI(link)
|
70
|
-
secure_link.scheme = 'https'
|
71
|
-
secure_link.to_s
|
72
|
-
end
|
73
|
-
|
74
63
|
end
|
75
64
|
end
|
76
65
|
end
|
@@ -12,24 +12,18 @@ module Onebox
|
|
12
12
|
|
13
13
|
def data
|
14
14
|
og = get_opengraph
|
15
|
-
title = og
|
16
|
-
html_entities = HTMLEntities.new
|
15
|
+
title = og.title.split(":")[0].strip.gsub(" on Instagram", "")
|
17
16
|
|
18
17
|
json_data = html_doc.xpath('//script[contains(text(),"window._sharedData")]').text.to_s
|
19
18
|
title = "[Album] #{title}" if json_data =~ /"edge_sidecar_to_children"/
|
20
19
|
|
21
|
-
result = { link: og
|
22
|
-
title:
|
23
|
-
description:
|
20
|
+
result = { link: og.url,
|
21
|
+
title: Onebox::Helpers.truncate(title, 80),
|
22
|
+
description: og.description(250)
|
24
23
|
}
|
25
24
|
|
26
|
-
if !
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
if !Onebox::Helpers.blank?(og[:video_secure_url])
|
31
|
-
result[:video_link] = og[:url]
|
32
|
-
end
|
25
|
+
result[:image] = og.image if !og.image.nil?
|
26
|
+
result[:video_link] = og.url if !og.video_secure_url.nil?
|
33
27
|
|
34
28
|
result
|
35
29
|
end
|
@@ -9,20 +9,18 @@ module Onebox
|
|
9
9
|
|
10
10
|
def preview_html
|
11
11
|
og = get_opengraph
|
12
|
-
thumbnail_url = ::Onebox::Helpers.normalize_url_for_output(og[:image_secure_url])
|
13
12
|
|
14
13
|
<<~HTML
|
15
|
-
<img src="#{
|
14
|
+
<img src="#{og.image_secure_url}" width="#{og.video_width}" height="#{og.video_height}" >
|
16
15
|
HTML
|
17
16
|
end
|
18
17
|
|
19
18
|
def to_html
|
20
19
|
og = get_opengraph
|
21
|
-
embedded_video_url = ::Onebox::Helpers.normalize_url_for_output(og[:video_secure_url])
|
22
20
|
|
23
21
|
<<~HTML
|
24
|
-
<iframe src="#{
|
25
|
-
width="#{og
|
22
|
+
<iframe src="#{og.video_secure_url}"
|
23
|
+
width="#{og.video_width}" height="#{og.video_height}"
|
26
24
|
frameborder='0'
|
27
25
|
allowfullscreen >
|
28
26
|
</iframe>
|
@@ -9,12 +9,11 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
oembed = get_oembed
|
12
|
-
|
13
|
-
"<img src='#{escaped_src}' height='#{oembed[:height]}' #{Helpers.title_attr(oembed)}>"
|
12
|
+
"<img src='#{oembed.image}' height='#{oembed.height}' #{oembed.title_attr}>"
|
14
13
|
end
|
15
14
|
|
16
15
|
def to_html
|
17
|
-
get_oembed
|
16
|
+
get_oembed.html
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -4,8 +4,7 @@ module Onebox
|
|
4
4
|
|
5
5
|
def to_html
|
6
6
|
og = get_opengraph
|
7
|
-
|
8
|
-
"<img src='#{escaped_src}' width='#{og[:image_width]}' height='#{og[:image_height]}' class='onebox' #{Helpers.title_attr(og)}>"
|
7
|
+
"<img src='#{og.image}' width='#{og.image_width}' height='#{og.image_height}' class='onebox' #{og.title_attr}>"
|
9
8
|
end
|
10
9
|
|
11
10
|
end
|
@@ -9,16 +9,14 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
oembed = get_oembed
|
12
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(oembed[:thumbnail_url])
|
13
12
|
|
14
13
|
<<-HTML
|
15
|
-
<img src="#{
|
14
|
+
<img src="#{oembed.thumbnail_url}" style="max-width: #{oembed.width}px; max-height: #{oembed.height}px;" #{oembed.title_attr}>
|
16
15
|
HTML
|
17
16
|
end
|
18
17
|
|
19
18
|
def to_html
|
20
|
-
|
21
|
-
oembed[:html]
|
19
|
+
get_oembed.html
|
22
20
|
end
|
23
21
|
|
24
22
|
end
|
@@ -8,15 +8,13 @@ module Onebox
|
|
8
8
|
always_https
|
9
9
|
|
10
10
|
def to_html
|
11
|
-
|
12
|
-
|
13
|
-
src = opengraph[:video_url].gsub("autostart=1", "")
|
14
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(src)
|
11
|
+
og = get_opengraph
|
12
|
+
src = og.video_url.gsub("autostart=1", "")
|
15
13
|
|
16
14
|
<<-HTML
|
17
|
-
<iframe src="#{
|
18
|
-
width="#{
|
19
|
-
height="#{
|
15
|
+
<iframe src="#{src}"
|
16
|
+
width="#{og.video_width}"
|
17
|
+
height="#{og.video_height}"
|
20
18
|
scrolling="no"
|
21
19
|
frameborder="0"
|
22
20
|
allowfullscreen>
|
@@ -25,9 +23,7 @@ module Onebox
|
|
25
23
|
end
|
26
24
|
|
27
25
|
def placeholder_html
|
28
|
-
|
29
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(opengraph[:image])
|
30
|
-
"<img src='#{escaped_src}'>"
|
26
|
+
"<img src='#{get_opengraph.image}'>"
|
31
27
|
end
|
32
28
|
|
33
29
|
end
|
@@ -8,26 +8,22 @@ module Onebox
|
|
8
8
|
always_https
|
9
9
|
|
10
10
|
def to_html
|
11
|
-
|
11
|
+
oembed = get_oembed
|
12
|
+
oembed.html.gsub('visual=true', 'visual=false')
|
12
13
|
end
|
13
14
|
|
14
15
|
def placeholder_html
|
15
|
-
|
16
|
-
|
17
|
-
"<img src='#{
|
16
|
+
oembed = get_oembed
|
17
|
+
return if Onebox::Helpers.blank?(oembed.thumbnail_url)
|
18
|
+
"<img src='#{oembed.thumbnail_url}' #{oembed.title_attr}>"
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
protected
|
21
22
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
response = Onebox::Helpers.fetch_response(oembed_url) rescue "{}"
|
27
|
-
Onebox::Helpers.symbolize_keys(::MultiJson.load(response))
|
28
|
-
rescue
|
29
|
-
{}
|
30
|
-
end
|
23
|
+
def get_oembed_url
|
24
|
+
oembed_url = "https://soundcloud.com/oembed.json?url=#{url}"
|
25
|
+
oembed_url << "&maxheight=166" unless url["/sets/"]
|
26
|
+
oembed_url
|
31
27
|
end
|
32
28
|
|
33
29
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "cgi"
|
2
|
+
require "onebox/open_graph"
|
2
3
|
|
3
4
|
module Onebox
|
4
5
|
module Engine
|
@@ -41,9 +42,18 @@ module Onebox
|
|
41
42
|
|
42
43
|
@raw = {}
|
43
44
|
|
44
|
-
og.each
|
45
|
+
og.data.each do |k, v|
|
46
|
+
next if k == "title_attr"
|
47
|
+
v = og.send(k)
|
48
|
+
@raw[k] ||= v unless v.nil?
|
49
|
+
end
|
50
|
+
|
45
51
|
twitter.each { |k, v| @raw[k] ||= v unless Onebox::Helpers::blank?(v) }
|
46
|
-
|
52
|
+
|
53
|
+
oembed.data.each do |k, v|
|
54
|
+
v = oembed.send(k)
|
55
|
+
@raw[k] ||= v unless v.nil?
|
56
|
+
end
|
47
57
|
|
48
58
|
favicon = get_favicon
|
49
59
|
@raw["favicon".to_sym] = favicon unless Onebox::Helpers::blank?(favicon)
|
@@ -63,42 +73,11 @@ module Onebox
|
|
63
73
|
end
|
64
74
|
|
65
75
|
def get_oembed
|
66
|
-
|
67
|
-
|
68
|
-
StandardEmbed.oembed_providers.each do |regexp, endpoint|
|
69
|
-
if url =~ regexp
|
70
|
-
oembed_url = "#{endpoint}?url=#{url}"
|
71
|
-
break
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
if html_doc
|
76
|
-
if Onebox::Helpers.blank?(oembed_url)
|
77
|
-
application_json = html_doc.at("//link[@type='application/json+oembed']/@href")
|
78
|
-
oembed_url = application_json.value if application_json
|
79
|
-
end
|
80
|
-
|
81
|
-
if Onebox::Helpers.blank?(oembed_url)
|
82
|
-
text_json = html_doc.at("//link[@type='text/json+oembed']/@href")
|
83
|
-
oembed_url ||= text_json.value if text_json
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
return {} if Onebox::Helpers.blank?(oembed_url)
|
88
|
-
|
89
|
-
json_response = Onebox::Helpers.fetch_response(oembed_url) rescue "{}"
|
90
|
-
oe = Onebox::Helpers.symbolize_keys(::MultiJson.load(json_response))
|
91
|
-
|
92
|
-
# never use oembed from WordPress 4.4 (it's broken)
|
93
|
-
oe.delete(:html) if oe[:html] && oe[:html]["wp-embedded-content"]
|
94
|
-
|
95
|
-
oe
|
96
|
-
rescue Errno::ECONNREFUSED, Net::HTTPError, Net::HTTPFatalError, MultiJson::LoadError
|
97
|
-
{}
|
76
|
+
@oembed ||= Onebox::Oembed.new(get_json_response)
|
98
77
|
end
|
99
78
|
|
100
79
|
def get_opengraph
|
101
|
-
::Onebox::
|
80
|
+
@opengraph ||= ::Onebox::OpenGraph.new(html_doc)
|
102
81
|
end
|
103
82
|
|
104
83
|
def get_twitter
|
@@ -124,6 +103,43 @@ module Onebox
|
|
124
103
|
|
125
104
|
Onebox::Helpers::get_absolute_image_url(favicon, url)
|
126
105
|
end
|
106
|
+
|
107
|
+
def get_json_response
|
108
|
+
oembed_url = get_oembed_url
|
109
|
+
|
110
|
+
return "{}" if Onebox::Helpers.blank?(oembed_url)
|
111
|
+
|
112
|
+
Onebox::Helpers.fetch_response(oembed_url) rescue "{}"
|
113
|
+
rescue Errno::ECONNREFUSED, Net::HTTPError, Net::HTTPFatalError, MultiJson::LoadError
|
114
|
+
"{}"
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
def get_oembed_url
|
120
|
+
oembed_url = nil
|
121
|
+
|
122
|
+
StandardEmbed.oembed_providers.each do |regexp, endpoint|
|
123
|
+
if url =~ regexp
|
124
|
+
oembed_url = "#{endpoint}?url=#{url}"
|
125
|
+
break
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
if html_doc
|
130
|
+
if Onebox::Helpers.blank?(oembed_url)
|
131
|
+
application_json = html_doc.at("//link[@type='application/json+oembed']/@href")
|
132
|
+
oembed_url = application_json.value if application_json
|
133
|
+
end
|
134
|
+
|
135
|
+
if Onebox::Helpers.blank?(oembed_url)
|
136
|
+
text_json = html_doc.at("//link[@type='text/json+oembed']/@href")
|
137
|
+
oembed_url ||= text_json.value if text_json
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
oembed_url
|
142
|
+
end
|
127
143
|
end
|
128
144
|
end
|
129
145
|
end
|
@@ -9,13 +9,12 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
og = get_opengraph
|
12
|
-
escaped_src = ::Onebox::Helpers.normalize_url_for_output(og[:image])
|
13
12
|
<<-HTML
|
14
13
|
<div style='width:100%; height:190px; background-color:#262626; color:#9e9e9e; margin:15px 0;'>
|
15
14
|
<div style='padding:10px'>
|
16
|
-
<h3 style='color:#fff; margin:10px 0 10px 5px;'>#{og
|
17
|
-
<img src='#{
|
18
|
-
<p>#{og
|
15
|
+
<h3 style='color:#fff; margin:10px 0 10px 5px;'>#{og.title}</h3>
|
16
|
+
<img src='#{og.image}' style='float:left; max-width:184px; margin:5px 15px 0 5px'/>
|
17
|
+
<p>#{og.description}</p>
|
19
18
|
</div>
|
20
19
|
</div>
|
21
20
|
HTML
|
@@ -9,12 +9,11 @@ module Onebox
|
|
9
9
|
|
10
10
|
def placeholder_html
|
11
11
|
oembed = get_oembed
|
12
|
-
|
13
|
-
"<img src='#{escaped_src}' width='#{oembed[:thumbnail_width]}' height='#{oembed[:thumbnail_height]}' #{Helpers.title_attr(oembed)}>"
|
12
|
+
"<img src='#{oembed.thumbnail_url}' width='#{oembed.thumbnail_width}' height='#{oembed.thumbnail_height}' #{oembed.title_attr}>"
|
14
13
|
end
|
15
14
|
|
16
15
|
def to_html
|
17
|
-
get_oembed
|
16
|
+
get_oembed.html
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -8,24 +8,19 @@ module Onebox
|
|
8
8
|
always_https
|
9
9
|
|
10
10
|
def to_html
|
11
|
-
|
11
|
+
get_oembed.html
|
12
12
|
end
|
13
13
|
|
14
14
|
def placeholder_html
|
15
|
-
|
16
|
-
|
17
|
-
"<img src='#{
|
15
|
+
oembed = get_oembed
|
16
|
+
return if Onebox::Helpers.blank?(oembed.thumbnail_url)
|
17
|
+
"<img src='#{oembed.thumbnail_url}' #{oembed.title_attr}>"
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
response = Onebox::Helpers.fetch_response(oembed_url) rescue "{}"
|
25
|
-
Onebox::Helpers.symbolize_keys(::MultiJson.load(response))
|
26
|
-
rescue
|
27
|
-
{}
|
28
|
-
end
|
21
|
+
|
22
|
+
def get_oembed_url
|
23
|
+
"https://fast.wistia.com/oembed?embedType=iframe&url=#{url}"
|
29
24
|
end
|
30
25
|
end
|
31
26
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'onebox/oembed'
|
2
|
+
|
1
3
|
module Onebox
|
2
4
|
module Engine
|
3
5
|
class YoutubeOnebox
|
@@ -12,9 +14,9 @@ module Onebox
|
|
12
14
|
|
13
15
|
def placeholder_html
|
14
16
|
if video_id
|
15
|
-
"<img src='https://i.ytimg.com/vi/#{video_id}/hqdefault.jpg' width='#{WIDTH}' height='#{HEIGHT}' #{
|
17
|
+
"<img src='https://i.ytimg.com/vi/#{video_id}/hqdefault.jpg' width='#{WIDTH}' height='#{HEIGHT}' #{video_oembed_data.title_attr}>"
|
16
18
|
elsif list_id
|
17
|
-
"<img src='#{list_thumbnail_url}' width='#{WIDTH}' height='#{HEIGHT}' #{
|
19
|
+
"<img src='#{list_thumbnail_url}' width='#{WIDTH}' height='#{HEIGHT}' #{list_oembed_data.title_attr}>"
|
18
20
|
else
|
19
21
|
to_html
|
20
22
|
end
|
@@ -49,11 +51,7 @@ module Onebox
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def video_title
|
52
|
-
@video_title ||=
|
53
|
-
Onebox::Helpers.truncate(video_oembed_data[:title], 80)
|
54
|
-
rescue
|
55
|
-
nil
|
56
|
-
end
|
54
|
+
@video_title ||= video_oembed_data.title
|
57
55
|
end
|
58
56
|
|
59
57
|
private
|
@@ -85,8 +83,8 @@ module Onebox
|
|
85
83
|
@list_thumbnail_url ||= begin
|
86
84
|
url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/playlist?list=#{list_id}"
|
87
85
|
response = Onebox::Helpers.fetch_response(url) rescue "{}"
|
88
|
-
data = Onebox::
|
89
|
-
data
|
86
|
+
data = Onebox::Oembed.new(response)
|
87
|
+
data.thumbnail_url
|
90
88
|
rescue
|
91
89
|
nil
|
92
90
|
end
|
@@ -95,13 +93,13 @@ module Onebox
|
|
95
93
|
def video_oembed_data
|
96
94
|
url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/watch?v=#{video_id}"
|
97
95
|
response = Onebox::Helpers.fetch_response(url) rescue "{}"
|
98
|
-
Onebox::
|
96
|
+
Onebox::Oembed.new(response)
|
99
97
|
end
|
100
98
|
|
101
99
|
def list_oembed_data
|
102
100
|
url = "https://www.youtube.com/oembed?format=json&url=https://www.youtube.com/playlist?list=#{list_id}"
|
103
101
|
response = Onebox::Helpers.fetch_response(url) rescue "{}"
|
104
|
-
Onebox::
|
102
|
+
Onebox::Oembed.new(response)
|
105
103
|
end
|
106
104
|
|
107
105
|
def embed_params
|
data/lib/onebox/helpers.rb
CHANGED
@@ -18,27 +18,6 @@ module Onebox
|
|
18
18
|
html.gsub(/<[^>]+>/, ' ').gsub(/\n/, '')
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.extract_opengraph(doc)
|
22
|
-
return {} unless doc
|
23
|
-
|
24
|
-
og = {}
|
25
|
-
|
26
|
-
doc.css('meta').each do |m|
|
27
|
-
if (m["property"] && m["property"][/^(?:og|article|product):(.+)$/i]) || (m["name"] && m["name"][/^(?:og|article|product):(.+)$/i])
|
28
|
-
value = (m["content"] || m["value"]).to_s
|
29
|
-
og[$1.tr('-:', '_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Attempt to retrieve the title from the meta tag
|
34
|
-
title_element = doc.at_css('title')
|
35
|
-
if title_element && title_element.text
|
36
|
-
og[:title] ||= title_element.text unless Onebox::Helpers.blank?(title_element.text)
|
37
|
-
end
|
38
|
-
|
39
|
-
og
|
40
|
-
end
|
41
|
-
|
42
21
|
def self.fetch_html_doc(url, headers = nil)
|
43
22
|
response = (fetch_response(url, nil, nil, headers) rescue nil)
|
44
23
|
doc = Nokogiri::HTML(response)
|
@@ -169,15 +148,9 @@ module Onebox
|
|
169
148
|
end
|
170
149
|
|
171
150
|
def self.truncate(string, length = 50)
|
172
|
-
string = sanitize(string)
|
173
151
|
string.size > length ? string[0...(string.rindex(" ", length) || length)] + "..." : string
|
174
152
|
end
|
175
153
|
|
176
|
-
def self.title_attr(meta)
|
177
|
-
title = get(meta, :title)
|
178
|
-
!title.nil? ? "title='#{title}'" : ""
|
179
|
-
end
|
180
|
-
|
181
154
|
def self.get(meta, attr)
|
182
155
|
(meta && !blank?(meta[attr])) ? sanitize(meta[attr]) : nil
|
183
156
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Onebox
|
2
|
+
class Oembed < OpenGraph
|
3
|
+
|
4
|
+
def initialize(response)
|
5
|
+
@data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response))
|
6
|
+
|
7
|
+
# never use oembed from WordPress 4.4 (it's broken)
|
8
|
+
data.delete(:html) if data[:html] && data[:html]["wp-embedded-content"]
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Onebox
|
2
|
+
class OpenGraph
|
3
|
+
|
4
|
+
attr_reader :data
|
5
|
+
|
6
|
+
def initialize(doc)
|
7
|
+
@data = extract(doc)
|
8
|
+
end
|
9
|
+
|
10
|
+
def title
|
11
|
+
get(:title, 80)
|
12
|
+
end
|
13
|
+
|
14
|
+
def title_attr
|
15
|
+
!title.nil? ? "title='#{title}'" : ""
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_secure_image
|
19
|
+
secure_link = URI(get(:image))
|
20
|
+
secure_link.scheme = 'https'
|
21
|
+
secure_link.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(attr, *args, &block)
|
25
|
+
value = get(attr, *args)
|
26
|
+
|
27
|
+
return nil if Onebox::Helpers::blank?(value)
|
28
|
+
|
29
|
+
method_name = attr.to_s
|
30
|
+
if method_name.end_with?(*integer_suffixes)
|
31
|
+
value.to_i
|
32
|
+
elsif method_name.end_with?(*url_suffixes)
|
33
|
+
::Onebox::Helpers.normalize_url_for_output(value)
|
34
|
+
else
|
35
|
+
value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def get(attr, length = nil)
|
40
|
+
return nil if Onebox::Helpers::blank?(data)
|
41
|
+
|
42
|
+
value = data[attr]
|
43
|
+
|
44
|
+
return nil if Onebox::Helpers::blank?(value)
|
45
|
+
|
46
|
+
value = Sanitize.fragment(html_entities.decode(value)).strip
|
47
|
+
value = Onebox::Helpers.truncate(value, length) unless length.nil?
|
48
|
+
|
49
|
+
value
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def integer_suffixes
|
55
|
+
['width', 'height']
|
56
|
+
end
|
57
|
+
|
58
|
+
def url_suffixes
|
59
|
+
['url', 'image', 'video']
|
60
|
+
end
|
61
|
+
|
62
|
+
def html_entities
|
63
|
+
@html_entities ||= HTMLEntities.new
|
64
|
+
end
|
65
|
+
|
66
|
+
def extract(doc)
|
67
|
+
return {} if Onebox::Helpers::blank?(doc)
|
68
|
+
|
69
|
+
data = {}
|
70
|
+
|
71
|
+
doc.css('meta').each do |m|
|
72
|
+
if (m["property"] && m["property"][/^(?:og|article|product):(.+)$/i]) || (m["name"] && m["name"][/^(?:og|article|product):(.+)$/i])
|
73
|
+
value = (m["content"] || m["value"]).to_s
|
74
|
+
data[$1.tr('-:', '_').to_sym] ||= value unless Onebox::Helpers::blank?(value)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Attempt to retrieve the title from the meta tag
|
79
|
+
title_element = doc.at_css('title')
|
80
|
+
if title_element && title_element.text
|
81
|
+
data[:title] ||= title_element.text unless Onebox::Helpers.blank?(title_element.text)
|
82
|
+
end
|
83
|
+
|
84
|
+
data
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
data/lib/onebox/version.rb
CHANGED
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.8.
|
4
|
+
version: 1.8.80
|
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: 2019-
|
13
|
+
date: 2019-03-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: multi_json
|
@@ -366,6 +366,8 @@ files:
|
|
366
366
|
- lib/onebox/matcher.rb
|
367
367
|
- lib/onebox/mixins/git_blob_onebox.rb
|
368
368
|
- lib/onebox/mixins/twitch_onebox.rb
|
369
|
+
- lib/onebox/oembed.rb
|
370
|
+
- lib/onebox/open_graph.rb
|
369
371
|
- lib/onebox/preview.rb
|
370
372
|
- lib/onebox/sanitize_config.rb
|
371
373
|
- lib/onebox/status_check.rb
|
@@ -416,7 +418,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
416
418
|
- !ruby/object:Gem::Version
|
417
419
|
version: '0'
|
418
420
|
requirements: []
|
419
|
-
rubygems_version: 3.0.
|
421
|
+
rubygems_version: 3.0.2
|
420
422
|
signing_key:
|
421
423
|
specification_version: 4
|
422
424
|
summary: A gem for generating embeddable HTML previews from URLs.
|