pageflow-oembed 1.0.1 → 1.1.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 +4 -4
- data/CHANGELOG +12 -1
- data/README.md +10 -4
- data/app/assets/javascript/pageflow/oembed.js +16 -17
- data/app/models/pageflow/oembed/fetcher.rb +6 -22
- data/app/models/pageflow/oembed/providers/spotify.rb +42 -0
- data/app/models/pageflow/oembed/providers/twitter.rb +40 -0
- data/lib/pageflow/oembed/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3ab4e28e97a30dcb8bb9a5e62ff19140d17c125
|
4
|
+
data.tar.gz: 9f75f2259db7007baf98103977bd5fd80601e6ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 304639e97cd7959dc15b706540ce94e41e3da4ab8b6687a3e381efadcbfa0828844140c60480987b1482f0f890e2b5e87d25f36f022ab8dddd677278968fa36c
|
7
|
+
data.tar.gz: e5326f68776ea1b68277a7ec7eb1d631b534da1499e98e4ac93ae4b6fe53564997ef89ad8baa32592500bfcfdc00361bfd163bc3f6ad0d5f778633ea46ca85ab
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Version 1.1.0—16 July 2017
|
2
|
+
|
3
|
+
Bugfix: NodeList to Array now considers empty Nodelist. Also, speed.
|
4
|
+
|
5
|
+
Added Spotify support. Uses Oembed like the makers intended, damnit!
|
6
|
+
|
7
|
+
* spotify, single track: https://open.spotify.com/track/298gs9ATwr2rD9tGYJKlQR
|
8
|
+
* spotify, artist: https://open.spotify.com/artist/0IIPgITtEO4JJfipw57KGv
|
9
|
+
|
1
10
|
Version 1.0.1—16 July 2017
|
2
11
|
|
3
12
|
Bugfix: tweet ID is now correctly parsed from the link.
|
@@ -5,4 +14,6 @@ Bugfix: tweet ID is now correctly parsed from the link.
|
|
5
14
|
Version 1.0.0—16 July 2017
|
6
15
|
|
7
16
|
Twitter support. Doesn't actually use oEmbed, because the Twitter SDK
|
8
|
-
handles everything for us.
|
17
|
+
handles everything for us. Oh well.
|
18
|
+
|
19
|
+
* twitter, single tweet: https://twitter.com/scrollytelling/status/885128273239396352
|
data/README.md
CHANGED
@@ -5,6 +5,8 @@ into embedded content when possible. For example, instead of a link to a
|
|
5
5
|
[Tweet URL](https://twitter.com/scrollytelling/status/885128273239396352), people
|
6
6
|
reading your story will see the Tweet embedded in the page.
|
7
7
|
|
8
|
+
[Read the introduction on Scrollytelling](https://app.scrollytelling.io/embed-a-tweet)
|
9
|
+
|
8
10
|
It usually works using [oEmbed](http://oembed.com), the standard protocol for discovering
|
9
11
|
and showing embedded content. Although sometimes we use a JavaScript SDK, since it
|
10
12
|
gives better results. When we do use oEmbed, the embed-code is cached in
|
@@ -25,16 +27,20 @@ We work with a whitelist and will convert only some links.
|
|
25
27
|
|
26
28
|
Currently supported:
|
27
29
|
|
28
|
-
* twitter: https://twitter.com/scrollytelling/status/885128273239396352
|
30
|
+
* twitter, single tweet: https://twitter.com/scrollytelling/status/885128273239396352
|
31
|
+
* spotify, single track: https://open.spotify.com/track/298gs9ATwr2rD9tGYJKlQR
|
32
|
+
* spotify, artist: https://open.spotify.com/artist/0IIPgITtEO4JJfipw57KGv
|
29
33
|
|
30
34
|
Note that the URL you use must look exactly like the ones above.
|
31
35
|
|
32
36
|
More providers will follow.
|
33
37
|
|
34
|
-
### Just
|
38
|
+
### Just uses JavaScript
|
35
39
|
|
36
|
-
jQuery
|
37
|
-
|
40
|
+
No jQuery was created during the development of this plugin. It does mean we
|
41
|
+
have two polyfills to get IE on board. These don't get loaded if your browser
|
42
|
+
is up to date. And if you are using a really ancient browser, well, that's
|
43
|
+
your choice.
|
38
44
|
|
39
45
|
### Heads up: social scripts will be included in the page
|
40
46
|
|
@@ -2,19 +2,19 @@
|
|
2
2
|
//
|
3
3
|
pageflow.widgetTypes.register('pageflow_oembed', {
|
4
4
|
enhance: function(element) {
|
5
|
+
var embedLinks = [];
|
5
6
|
var urls = document.querySelectorAll('.contentText a');
|
6
|
-
var
|
7
|
+
for(var i = urls.length; i--; embedLinks.unshift(urls[i]));
|
8
|
+
|
7
9
|
for (var i = 0, len = embedLinks.length; i < len; i++) {
|
8
|
-
|
9
|
-
|
10
|
+
var url = embedLinks[i].getAttribute('href');
|
11
|
+
if( /twitter/i.test(url) )
|
12
|
+
this.embedTwitter(embedLinks[i], url);
|
13
|
+
else if( /spotify/i.test(url) )
|
14
|
+
this.embedSpotify(embedLinks[i], url);
|
10
15
|
};
|
11
16
|
},
|
12
17
|
|
13
|
-
embeddable: function(link) {
|
14
|
-
url = link.getAttribute('href');
|
15
|
-
return /https?:\/\/twitter.com\/\w*\/\w*\/\d*/.test(url);
|
16
|
-
},
|
17
|
-
|
18
18
|
token: function() {
|
19
19
|
return document.querySelector("meta[name='csrf-token']").content;
|
20
20
|
},
|
@@ -23,27 +23,26 @@ pageflow.widgetTypes.register('pageflow_oembed', {
|
|
23
23
|
return link.closest('.page');
|
24
24
|
},
|
25
25
|
|
26
|
-
embedSpotify: function(
|
26
|
+
embedSpotify: function(anchor, url) {
|
27
27
|
var xhr = new XMLHttpRequest();
|
28
|
-
var
|
29
|
-
var data = {oembed: {url: url, locale: pageflow.seed.locale}};
|
28
|
+
var data = {oembed: {url: url}};
|
30
29
|
xhr.open("POST", '/oembed/fetch', true);
|
31
30
|
xhr.setRequestHeader("Content-Type", "application/json");
|
32
31
|
xhr.setRequestHeader("X-CSRF-Token", this.token());
|
33
32
|
xhr.onload = function() {
|
34
33
|
oembed = JSON.parse(this.responseText);
|
35
|
-
|
34
|
+
anchor.insertAdjacentHTML('afterend', oembed.html);
|
35
|
+
anchor.style.display = 'none';
|
36
36
|
};
|
37
37
|
xhr.send(JSON.stringify(data));
|
38
38
|
},
|
39
39
|
|
40
|
-
embedTwitter: function(
|
41
|
-
var url = link.getAttribute('href');
|
40
|
+
embedTwitter: function(anchor, url) {
|
42
41
|
var match = /(\d+)$/.exec(url);
|
43
42
|
tweetId = match[0];
|
44
|
-
var theme = this.page(
|
43
|
+
var theme = this.page(anchor).classList.contains('invert') ? 'light' : 'dark';
|
45
44
|
|
46
|
-
|
45
|
+
anchor.insertAdjacentHTML('beforebegin', '<span id="tweet-'+tweetId+'"></span>')
|
47
46
|
|
48
47
|
var options = {omit_script: true, related: 'scrollytelling', lang: pageflow.seed.locale, theme: theme, dnt: 'true'};
|
49
48
|
twttr.widgets.createTweet(
|
@@ -51,6 +50,6 @@ pageflow.widgetTypes.register('pageflow_oembed', {
|
|
51
50
|
document.getElementById('tweet-'+tweetId),
|
52
51
|
options
|
53
52
|
);
|
54
|
-
|
53
|
+
anchor.style.display = 'none';
|
55
54
|
}
|
56
55
|
});
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'faraday_middleware'
|
3
|
-
|
4
1
|
module Pageflow
|
5
2
|
module Oembed
|
6
3
|
class Fetcher
|
@@ -16,26 +13,13 @@ module Pageflow
|
|
16
13
|
end
|
17
14
|
|
18
15
|
def fetch
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
if url.include?('twitter')
|
17
|
+
provider = Providers::Twitter.new(url, params)
|
18
|
+
provider.oembed_response
|
19
|
+
elsif url.include?('spotify')
|
20
|
+
provider = Providers::Spotify.new(url, params)
|
21
|
+
provider.oembed_response
|
25
22
|
end
|
26
|
-
|
27
|
-
response = connection.get "/oembed", {
|
28
|
-
url: url,
|
29
|
-
omit_script: true,
|
30
|
-
related: 'scrollytelling',
|
31
|
-
lang: params[:locale] || 'en',
|
32
|
-
theme: params[:theme] || 'dark',
|
33
|
-
dnt: 'true'
|
34
|
-
}
|
35
|
-
|
36
|
-
oembed = response.body
|
37
|
-
oembed[:cache_until] = oembed[:cache_age].seconds.from_now
|
38
|
-
oembed
|
39
23
|
end
|
40
24
|
end
|
41
25
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Pageflow
|
5
|
+
module Oembed
|
6
|
+
module Providers
|
7
|
+
class Spotify
|
8
|
+
def initialize(url, params)
|
9
|
+
@url = url
|
10
|
+
@params = params
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :url, :params
|
14
|
+
|
15
|
+
def oembed_response
|
16
|
+
# Spotify: GET https://open.spotify.com/oembed?url=http://open.spotify.com/track/298gs9ATwr2rD9tGYJKlQR
|
17
|
+
connection = Faraday.new({
|
18
|
+
url: "https://open.spotify.com",
|
19
|
+
headers: {user_agent: user_agent}
|
20
|
+
}) do |conn|
|
21
|
+
conn.request :json
|
22
|
+
conn.response :json, :content_type => /\bjson$/
|
23
|
+
|
24
|
+
conn.adapter Faraday.default_adapter
|
25
|
+
end
|
26
|
+
|
27
|
+
response = connection.get "/oembed", {
|
28
|
+
url: url
|
29
|
+
}
|
30
|
+
|
31
|
+
response.body
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def user_agent
|
37
|
+
"Pageflow Oembed #{Pageflow::Oembed::VERSION}/Faraday #{Faraday::VERSION}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Pageflow
|
5
|
+
module Oembed
|
6
|
+
module Providers
|
7
|
+
class Twitter
|
8
|
+
def initialize(url, params)
|
9
|
+
@url = url
|
10
|
+
@params = params
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :url, :params
|
14
|
+
|
15
|
+
def oembed_response
|
16
|
+
# Twitter: GET https://publish.twitter.com/oembed?url=https%3A%2F%2Ftwitter.com%2FInterior%2Fstatus%2F507185938620219395
|
17
|
+
connection = Faraday.new(url: "https://publish.twitter.com") do |conn|
|
18
|
+
conn.request :json
|
19
|
+
conn.response :json, :content_type => /\bjson$/
|
20
|
+
|
21
|
+
conn.adapter Faraday.default_adapter
|
22
|
+
end
|
23
|
+
|
24
|
+
response = connection.get "/oembed", {
|
25
|
+
url: url,
|
26
|
+
omit_script: true,
|
27
|
+
related: 'scrollytelling',
|
28
|
+
lang: params[:locale] || 'en',
|
29
|
+
theme: params[:theme] || 'dark',
|
30
|
+
dnt: 'true'
|
31
|
+
}
|
32
|
+
|
33
|
+
oembed = response.body
|
34
|
+
oembed[:cache_until] = oembed[:cache_age].seconds.from_now
|
35
|
+
oembed
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pageflow-oembed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joost Baaij
|
@@ -134,6 +134,8 @@ files:
|
|
134
134
|
- app/models/pageflow/oembed/application_record.rb
|
135
135
|
- app/models/pageflow/oembed/fetcher.rb
|
136
136
|
- app/models/pageflow/oembed/oembed.rb
|
137
|
+
- app/models/pageflow/oembed/providers/spotify.rb
|
138
|
+
- app/models/pageflow/oembed/providers/twitter.rb
|
137
139
|
- app/views/pageflow/oembed/_head.html.erb
|
138
140
|
- app/views/pageflow/oembed/_widget.html.erb
|
139
141
|
- bin/console
|