ruby-oembed 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa5b49cbc24d498437a79986c23aa129502844807e5569038cc4a7e06877cfd0
4
- data.tar.gz: 8e159677b5573eb78ee741ec327c6163cccacd87ed6c69407e588d19d0cf9673
3
+ metadata.gz: 2ce690eea65c79e7df55ec323c59bf8c2ec43c9b94c1f084ad558b70c392cef9
4
+ data.tar.gz: b964d57ad3902a1dc99911aecc7f7f566a89ce2b6fdaa22ab34763c01a4e8aba
5
5
  SHA512:
6
- metadata.gz: b08a12d66076295e5a46182112bf3c62ca3ec7da449e0e2fbe65ef531232b3e5eef45ce46fa79ad6963b04cfe93bca0971f930cbc1076e899b591dd9584e3a7f
7
- data.tar.gz: a51468e9dc43fa6f0e027259cabbb121eb231c5d70f76046642945755f392527a71a6e4c045d6a5e3a761d7b09089ddaa94e3655adb0b533c4ce7c7ca1d88079
6
+ metadata.gz: 5e694d02b886ff90fa2d14afcbaefeda99ab258e632d8126e0e2d61c308edb0eb3001cd517ce1342e3eea033d31eeca1a8016068392e406689ffb08c95242c02
7
+ data.tar.gz: 3aba0c2994ae8fa2b87a172e03dfb4a529eec7ccfabd393b2182a91822bb4856ae2409983d0cb3755a092a191729d0af84c755f14e384a3cd5a2ce9c80b814f6
@@ -1,6 +1,11 @@
1
1
  = CHANGELOG
2
2
 
3
- == Unreleased (0.13.2)
3
+ == Unreleased (0.14.1)
4
+
5
+
6
+ == 0.14.0 - 5 November 2020
7
+
8
+ * Add support for Facebook/Instragram access tokens; Pull #75 (Inge Jørgensen)
4
9
 
5
10
  == 0.13.1 - 25 May 2020
6
11
 
data/README.md CHANGED
@@ -34,6 +34,26 @@ resource.html #=> <<-HTML
34
34
  HTML
