Skip to content
Snippets Groups Projects
Commit ac52d9ae authored by Gabriel Engel's avatar Gabriel Engel
Browse files

Merge pull request #1241 from kakawait/oembed-protocol

Support oEmbed protocol
parents c84cf0cd 90044bfb
No related branches found
No related tags found
No related merge requests found
......@@ -56,7 +56,6 @@ rocketchat:oembed
rocketchat:slashcommands-invite
rocketchat:slashcommands-join
rocketchat:slashcommands-leave
rocketchat:soundcloud
rocketchat:spotify
rocketchat:statistics
rocketchat:theme
......
......@@ -142,7 +142,6 @@ rocketchat:oembed@0.0.1
rocketchat:slashcommands-invite@0.0.1
rocketchat:slashcommands-join@0.0.1
rocketchat:slashcommands-leave@0.0.1
rocketchat:soundcloud@0.0.1
rocketchat:spotify@0.0.1
rocketchat:statistics@0.0.1
rocketchat:theme@0.0.1
......
......@@ -12,7 +12,7 @@ Template.oembedBaseWidget.helpers
if this.headers?.contentType?.match(/video\/.*/)? or this.meta?.twitterPlayerStreamContentType?.match(/video\/.*/)?
return 'oembedVideoWidget'
if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer?
return 'oembedYoutubeWidget'
if this.meta?.oembedHtml?
return 'oembedFrameWidget'
return 'oembedUrlWidget'
<template name="oembedSoundcloudWidget">
<template name="oembedFrameWidget">
{{#if parsedUrl}}
<blockquote>
<a href="https://www.soundcloud.com" style="color: #9e9ea6">SoundCloud</a><br/>
{{#if meta.oembedProviderName}}
{{#if meta.oembedProviderUrl}}
<a href="{{meta.oembedProviderUrl}}" style="color: #9e9ea6">{{meta.oembedProviderName}}</a><br/>
{{/if}}
{{/if}}
{{#if meta.oembedAuthorName}}
{{#if meta.oembedAuthorUrl}}
<a href="meta.oembedAuthorUrl">{{meta.oembedAuthorName}}</a><br/>
......
......@@ -11,6 +11,8 @@ Package.onUse(function(api) {
api.use([
'templating',
'coffeescript',
'underscore',
'konecty:change-case',
'rocketchat:lib@0.0.1'
]);
......@@ -30,7 +32,10 @@ Package.onUse(function(api) {
api.addFiles('client/oembedUrlWidget.html', 'client');
api.addFiles('client/oembedUrlWidget.coffee', 'client');
api.addFiles('client/oembedFrameWidget.html', 'client');
api.addFiles('server/server.coffee', 'server');
api.addFiles('server/providers.coffee', 'server');
api.addFiles('server/models/OEmbedCache.coffee', 'server');
api.export('OEmbed', 'server');
......
URL = Npm.require('url')
QueryString = Npm.require('querystring')
class Providers
providers: []
@getConsumerUrl: (provider, url) ->
urlObj = URL.parse provider.endPoint, true
urlObj.query['url'] = url
delete urlObj.search
return URL.format urlObj
registerProvider: (provider) ->
this.providers.push(provider)
getProviders: () ->
return this.providers
getProviderForUrl: (url) ->
return _.find this.providers, (provider) ->
candidate = _.find provider.urls, (re) ->
return re.test url
return candidate?
providers = new Providers()
providers.registerProvider
urls: [new RegExp('https?://soundcloud.com/\\S+')]
endPoint: 'https://soundcloud.com/oembed?format=json&maxheight=150'
providers.registerProvider
urls: [new RegExp('https?://vimeo.com/[^/]+'), new RegExp('https?://vimeo.com/channels/[^/]+/[^/]+'), new RegExp('https://vimeo.com/groups/[^/]+/videos/[^/]+')]
endPoint: 'https://vimeo.com/api/oembed.json?maxheight=200'
providers.registerProvider
urls: [new RegExp('https?://www.youtube.com/\\S+'), new RegExp('https?://www.youtu.be/\\S+')]
endPoint: 'https://www.youtube.com/oembed?maxheight=200'
providers.registerProvider
urls: [new RegExp('https?://www.rdio.com/\\S+'), new RegExp('https?://rd.io/\\S+')]
endPoint: 'https://www.rdio.com/api/oembed/?format=json&maxheight=150'
providers.registerProvider
urls: [new RegExp('https?://www.slideshare.net/[^/]+/[^/]+')]
endPoint: 'https://www.slideshare.net/api/oembed/2?format=json&maxheight=200'
providers.registerProvider
urls: [new RegExp('https?://www.dailymotion.com/video/\\S+')]
endPoint: 'https://www.dailymotion.com/services/oembed?maxheight=200'
RocketChat.oembed = {}
RocketChat.oembed.providers = providers
RocketChat.callbacks.add 'oembed:beforeGetUrlContent', (data) ->
if data.parsedUrl?
url = URL.format data.parsedUrl
provider = providers.getProviderForUrl url
if provider?
consumerUrl = Providers.getConsumerUrl provider, url
consumerUrl = URL.parse consumerUrl, true
_.extend data.parsedUrl, consumerUrl
data.requestOptions.port = consumerUrl.port
data.requestOptions.hostname = consumerUrl.hostname
data.requestOptions.path = consumerUrl.path
RocketChat.callbacks.add 'oembed:afterParseContent', (data) ->
if data.parsedUrl?.query?
queryString = data.parsedUrl.query
if _.isString data.parsedUrl.query
queryString = QueryString.parse data.parsedUrl.query
if queryString.url?
url = queryString.url
provider = providers.getProviderForUrl url
if provider?
if data.content?.body?
metas = JSON.parse data.content.body;
_.each metas, (value, key) ->
if _.isString value
data.meta[changeCase.camelCase('oembed_' + key)] = value
data.meta['oembedUrl'] = url
......@@ -24,7 +24,7 @@ getUrlContent = (urlObj, redirectCount = 5, callback) ->
httpOrHttps = if urlObj.protocol is 'https:' then https else http
parsedUrl = _.pick urlObj, ['host', 'hash', 'pathname', 'protocol', 'port', 'query']
parsedUrl = _.pick urlObj, ['host', 'hash', 'pathname', 'protocol', 'port', 'query', 'search']
RocketChat.callbacks.run 'oembed:beforeGetUrlContent',
requestOptions: opts
......
Template.oembedBaseWidget.onCreated () ->
if this.data?.parsedUrl?.host is 'soundcloud.com' and this.data?.meta?.oembedHtml?
this.data._overrideTemplate = 'oembedSoundcloudWidget'
URL = Npm.require('url')
RocketChat.callbacks.add 'oembed:beforeGetUrlContent', (data) ->
if data.parsedUrl.host is 'soundcloud.com'
newUrlObj = URL.format data.parsedUrl
newUrlObj = URL.parse "https://soundcloud.com/oembed?url=" + encodeURIComponent newUrlObj + "&format=json&maxheight=150"
data.requestOptions.port = newUrlObj.port
data.requestOptions.hostname = newUrlObj.hostname
data.requestOptions.path = newUrlObj.path
RocketChat.callbacks.add 'oembed:afterParseContent', (data) ->
if data.parsedUrl.host is 'soundcloud.com'
if data.content?.body?
metas = JSON.parse data.content.body;
_.each metas, (value, key) ->
if _.isString value
data.meta[changeCase.camelCase('oembed_' + key)] = value
if data.parsedUrl?
data.meta['oembedUrl'] = URL.format data.parsedUrl
Package.describe({
name: 'rocketchat:soundcloud',
version: '0.0.1',
summary: 'Soundcloud integration',
git: ''
});
Package.onUse(function(api) {
api.versionsFrom('1.0');
api.use([
'coffeescript',
'templating',
'underscore',
'konecty:change-case',
'rocketchat:lib',
'rocketchat:oembed@0.0.1'
]);
api.addFiles('lib/client/widget.coffee', 'client');
api.addFiles('lib/client/oembedSoundcloudWidget.html', 'client');
api.addFiles('lib/server/server.coffee', 'server');
});
Package.onTest(function(api) {
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment