onebox 1.9.28.1 → 1.9.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -1
- data/README.md +8 -0
- data/lib/onebox/engine/google_photos_onebox.rb +18 -4
- data/lib/onebox/engine/instagram_onebox.rb +17 -16
- data/lib/onebox/engine/twitter_status_onebox.rb +5 -1
- data/lib/onebox/helpers.rb +9 -10
- data/lib/onebox/mixins/twitch_onebox.rb +3 -1
- data/lib/onebox/version.rb +1 -1
- data/onebox.gemspec +1 -2
- data/templates/instagram.mustache +2 -2
- metadata +5 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72df1362582e006323722a42dc0787537c297df11f0c0e950b243759b10f74d7
|
4
|
+
data.tar.gz: d0e483271248e8efc72207ec28dae1836e3469376fc7849383201906d4c522e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2277c8b9be42305155c66fb4d97e5987868e34a997f87827a3189ab8073a538ae3afd0b9c89b0271e0671c334d096e87813360ef140298fcdfac2fa58948239a
|
7
|
+
data.tar.gz: ae8306987d4a6ac15fb95a76a9ff44816fc9b84bd73f3ad4af63963fe40834b17de9d7d125f3e92a50ea523ab2cc84cf6b90eea1e8100abe62d991444dd8b946
|
data/.rubocop.yml
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
inherit_gem:
|
2
|
+
rubocop-discourse: default.yml
|
data/README.md
CHANGED
@@ -46,6 +46,14 @@ preview = Onebox.preview(url)
|
|
46
46
|
"#{preview}" == preview.to_s #=> true
|
47
47
|
```
|
48
48
|
|
49
|
+
### Twitch Onebox
|
50
|
+
|
51
|
+
To be able to embed Twitch video and clips, pass `hostname` in the options to `Onebox.preview`
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
preview = Onebox.preview(url, hostname: 'www.example.com')
|
55
|
+
```
|
56
|
+
|
49
57
|
Ruby Support
|
50
58
|
------------
|
51
59
|
|
@@ -20,11 +20,25 @@ module Onebox
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def video_html(og)
|
23
|
+
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
|
24
|
+
|
23
25
|
<<-HTML
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
<aside class="onebox google-photos">
|
27
|
+
<header class="source">
|
28
|
+
<img src="#{raw[:favicon]}" class="site-icon" width="16" height="16">
|
29
|
+
<a href="#{escaped_url}" target="_blank" rel="nofollow ugc noopener">#{raw[:site_name]}</a>
|
30
|
+
</header>
|
31
|
+
<article class="onebox-body">
|
32
|
+
<h3><a href="#{escaped_url}" target="_blank" rel="nofollow ugc noopener">#{og.title}</a></h3>
|
33
|
+
<div class="aspect-image-full-size">
|
34
|
+
<a href="#{escaped_url}" target="_blank" rel="nofollow ugc noopener">
|
35
|
+
<img src="#{og.get_secure_image}" class="scale-image"/>
|
36
|
+
<span class="instagram-video-icon"></span>
|
37
|
+
</a>
|
38
|
+
</div>
|
39
|
+
</article>
|
40
|
+
</aside>
|
41
|
+
HTML
|
28
42
|
end
|
29
43
|
|
30
44
|
def album_html(og)
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'htmlentities'
|
4
|
-
|
5
3
|
module Onebox
|
6
4
|
module Engine
|
7
5
|
class InstagramOnebox
|
@@ -9,25 +7,28 @@ module Onebox
|
|
9
7
|
include StandardEmbed
|
10
8
|
include LayoutSupport
|
11
9
|
|
12
|
-
matches_regexp(/^https?:\/\/(?:www\.)?(?:instagram\.com|instagr\.am)\/?(?:.*)\/p
|
10
|
+
matches_regexp(/^https?:\/\/(?:www\.)?(?:instagram\.com|instagr\.am)\/?(?:.*)\/p\/[a-zA-Z\d_-]+/)
|
13
11
|
always_https
|
14
12
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
json_data = html_doc.xpath('//script[contains(text(),"window._sharedData")]').text.to_s
|
20
|
-
title = "[Album] #{title}" if json_data =~ /"edge_sidecar_to_children"/
|
13
|
+
def clean_url
|
14
|
+
url.scan(/^https?:\/\/(?:www\.)?(?:instagram\.com|instagr\.am)\/?(?:.*)\/p\/[a-zA-Z\d_-]+/).flatten.first
|
15
|
+
end
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
def data
|
18
|
+
oembed = get_oembed
|
19
|
+
permalink = clean_url.gsub("/#{oembed.author_name}/", "/")
|
20
|
+
|
21
|
+
{ link: permalink,
|
22
|
+
title: "@#{oembed.author_name}",
|
23
|
+
image: "#{permalink}/media/?size=l",
|
24
|
+
description: Onebox::Helpers.truncate(oembed.title, 250)
|
25
|
+
}
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
result[:video_link] = og.url if !og.video_secure_url.nil?
|
28
|
+
protected
|
29
29
|
|
30
|
-
|
30
|
+
def get_oembed_url
|
31
|
+
oembed_url = "https://api.instagram.com/oembed/?url=#{clean_url}"
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
@@ -10,10 +10,14 @@ module Onebox
|
|
10
10
|
matches_regexp(/^https?:\/\/(mobile\.|www\.)?twitter\.com\/.+?\/status(es)?\/\d+(\/(video|photo)\/\d?+)?+(\/?\?.*)?\/?$/)
|
11
11
|
always_https
|
12
12
|
|
13
|
+
def http_params
|
14
|
+
{ 'User-Agent' => 'DiscourseBot/1.0' }
|
15
|
+
end
|
16
|
+
|
13
17
|
private
|
14
18
|
|
15
19
|
def get_twitter_data
|
16
|
-
response = Onebox::Helpers.fetch_response(url) rescue nil
|
20
|
+
response = Onebox::Helpers.fetch_response(url, nil, nil, http_params) rescue nil
|
17
21
|
html = Nokogiri::HTML(response)
|
18
22
|
twitter_data = {}
|
19
23
|
html.css('meta').each do |m|
|
data/lib/onebox/helpers.rb
CHANGED
@@ -51,17 +51,14 @@ module Onebox
|
|
51
51
|
|
52
52
|
raise Net::HTTPError.new('HTTP redirect too deep', location) if limit == 0
|
53
53
|
|
54
|
-
uri = URI(location)
|
55
|
-
uri = URI(
|
54
|
+
uri = Addressable::URI.parse(location)
|
55
|
+
uri = Addressable::URI.join(domain, uri) if !uri.host
|
56
56
|
|
57
57
|
result = StringIO.new
|
58
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.
|
58
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.normalized_scheme == 'https') do |http|
|
59
59
|
http.open_timeout = Onebox.options.connect_timeout
|
60
60
|
http.read_timeout = Onebox.options.timeout
|
61
|
-
|
62
|
-
http.use_ssl = true
|
63
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
64
|
-
end
|
61
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # Work around path building bugs
|
65
62
|
|
66
63
|
headers ||= {}
|
67
64
|
|
@@ -76,10 +73,12 @@ module Onebox
|
|
76
73
|
http.request(request) do |response|
|
77
74
|
|
78
75
|
if cookie = response.get_fields('set-cookie')
|
79
|
-
|
76
|
+
# HACK: If this breaks again in the future, use HTTP::CookieJar from gem 'http-cookie'
|
77
|
+
# See test: it "does not send cookies to the wrong domain"
|
78
|
+
redir_header = { 'Cookie' => cookie.join('; ') }
|
80
79
|
end
|
81
80
|
|
82
|
-
|
81
|
+
redir_header = nil unless redir_header.is_a? Hash
|
83
82
|
|
84
83
|
code = response.code.to_i
|
85
84
|
unless code === 200
|
@@ -88,7 +87,7 @@ module Onebox
|
|
88
87
|
response['location'],
|
89
88
|
limit - 1,
|
90
89
|
"#{uri.scheme}://#{uri.host}",
|
91
|
-
|
90
|
+
redir_header
|
92
91
|
)
|
93
92
|
end
|
94
93
|
|
@@ -24,7 +24,9 @@ module Onebox
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def to_html
|
27
|
-
|
27
|
+
<<~HTML
|
28
|
+
<iframe src="//#{base_url}#{query_params}&parent=#{options[:hostname]}&autoplay=false" width="620" height="378" frameborder="0" style="overflow: hidden;" scrolling="no" allowfullscreen="allowfullscreen"></iframe>
|
29
|
+
HTML
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
data/lib/onebox/version.rb
CHANGED
data/onebox.gemspec
CHANGED
@@ -33,8 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'fakeweb', '~> 1.3'
|
34
34
|
spec.add_development_dependency 'pry', '~> 0.10'
|
35
35
|
spec.add_development_dependency 'mocha', '~> 1.1'
|
36
|
-
spec.add_development_dependency 'rubocop', '~>
|
37
|
-
spec.add_development_dependency 'rubocop-discourse', '~> 1.0.1'
|
36
|
+
spec.add_development_dependency 'rubocop-discourse', '~> 2.1.2'
|
38
37
|
spec.add_development_dependency 'twitter', '~> 4.8'
|
39
38
|
spec.add_development_dependency 'guard-rspec', '~> 4.2.8'
|
40
39
|
spec.add_development_dependency 'sinatra', '~> 1.4'
|
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
{{#image}}
|
4
4
|
<div class="instagram-images">
|
5
|
-
|
5
|
+
<a href="{{{link}}}" target="_blank" rel="noopener">
|
6
6
|
<img class="instagram-image" src="{{{image}}}"/>
|
7
|
-
|
7
|
+
</a>
|
8
8
|
</div>
|
9
9
|
{{/image}}
|
10
10
|
|
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.9.
|
4
|
+
version: 1.9.30
|
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: 2020-
|
13
|
+
date: 2020-07-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -180,34 +180,20 @@ dependencies:
|
|
180
180
|
- - "~>"
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '1.1'
|
183
|
-
- !ruby/object:Gem::Dependency
|
184
|
-
name: rubocop
|
185
|
-
requirement: !ruby/object:Gem::Requirement
|
186
|
-
requirements:
|
187
|
-
- - "~>"
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: 0.78.0
|
190
|
-
type: :development
|
191
|
-
prerelease: false
|
192
|
-
version_requirements: !ruby/object:Gem::Requirement
|
193
|
-
requirements:
|
194
|
-
- - "~>"
|
195
|
-
- !ruby/object:Gem::Version
|
196
|
-
version: 0.78.0
|
197
183
|
- !ruby/object:Gem::Dependency
|
198
184
|
name: rubocop-discourse
|
199
185
|
requirement: !ruby/object:Gem::Requirement
|
200
186
|
requirements:
|
201
187
|
- - "~>"
|
202
188
|
- !ruby/object:Gem::Version
|
203
|
-
version: 1.
|
189
|
+
version: 2.1.2
|
204
190
|
type: :development
|
205
191
|
prerelease: false
|
206
192
|
version_requirements: !ruby/object:Gem::Requirement
|
207
193
|
requirements:
|
208
194
|
- - "~>"
|
209
195
|
- !ruby/object:Gem::Version
|
210
|
-
version: 1.
|
196
|
+
version: 2.1.2
|
211
197
|
- !ruby/object:Gem::Dependency
|
212
198
|
name: twitter
|
213
199
|
requirement: !ruby/object:Gem::Requirement
|
@@ -434,7 +420,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
434
420
|
- !ruby/object:Gem::Version
|
435
421
|
version: '0'
|
436
422
|
requirements: []
|
437
|
-
rubygems_version: 3.
|
423
|
+
rubygems_version: 3.0.3
|
438
424
|
signing_key:
|
439
425
|
specification_version: 4
|
440
426
|
summary: A gem for generating embeddable HTML previews from URLs.
|