35
35
  ```
36
36
 
37
+ ### Providers requiring an access token
38
+
39
+ Some built-in providers require authorization in order to work. These providers won't be registered unless an access token is provided. You can either pass access tokens to the `register_app` method.
40
+
41
+ ```ruby
42
+ OEmbed::Providers.register_all(access_tokens: { facebook: @my_facebook_token })
43
+ ```
44
+
45
+ Or you can provide access tokens via environment variable
46
+ ```ruby
47
+ ENV['OEMBED_FACEBOOK_TOKEN'] #=> 'my-access-token'
48
+ OEmbed::Providers.register_all
49
+ ```
50
+
51
+ #### Currently supported access tokens
52
+
53
+ | access_token | environment variable | Associaed Providers |
54
+ |--------------|-------------------------|---------------------|
55
+ | `:facebook` | `OEMBED_FACEBOOK_TOKEN` | `FacebookPost`, `FacebookVideo`, `Instagram` |
56
+
37
57
  ## Custom Providers
38
58
 
39
59
  If you'd like to use a provider that isn't included in the library, it's easy to create one. Just provide the oEmbed API endpoint and URL scheme(s).
@@ -1,6 +1,10 @@
1
1
  require 'rubygems'
2
2
  require 'yaml'
3
3
 
4
+ require 'oembed/providers/facebook_post'
5
+ require 'oembed/providers/facebook_video'
6
+ require 'oembed/providers/instagram'
7
+
4
8
  module OEmbed
5
9
  # Allows OEmbed to perform tasks across several, registered, Providers
6
10
  # at once.
@@ -44,8 +48,11 @@ module OEmbed
44
48
  # Register all Providers built into this gem.
45
49
  # The including_sub_type parameter should be one of the following values:
46
50
  # * :aggregators: also register provider aggregator endpoints, like Embedly
47
- def register_all(*including_sub_type)
51
+ # The access_token keys can be one of the following:
52
+ # * :facebook: See https://developers.facebook.com/docs/instagram/oembed#access-tokens
53
+ def register_all(*including_sub_type, access_tokens: {})
48
54
  register(*@@to_register[""])
55
+ register_access_token_providers(access_tokens)
49
56
  including_sub_type.each do |sub_type|
50
57
  register(*@@to_register[sub_type.to_s])
51
58
  end
@@ -122,6 +129,20 @@ module OEmbed
122
129
  @@to_register[sub_type.to_s] ||= []
123
130
  @@to_register[sub_type.to_s] << provider_class
124
131
  end
132
+
133
+ # Takes a Hash of tokens, and registers providers that use the given tokens.
134
+ # Also supports "OEMBED_*_TOKEN" environment variables.
135
+ # Currently supported tokens:
136
+ # * facebook: See https://developers.facebook.com/docs/instagram/oembed#access-tokens
137
+ def register_access_token_providers(access_tokens)
138
+ tokens = { facebook: ENV['OEMBED_FACEBOOK_TOKEN'] }.merge(access_tokens)
139
+
140
+ if tokens[:facebook]
141
+ register OEmbed::Providers::FacebookPost.new(access_token: tokens[:facebook])
142
+ register OEmbed::Providers::FacebookVideo.new(access_token: tokens[:facebook])
143
+ register OEmbed::Providers::Instagram.new(access_token: tokens[:facebook])
144
+ end
145
+ end
125
146
  end
126
147
 
127
148
  # Custom providers:
@@ -201,42 +222,6 @@ module OEmbed
201
222
  Vine << "https://*.vine.co/v/*"
202
223
  add_official_provider(Vine)
203
224
 
204
- # Provider for instagram.com
205
- # https://instagr.am/developer/embedding/
206
- Instagram = OEmbed::Provider.new("https://api.instagram.com/oembed", :json)
207
- Instagram << "http://instagr.am/p/*"
208
- Instagram << "http://instagram.com/p/*"
209
- Instagram << "http://www.instagram.com/p/*"
210
- Instagram << "https://instagr.am/p/*"
211
- Instagram << "https://instagram.com/p/*"
212
- Instagram << "https://www.instagram.com/p/*"
213
- Instagram << "http://instagr.am/tv/*"
214
- Instagram << "http://instagram.com/tv/*"
215
- Instagram << "http://www.instagram.com/tv/*"
216
- Instagram << "https://instagr.am/tv/*"
217
- Instagram << "https://instagram.com/tv/*"
218
- Instagram << "https://www.instagram.com/tv/*"
219
- add_official_provider(Instagram)
220
-
221
- # Providers for Facebook Posts & Videos
222
- # https://developers.facebook.com/docs/plugins/oembed-endpoints
223
- FacebookPost = OEmbed::Provider.new('https://www.facebook.com/plugins/post/oembed.json/', :json)
224
- FacebookPost << 'https://www.facebook.com/*/posts/*'
225
- FacebookPost << 'https://www.facebook.com/*/activity/*'
226
- FacebookPost << 'https://www.facebook.com/photo*'
227
- FacebookPost << 'https://www.facebook.com/photos*'
228
- FacebookPost << 'https://www.facebook.com/*/photos*'
229
- FacebookPost << 'https://www.facebook.com/permalink*'
230
- FacebookPost << 'https://www.facebook.com/media*'
231
- FacebookPost << 'https://www.facebook.com/questions*'
232
- FacebookPost << 'https://www.facebook.com/notes*'
233
- add_official_provider(FacebookPost)
234
-
235
- FacebookVideo = OEmbed::Provider.new('https://www.facebook.com/plugins/video/oembed.json/', :json)
236
- FacebookVideo << 'https://www.facebook.com/*/videos/*'
237
- FacebookVideo << 'https://www.facebook.com/video*'
238
- add_official_provider(FacebookVideo)
239
-
240
225
  # Provider for slideshare.net
241
226
  # http://www.slideshare.net/developers/oembed
242
227
  Slideshare = OEmbed::Provider.new("https://www.slideshare.net/api/oembed/2")
@@ -422,7 +407,7 @@ module OEmbed
422
407
  Noembed = OEmbed::Provider.new("https://noembed.com/embed")
423
408
  # Add all known URL regexps for Noembed.
424
409
  # To update this list run `rake oembed:update_noembed`
425
- YAML.load_file(File.join(File.dirname(__FILE__), "/providers/noembed_urls.yml")).each do |url|
410
+ YAML.load_file(File.join(File.dirname(__FILE__), "/providers/aggregators/noembed_urls.yml")).each do |url|
426
411
  Noembed << Regexp.new(url)
427
412
  end
428
413
  add_official_provider(Noembed, :aggregators)
@@ -437,7 +422,7 @@ module OEmbed
437
422
  # If you don't yet have an API key you'll need to sign up here: http://embed.ly/pricing
438
423
  Embedly = OEmbed::Provider.new("http://api.embed.ly/1/oembed")
439
424
  # Add all known URL regexps for Embedly. To update this list run `rake oembed:update_embedly`
440
- YAML.load_file(File.join(File.dirname(__FILE__), "/providers/embedly_urls.yml")).each do |url|
425
+ YAML.load_file(File.join(File.dirname(__FILE__), "/providers/aggregators/embedly_urls.yml")).each do |url|
441
426
  Embedly << url
442
427
  end
443
428
  add_official_provider(Embedly, :aggregators)
@@ -0,0 +1,25 @@
1
+ module OEmbed
2
+ class Providers
3
+ # Provider for Facebook posts
4
+ class FacebookPost < OEmbed::Provider
5
+ def initialize(access_token:)
6
+ super("https://graph.facebook.com/v8.0/oembed_post?access_token=#{access_token}", :json)
7
+ register_urls!
8
+ end
9
+
10
+ private
11
+
12
+ def register_urls!
13
+ ['https://www.facebook.com/*/posts/*',
14
+ 'https://www.facebook.com/*/activity/*',
15
+ 'https://www.facebook.com/photo*',
16
+ 'https://www.facebook.com/photos*',
17
+ 'https://www.facebook.com/*/photos*',
18
+ 'https://www.facebook.com/permalink*',
19
+ 'https://www.facebook.com/media*',
20
+ 'https://www.facebook.com/questions*',
21
+ 'https://www.facebook.com/notes*'].each { |u| self << u }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ module OEmbed
2
+ class Providers
3
+ # Provider for Facebook videos
4
+ class FacebookVideo < OEmbed::Provider
5
+ def initialize(access_token:)
6
+ super("https://graph.facebook.com/v8.0/oembed_video?access_token=#{access_token}", :json)
7
+ register_urls!
8
+ end
9
+
10
+ private
11
+
12
+ def register_urls!
13
+ ['https://www.facebook.com/*/videos/*',
14
+ 'https://www.facebook.com/video*'].each { |u| self << u }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ module OEmbed
2
+ class Providers
3
+ # Provider for instagram.com
4
+ class Instagram < OEmbed::Provider
5
+ def initialize(access_token:)
6
+ super("https://graph.facebook.com/v8.0/instagram_oembed?access_token=#{access_token}", :json)
7
+ register_urls!
8
+ end
9
+
10
+ private
11
+
12
+ def register_urls!
13
+ ["http://instagr.am/p/*",
14
+ "http://instagram.com/p/*",
15
+ "http://www.instagram.com/p/*",
16
+ "https://instagr.am/p/*",
17
+ "https://instagram.com/p/*",
18
+ "https://www.instagram.com/p/*",
19
+ "http://instagr.am/tv/*",
20
+ "http://instagram.com/tv/*",
21
+ "http://www.instagram.com/tv/*",
22
+ "https://instagr.am/tv/*",
23
+ "https://instagram.com/tv/*",
24
+ "https://www.instagram.com/tv/*"].each { |u| self << u }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,8 +1,8 @@
1
1
  module OEmbed
2
2
  class Version
3
3
  MAJOR = 0
4
- MINOR = 13
5
- PATCH = 1
4
+ MINOR = 14
5
+ PATCH = 0
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
 
8
8
  class << self
@@ -8,7 +8,7 @@ begin
8
8
  task :update_noembed do
9
9
  # Details at http://api.embed.ly/docs/service
10
10
  json_uri = URI.parse("https://noembed.com/providers")
11
- yaml_path = File.join(File.dirname(__FILE__), "../oembed/providers/noembed_urls.yml")
11
+ yaml_path = File.join(File.dirname(__FILE__), "../oembed/providers/aggregators/noembed_urls.yml")
12
12
 
13
13
  services = JSON.parse(json_uri.read)
14
14
 
@@ -25,7 +25,7 @@ begin
25
25
  task :update_embedly do
26
26
  # Details at http://api.embed.ly/docs/service
27
27
  json_uri = URI.parse("http://api.embed.ly/1/services")
28
- yaml_path = File.join(File.dirname(__FILE__), "../oembed/providers/embedly_urls.yml")
28
+ yaml_path = File.join(File.dirname(__FILE__), "../oembed/providers/aggregators/embedly_urls.yml")
29
29
 
30
30
  services = JSON.parse(json_uri.read)
31
31
 
@@ -0,0 +1,50 @@
1
+ require File.join(File.dirname(__FILE__), '../spec_helper')
2
+
3
+ describe 'Facebook providers' do
4
+ let(:access_token) { 'my-fake-access-token' }
5
+
6
+ describe 'FacebookPost provider' do
7
+ let(:provider) { OEmbed::Providers::FacebookPost.new(access_token: access_token) }
8
+ let(:embed_url) { 'https://www.facebook.com/exampleuser/posts/1234567890' }
9
+
10
+ it 'sets the endpoint URL' do
11
+ expect(provider.endpoint).to(
12
+ eq("https://graph.facebook.com/v8.0/oembed_post?access_token=#{access_token}")
13
+ )
14
+ end
15
+
16
+ it 'recognizes embed URLs' do
17
+ expect(provider).to include(embed_url)
18
+ end
19
+ end
20
+
21
+ describe 'FacebookVideo provider' do
22
+ let(:provider) { OEmbed::Providers::FacebookVideo.new(access_token: access_token) }
23
+ let(:embed_url) { 'https://www.facebook.com/exampleuser/videos/1234567890' }
24
+
25
+ it 'sets the endpoint URL' do
26
+ expect(provider.endpoint).to(
27
+ eq("https://graph.facebook.com/v8.0/oembed_video?access_token=#{access_token}")
28
+ )
29
+ end
30
+
31
+ it 'recognizes embed URLs' do
32
+ expect(provider).to include(embed_url)
33
+ end
34
+ end
35
+
36
+ describe 'Instagram provider' do
37
+ let(:provider) { OEmbed::Providers::Instagram.new(access_token: access_token) }
38
+ let(:embed_url) { 'https://www.instagram.com/p/r4nd0m1mg/' }
39
+
40
+ it 'sets the endpoint URL' do
41
+ expect(provider.endpoint).to(
42
+ eq("https://graph.facebook.com/v8.0/instagram_oembed?access_token=#{access_token}")
43
+ )
44
+ end
45
+
46
+ it 'recognizes embed URLs' do
47
+ expect(provider).to include(embed_url)
48
+ end
49
+ end
50
+ end
@@ -210,6 +210,54 @@ describe OEmbed::Providers do
210
210
  end
211
211
  end
212
212
 
213
+ describe 'register_access_token_providers' do
214
+ describe 'tokens[:facebook]' do
215
+ let(:access_token) { 'my-fake-access-token' }
216
+ let(:embed_url) { 'https://www.facebook.com/exampleuser/posts/1234567890' }
217
+
218
+ around(:each) do |each|
219
+ previous_value = ENV['OEMBED_FACEBOOK_TOKEN']
220
+ ENV['OEMBED_FACEBOOK_TOKEN'] = nil
221
+ each.run
222
+ ENV['OEMBED_FACEBOOK_TOKEN'] = previous_value
223
+ OEmbed::Providers.unregister_all
224
+ end
225
+
226
+ subject { OEmbed::Providers.find(embed_url) }
227
+
228
+ context 'when NO access token is provided' do
229
+ before do
230
+ OEmbed::Providers.register_all
231
+ end
232
+
233
+ it { is_expected.to_not be_a(OEmbed::Providers::FacebookPost) }
234
+ end
235
+
236
+ context 'when access token is provided to register_all' do
237
+ before do
238
+ OEmbed::Providers.register_all(access_tokens: { facebook: access_token })
239
+ end
240
+
241
+ it { is_expected.to be_a(OEmbed::Providers::FacebookPost) }
242
+ end
243
+
244
+ context 'when access token is set as an environment variable' do
245
+ before do
246
+ ENV['OEMBED_FACEBOOK_TOKEN'] = access_token
247
+ OEmbed::Providers.register_all
248
+ end
249
+
250
+ it { is_expected.to be_a(OEmbed::Providers::FacebookPost) }
251
+ end
252
+
253
+ context 'without access token' do
254
+ before { OEmbed::Providers.register_all }
255
+
256
+ it { is_expected.to eq(nil) }
257
+ end
258
+ end
259
+ end
260
+
213
261
  describe 'add_official_provider' do
214
262
  it "should register a new official provider" do
215
263
  expect(defined?(OEmbed::Providers::Fake)).to_not be
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-oembed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Holm
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-05-25 00:00:00.000000000 Z
14
+ date: 2020-11-05 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: xml-simple
@@ -79,9 +79,12 @@ files:
79
79
  - lib/oembed/provider.rb
80
80
  - lib/oembed/provider_discovery.rb
81
81
  - lib/oembed/providers.rb
82
- - lib/oembed/providers/embedly_urls.yml
83
- - lib/oembed/providers/noembed_urls.yml
84
- - lib/oembed/providers/oohembed_urls.yml
82
+ - lib/oembed/providers/aggregators/embedly_urls.yml
83
+ - lib/oembed/providers/aggregators/noembed_urls.yml
84
+ - lib/oembed/providers/aggregators/oohembed_urls.yml
85
+ - lib/oembed/providers/facebook_post.rb
86
+ - lib/oembed/providers/facebook_video.rb
87
+ - lib/oembed/providers/instagram.rb
85
88
  - lib/oembed/response.rb
86
89
  - lib/oembed/response/link.rb
87
90
  - lib/oembed/response/photo.rb
@@ -105,6 +108,7 @@ files:
105
108
  - spec/formatter_spec.rb
106
109
  - spec/provider_discovery_spec.rb
107
110
  - spec/provider_spec.rb
111
+ - spec/providers/facebook_spec.rb
108
112
  - spec/providers/slideshare_spec.rb
109
113
  - spec/providers/twitter_spec.rb
110
114
  - spec/providers_spec.rb
@@ -121,7 +125,7 @@ rdoc_options:
121
125
  - "--main"
122
126
  - README.rdoc
123
127
  - "--title"
124
- - ruby-oembed-0.13.1
128
+ - ruby-oembed-0.14.0
125
129
  - "--inline-source"
126
130
  - "--exclude"
127
131
  - tasks
@@ -139,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
143
  - !ruby/object:Gem::Version
140
144
  version: '0'
141
145
  requirements: []
142
- rubygems_version: 3.0.3
146
+ rubygems_version: 3.1.4
143
147
  signing_key:
144
148
  specification_version: 4
145
149
  summary: oEmbed for Ruby
@@ -158,6 +162,7 @@ test_files:
158
162
  - spec/formatter_spec.rb
159
163
  - spec/provider_discovery_spec.rb
160
164
  - spec/provider_spec.rb
165
+ - spec/providers/facebook_spec.rb
161
166
  - spec/providers/slideshare_spec.rb
162
167
  - spec/providers/twitter_spec.rb
163
168
  - spec/providers_spec.rb