From 4f137830a7704cd9264a344ed6931f8fe76238e2 Mon Sep 17 00:00:00 2001 From: kakawait Date: Sat, 26 Sep 2015 13:10:17 +0200 Subject: [PATCH 1/3] Spotify integrations using following possible links/syntaxes: - https://open.spotify.com/track/34AWo71Ya5gq7wpNnatwr7 - spotify:track:34AWo71Ya5gq7wpNnatwr7 Works with tracks, albums, artists and playlists. --- .meteor/packages | 1 + .meteor/versions | 1 + .../client/baseWidget.coffee | 13 ++++- .../client/oembedSpotifyWidget.html | 13 +++++ packages/rocketchat-oembed/package.js | 1 + packages/rocketchat-spotify/package.js | 22 +++++++++ packages/rocketchat-spotify/spotify.coffee | 48 +++++++++++++++++++ 7 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 packages/rocketchat-oembed/client/oembedSpotifyWidget.html create mode 100644 packages/rocketchat-spotify/package.js create mode 100644 packages/rocketchat-spotify/spotify.coffee diff --git a/.meteor/packages b/.meteor/packages index 2ebba48b6d1..39b8c2a6a80 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -41,6 +41,7 @@ rocketchat:oembed rocketchat:slashcommands-invite rocketchat:slashcommands-join rocketchat:slashcommands-leave +rocketchat:spotify rocketchat:statistics rocketchat:webrtc #rocketchat:livechat diff --git a/.meteor/versions b/.meteor/versions index 9f9137e44a7..5f4894dfe86 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -120,6 +120,7 @@ rocketchat:oembed@0.0.1 rocketchat:slashcommands-invite@0.0.1 rocketchat:slashcommands-join@0.0.1 rocketchat:slashcommands-leave@0.0.1 +rocketchat:spotify@0.0.1 rocketchat:statistics@0.0.1 rocketchat:webrtc@0.0.1 rocketchat:wordpress@0.0.1 diff --git a/packages/rocketchat-oembed/client/baseWidget.coffee b/packages/rocketchat-oembed/client/baseWidget.coffee index 535df9dcc23..63d628f8f78 100644 --- a/packages/rocketchat-oembed/client/baseWidget.coffee +++ b/packages/rocketchat-oembed/client/baseWidget.coffee @@ -1,3 +1,11 @@ +Template.registerHelper 'replace', (source, find, replace, useRegex) -> + if useRegex is true + find = new RegExp(find) + return source.replace(find, replace) + +Template.registerHelper 'match', (source, regex) -> + return new RegExp(regex).test(source) + Template.oembedBaseWidget.helpers template: -> # console.log this @@ -10,4 +18,7 @@ Template.oembedBaseWidget.helpers if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer? return 'oembedYoutubeWidget' - return 'oembedUrlWidget' \ No newline at end of file + if this.parsedUrl?.host is 'open.spotify.com' and this.meta?.ogAudio? + return 'oembedSpotifyWidget' + + return 'oembedUrlWidget' diff --git a/packages/rocketchat-oembed/client/oembedSpotifyWidget.html b/packages/rocketchat-oembed/client/oembedSpotifyWidget.html new file mode 100644 index 00000000000..3c56d518347 --- /dev/null +++ b/packages/rocketchat-oembed/client/oembedSpotifyWidget.html @@ -0,0 +1,13 @@ + diff --git a/packages/rocketchat-oembed/package.js b/packages/rocketchat-oembed/package.js index fc9d4ff799c..058a28613a3 100644 --- a/packages/rocketchat-oembed/package.js +++ b/packages/rocketchat-oembed/package.js @@ -23,6 +23,7 @@ Package.onUse(function(api) { api.addFiles('client/oembedAudioWidget.html', 'client'); api.addFiles('client/oembedYoutubeWidget.html', 'client'); + api.addFiles('client/oembedSpotifyWidget.html', 'client'); api.addFiles('client/oembedUrlWidget.html', 'client'); api.addFiles('client/oembedUrlWidget.coffee', 'client'); diff --git a/packages/rocketchat-spotify/package.js b/packages/rocketchat-spotify/package.js new file mode 100644 index 00000000000..8f290aed806 --- /dev/null +++ b/packages/rocketchat-spotify/package.js @@ -0,0 +1,22 @@ +Package.describe({ + name: 'rocketchat:spotify', + version: '0.0.1', + summary: 'Message pre-processor that will translate spotify on messages', + git: '' +}); + +Package.onUse(function(api) { + api.versionsFrom('1.0'); + + api.use([ + 'coffeescript', + 'underscore', + 'rocketchat:lib@0.0.1' + ]); + + api.addFiles('spotify.coffee', ['server','client']); +}); + +Package.onTest(function(api) { + +}); diff --git a/packages/rocketchat-spotify/spotify.coffee b/packages/rocketchat-spotify/spotify.coffee new file mode 100644 index 00000000000..63cf5f02665 --- /dev/null +++ b/packages/rocketchat-spotify/spotify.coffee @@ -0,0 +1,48 @@ +### +# Spotify a named function that will process Spotify (ex: spotify:track:1q6IK1l4qpYykOaWaLJkWG) +# @param {Object} message - The message object +### + +class Spotify + process = (message, source, callback) -> + if _.trim source + # Separate text in code blocks and non code blocks + msgParts = source.split(/(```\w*[\n\ ]?[\s\S]*?```+?)/) + + for part, index in msgParts + # Verify if this part is code + codeMatch = part.match(/```(\w*)[\n\ ]?([\s\S]*?)```+?/) + if not codeMatch? + callback message, msgParts, part, index + + @transform: (message) -> + urls = [] + if Array.isArray message.urls + urls = urls.concat message.urls + + changed = false + + process message, message.msg, (message, msgParts, part) -> + re = /spotify:([^:]+):(\S+)/g + while match = re.exec(part) + url = "https://open.spotify.com/" + _.escape match[1] + "/" + _.escape match[2] + urls.push {'url': url} + changed = true + + # Re-mount message + if changed + message.urls = urls + + return message + + @render: (message) -> + process message, message.html, (message, msgParts, part, index) -> + msgParts[index] = part.replace /(^|\s)spotify:([^:]+):(\S+)(\s|$)/g, (match, p1, p2, p3, p4) -> + url = 'https://open.spotify.com/' + _.escape p2 + '/' + _.escape p3 + return p1 + 'spotify:' + p2 + ':' + p3 + '' + p4 + message.html = msgParts.join('') + + return message + +RocketChat.callbacks.add 'beforeSaveMessage', Spotify.transform, RocketChat.callbacks.priority.LOW +RocketChat.callbacks.add 'renderMessage', Spotify.render From ecb2770a305ac3fd34bda810d3b83fd584a3d05e Mon Sep 17 00:00:00 2001 From: kakawait Date: Sun, 27 Sep 2015 15:39:57 +0200 Subject: [PATCH 2/3] Encapsulate spotify integration inside rocketchat:spotify package. No more inside rocketchat:oembed. Remove rocketchat:spotify from default list of packages inside `.meteor/{packages,version}` --- .meteor/packages | 1 - .meteor/versions | 1 - packages/rocketchat-oembed/client/baseWidget.coffee | 8 ++++---- packages/rocketchat-oembed/package.js | 1 - .../client/oembedSpotifyWidget.html | 2 +- packages/rocketchat-spotify/client/widget.coffee | 3 +++ packages/rocketchat-spotify/package.js | 5 +++++ packages/rocketchat-spotify/spotify.coffee | 10 +++++----- 8 files changed, 18 insertions(+), 13 deletions(-) rename packages/{rocketchat-oembed => rocketchat-spotify}/client/oembedSpotifyWidget.html (90%) create mode 100644 packages/rocketchat-spotify/client/widget.coffee diff --git a/.meteor/packages b/.meteor/packages index 39b8c2a6a80..2ebba48b6d1 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -41,7 +41,6 @@ rocketchat:oembed rocketchat:slashcommands-invite rocketchat:slashcommands-join rocketchat:slashcommands-leave -rocketchat:spotify rocketchat:statistics rocketchat:webrtc #rocketchat:livechat diff --git a/.meteor/versions b/.meteor/versions index 5f4894dfe86..9f9137e44a7 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -120,7 +120,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:spotify@0.0.1 rocketchat:statistics@0.0.1 rocketchat:webrtc@0.0.1 rocketchat:wordpress@0.0.1 diff --git a/packages/rocketchat-oembed/client/baseWidget.coffee b/packages/rocketchat-oembed/client/baseWidget.coffee index 63d628f8f78..d07430193a6 100644 --- a/packages/rocketchat-oembed/client/baseWidget.coffee +++ b/packages/rocketchat-oembed/client/baseWidget.coffee @@ -8,7 +8,10 @@ Template.registerHelper 'match', (source, regex) -> Template.oembedBaseWidget.helpers template: -> - # console.log this + # console.log this + if this._overrideTemplate + return this._overrideTemplate + if this.headers?.contentType?.match(/image\/.*/)? return 'oembedImageWidget' @@ -18,7 +21,4 @@ Template.oembedBaseWidget.helpers if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer? return 'oembedYoutubeWidget' - if this.parsedUrl?.host is 'open.spotify.com' and this.meta?.ogAudio? - return 'oembedSpotifyWidget' - return 'oembedUrlWidget' diff --git a/packages/rocketchat-oembed/package.js b/packages/rocketchat-oembed/package.js index 058a28613a3..fc9d4ff799c 100644 --- a/packages/rocketchat-oembed/package.js +++ b/packages/rocketchat-oembed/package.js @@ -23,7 +23,6 @@ Package.onUse(function(api) { api.addFiles('client/oembedAudioWidget.html', 'client'); api.addFiles('client/oembedYoutubeWidget.html', 'client'); - api.addFiles('client/oembedSpotifyWidget.html', 'client'); api.addFiles('client/oembedUrlWidget.html', 'client'); api.addFiles('client/oembedUrlWidget.coffee', 'client'); diff --git a/packages/rocketchat-oembed/client/oembedSpotifyWidget.html b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html similarity index 90% rename from packages/rocketchat-oembed/client/oembedSpotifyWidget.html rename to packages/rocketchat-spotify/client/oembedSpotifyWidget.html index 3c56d518347..b1f5384a2b6 100644 --- a/packages/rocketchat-oembed/client/oembedSpotifyWidget.html +++ b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html @@ -3,7 +3,7 @@
Spotify
{{#if match meta.ogAudio "spotify:artist:\\S+"}} - {{{meta.ogTitle}}}
+ {{{meta.ogTitle}}}
{{else}} {{{replace meta.ogDescription ", an? (?:song|album) by (.+?) on Spotify" " - $1" true}}}
{{/if}} diff --git a/packages/rocketchat-spotify/client/widget.coffee b/packages/rocketchat-spotify/client/widget.coffee new file mode 100644 index 00000000000..23b76ca2335 --- /dev/null +++ b/packages/rocketchat-spotify/client/widget.coffee @@ -0,0 +1,3 @@ +Template.oembedBaseWidget.onCreated () -> + if this.data?.parsedUrl?.host is 'open.spotify.com' and this.data?.meta?.ogAudio? + this.data._overrideTemplate = 'oembedSpotifyWidget' diff --git a/packages/rocketchat-spotify/package.js b/packages/rocketchat-spotify/package.js index 8f290aed806..3bf70a29597 100644 --- a/packages/rocketchat-spotify/package.js +++ b/packages/rocketchat-spotify/package.js @@ -10,10 +10,15 @@ Package.onUse(function(api) { api.use([ 'coffeescript', + 'templating', 'underscore', + 'rocketchat:oembed@0.0.1', 'rocketchat:lib@0.0.1' ]); + api.addFiles('client/widget.coffee', 'client'); + api.addFiles('client/oembedSpotifyWidget.html', 'client'); + api.addFiles('spotify.coffee', ['server','client']); }); diff --git a/packages/rocketchat-spotify/spotify.coffee b/packages/rocketchat-spotify/spotify.coffee index 63cf5f02665..921ded82b3b 100644 --- a/packages/rocketchat-spotify/spotify.coffee +++ b/packages/rocketchat-spotify/spotify.coffee @@ -1,5 +1,5 @@ ### -# Spotify a named function that will process Spotify (ex: spotify:track:1q6IK1l4qpYykOaWaLJkWG) +# Spotify a named function that will process Spotify links or syntaxes (ex: spotify:track:1q6IK1l4qpYykOaWaLJkWG) # @param {Object} message - The message object ### @@ -23,7 +23,7 @@ class Spotify changed = false process message, message.msg, (message, msgParts, part) -> - re = /spotify:([^:]+):(\S+)/g + re = /(?:^|\s)spotify:([^:]+):(\S+)(?:\s|$)/g while match = re.exec(part) url = "https://open.spotify.com/" + _.escape match[1] + "/" + _.escape match[2] urls.push {'url': url} @@ -37,9 +37,9 @@ class Spotify @render: (message) -> process message, message.html, (message, msgParts, part, index) -> - msgParts[index] = part.replace /(^|\s)spotify:([^:]+):(\S+)(\s|$)/g, (match, p1, p2, p3, p4) -> - url = 'https://open.spotify.com/' + _.escape p2 + '/' + _.escape p3 - return p1 + 'spotify:' + p2 + ':' + p3 + '' + p4 + msgParts[index] = part.replace /(^|\s)spotify:([^:]+):(\S+)(\s|$)/g, (match, before, type, id, after) -> + url = 'https://open.spotify.com/' + _.escape type + '/' + _.escape id + return before + 'spotify:' + type + ':' + id + '' + after message.html = msgParts.join('') return message From 02ce2bb20a144195aca93f97658c06f89ddf2277 Mon Sep 17 00:00:00 2001 From: kakawait Date: Sun, 27 Sep 2015 16:12:50 +0200 Subject: [PATCH 3/3] Move helpers from `rocketchat:oembed` to `rocketchat:spotify` --- packages/rocketchat-oembed/client/baseWidget.coffee | 8 -------- .../rocketchat-spotify/client/oembedSpotifyWidget.html | 2 +- packages/rocketchat-spotify/client/widget.coffee | 8 ++++++++ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/rocketchat-oembed/client/baseWidget.coffee b/packages/rocketchat-oembed/client/baseWidget.coffee index d07430193a6..41a6f91006c 100644 --- a/packages/rocketchat-oembed/client/baseWidget.coffee +++ b/packages/rocketchat-oembed/client/baseWidget.coffee @@ -1,11 +1,3 @@ -Template.registerHelper 'replace', (source, find, replace, useRegex) -> - if useRegex is true - find = new RegExp(find) - return source.replace(find, replace) - -Template.registerHelper 'match', (source, regex) -> - return new RegExp(regex).test(source) - Template.oembedBaseWidget.helpers template: -> # console.log this diff --git a/packages/rocketchat-spotify/client/oembedSpotifyWidget.html b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html index b1f5384a2b6..aefa8172fd8 100644 --- a/packages/rocketchat-spotify/client/oembedSpotifyWidget.html +++ b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html @@ -5,7 +5,7 @@ {{#if match meta.ogAudio "spotify:artist:\\S+"}} {{{meta.ogTitle}}}
{{else}} - {{{replace meta.ogDescription ", an? (?:song|album) by (.+?) on Spotify" " - $1" true}}}
+ {{{replace meta.ogDescription ", an? (?:song|album) by (.+?) on Spotify" " - $1" regex=true}}}
{{/if}}
diff --git a/packages/rocketchat-spotify/client/widget.coffee b/packages/rocketchat-spotify/client/widget.coffee index 23b76ca2335..abca5becdce 100644 --- a/packages/rocketchat-spotify/client/widget.coffee +++ b/packages/rocketchat-spotify/client/widget.coffee @@ -1,3 +1,11 @@ +Template.registerHelper 'replace', (source, find, replace, option) -> + if option.hash.regex is true + find = new RegExp(find) + return source.replace(find, replace) + +Template.registerHelper 'match', (source, regex) -> + return new RegExp(regex).test(source) + Template.oembedBaseWidget.onCreated () -> if this.data?.parsedUrl?.host is 'open.spotify.com' and this.data?.meta?.ogAudio? this.data._overrideTemplate = 'oembedSpotifyWidget'