From dbc7f4806d8e0d5e735acfa0b7cd179c64525169 Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Tue, 1 Dec 2015 10:57:56 +0000 Subject: [PATCH] Add embedded sharing to Google Play Music from Chrome ext. --- .gitignore | 1 + chrome/icon-blue-128.png | Bin 0 -> 7125 bytes chrome/icon-blue-16.png | Bin 0 -> 2174 bytes chrome/icon-blue-48.png | Bin 0 -> 4088 bytes chrome/manifest.json | 20 ++++++-- chrome/src/background.js | 58 +++++++++------------ chrome/src/google.js | 51 ++++++++++++++++++ chrome/src/lib/selector-listener.js | 77 ++++++++++++++++++++++++++++ public/images/xbox.png | Bin 4548 -> 17815 bytes 9 files changed, 170 insertions(+), 37 deletions(-) create mode 100644 chrome/icon-blue-128.png create mode 100644 chrome/icon-blue-16.png create mode 100644 chrome/icon-blue-48.png create mode 100644 chrome/src/google.js create mode 100644 chrome/src/lib/selector-listener.js mode change 100755 => 100644 public/images/xbox.png diff --git a/.gitignore b/.gitignore index 13035f8..3708d9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +chrome/build public/jspm_packages public/views node_modules diff --git a/chrome/icon-blue-128.png b/chrome/icon-blue-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8c813362f7c75e6b64cb05baa7c624a2e08be28b GIT binary patch literal 7125 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 literal 0 HcmV?d00001 diff --git a/chrome/icon-blue-16.png b/chrome/icon-blue-16.png new file mode 100644 index 0000000000000000000000000000000000000000..010e6e940fb86e6335631711fd7fa8b42cfa483d GIT binary patch literal 2174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU@Xscb`J1#c2)=|%1_J8No8Qr zm{>Z&SKB2~fb%)W_D=`ERie8t3yS2pM0TmC)2znJfb)2`Ii)4LU>m%sh-VS$;k z^>S7@PN4Z7x~$c`B|0p| zd*i3fF=jwAjI{EqDZO#e&cH3;;|2^>8j&JD?Ilb-O*1x_z`oOpB zTH+tBva*G~dtQs#G0yy&COMU7!GB;(a29w(7Bet#3xhBt!>lsd^Q;1whpd3^o;3KxS@gNuokUZcbjYRfVk*ScMgk4HDK@QUEI{$+lIB z@C{IK&M!(;Fx4~BGf=YQQczH^DN0GR3UYCSY6tRcl`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6r2bc-wVN)jt{^NN)rhQQ2mNi9w;$}A|!%+FH*nVXoDUs__Tqy(}E z4j}F<$xK7olvfP(7SMzGAQ^o_Jp+Ag+EObracBd{;MA6q4EI$*X;BW?PbtazsX3{+ zsd**EKz)W-tpkQFTqBAjD-sJJmVpBi;x`+R%dLV^i}Q0zK|v6jmsw(GWCQjPx-cR{ zAiA9Ma|?=6i;IEU>`b9rkj2o|MN$J=;vP=TxaOgnaD&FXtw>POtA|yG~wrLnQxmnPo>88n0s7+OhI~)n2AVKY?eS zPd=W!UYJ+sGf&!+$VM^zp9W6ZTw92+Kn4jb5`_7@WS$6mAvo%|#rnYWUFRGhV<-(Sioi6h-+iaC) zpXl^J=;ZBZ2Goazrjj+ z#&eA~H*7avOqcLJa_pVL`A&rZo=t~4uWVCGs1<&3h8XKHqGvE%H@rF8dvCVn%A;*=H2&s!X`$GJ3BTVD?$^*oK%*yc1t3Z;zQ1 z@!HDl-qh>^3*X<_dMVt@lU4up0k!1`MQeM!Vhi#;CkuUIz0G>&Of1Ly3%p8vUxoWPUmMPmW6mps#X7IobyvaUAFj|A*g!tboFyt=akR{0BqqwQvd(} literal 0 HcmV?d00001 diff --git a/chrome/icon-blue-48.png b/chrome/icon-blue-48.png new file mode 100644 index 0000000000000000000000000000000000000000..d905a01a83ae556f561ea1b584e0293e7eb6fdd3 GIT binary patch literal 4088 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 A>Hq)$ literal 0 HcmV?d00001 diff --git a/chrome/manifest.json b/chrome/manifest.json index dc19088..3548fdf 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -1,19 +1,31 @@ { "name" : "Match Audio", - "version" : "0.2.2", + "version" : "0.3.1", "description" : "Match Audio makes sharing from music services better.", "background" : { "persistent": false, - "scripts": [ "background.js" ] + "scripts": [ + "src/background.js" + ] }, + "content_scripts": [ + { + "matches": ["https://play.google.com/music/*"], + "js": ["src/lib/selector-listener.js", "src/google.js"] + } + ], "page_action" : { "default_icon": { "16": "icon-16.png", "48": "icon-48.png", "128": "icon-128.png" - } + }, + "default_title": "Find matches for this music on Match Audio" }, - "permissions" : [ "declarativeContent", "https://match.audio/" ], + "permissions" : [ + "declarativeContent", + "https://play.google.com/music" + ], "icons": { "16": "icon-16.png", "48": "icon-48.png", diff --git a/chrome/src/background.js b/chrome/src/background.js index 6523f54..713b3db 100644 --- a/chrome/src/background.js +++ b/chrome/src/background.js @@ -1,45 +1,36 @@ -"use strict"; +const apiUrl = 'https://match.audio'; -chrome.runtime.onInstalled.addListener(function() { - chrome.declarativeContent.onPageChanged.removeRules(undefined, function() { +chrome.runtime.onInstalled.addListener(() => { + chrome.declarativeContent.onPageChanged.removeRules(undefined, () => { chrome.declarativeContent.onPageChanged.addRules([ { conditions: [ new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'beatsmusic.com', pathPrefix: "/album" }, + pageUrl: { hostEquals: 'www.deezer.com', pathPrefix: '/album' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'beatsmusic.com', pathPrefix: "/track" }, + pageUrl: { hostEquals: 'www.deezer.com', pathPrefix: '/track' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'deezer.com', pathPrefix: "/album" }, - }), - new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'deezer.com', pathPrefix: "/track" }, - }), - new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostEquals: 'play.google.com', pathPrefix: "/music" }, + pageUrl: { hostEquals: 'play.google.com', pathPrefix: '/music' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostEquals: 'itunes.apple.com', pathPrefix: "/music" }, + pageUrl: { hostEquals: 'itunes.apple.com', pathPrefix: '/music' }, }), new chrome.declarativeContent.PageStateMatcher({ pageUrl: { hostSuffix: 'rdio.com' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'rd.io' }, + pageUrl: { hostSuffix: 'spotify.com', pathPrefix: '/album' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'spotify.com', pathPrefix: "/album" }, + pageUrl: { hostSuffix: 'spotify.com', pathPrefix: '/track' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'spotify.com', pathPrefix: "/track" }, + pageUrl: { hostEquals: 'music.microsoft.com', pathPrefix: '/track' }, }), new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'music.xbox.com', pathPrefix: "/track" }, - }), - new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { hostSuffix: 'music.xbox.com', pathPrefix: "/album" }, + pageUrl: { hostEquals: 'music.microsoft.com', pathPrefix: '/album' }, }), new chrome.declarativeContent.PageStateMatcher({ pageUrl: { hostSuffix: 'youtube.com' }, @@ -53,17 +44,18 @@ chrome.runtime.onInstalled.addListener(function() { }); chrome.pageAction.onClicked.addListener(function(tab) { - var params = "url=" + encodeURI(tab.url); - var xhr = new XMLHttpRequest(); - xhr.open("POST", "https://match.audio/search", true); - xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); - xhr.onreadystatechange = function() { - if (xhr.readyState == 4) { - var match = JSON.parse(xhr.response); - if (match.id) { - chrome.tabs.create({ url: "https://match.audio/" + match.service + "/" + match.type + "/" + match.id}); - } - } - } - xhr.send(params); + chrome.pageAction.setIcon({tabId: tab.id, path: 'icon-blue-128.png'}, () => { + const headers = new Headers(); + headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); + fetch(apiUrl + '/search', {method: 'POST', mode: 'cors', headers, body: 'url=' + encodeURI(tab.url)}).then((response) => { + response.json().then((match) => { + chrome.pageAction.setIcon({tabId: tab.id, path: 'icon-128.png'}); + if (match.id) { + chrome.tabs.create({ url: apiUrl + '/' + match.service + '/' + match.type + '/' + match.id}); + } + }); + }).catch(() => { + chrome.pageAction.setIcon({tabId: tab.id, path: 'icon-128.png'}); + }); + }); }); diff --git a/chrome/src/google.js b/chrome/src/google.js new file mode 100644 index 0000000..7e50639 --- /dev/null +++ b/chrome/src/google.js @@ -0,0 +1,51 @@ +const apiUrl = 'https://match.audio'; + +var button = document.createElement('button'); +button.className = 'share-button'; +button.setAttribute('aria-label', 'Share to Match Audio'); + +var buttonContent = document.createElement('div'); +buttonContent.className = 'button-content'; +button.appendChild(buttonContent); + +var paperRipple = document.createElement('paper-ripple'); +paperRipple.class = 'circle'; +buttonContent.appendChild(paperRipple); + +var background = document.createElement('div'); +background.id = 'background'; +background.className = 'style-scope paper-ripple'; +paperRipple.appendChild(background); + +var waves = document.createElement('div'); +waves.id = 'waves'; +waves.className = 'style-scope paper-ripple'; +paperRipple.appendChild(waves); + +var img = document.createElement('img'); +img.src = 'https://match.audio/images/logo-128.png'; +img.height = 48; +buttonContent.appendChild(img) + +var buttonLabel = document.createElement('div'); +buttonLabel.className = 'button-label'; +buttonLabel.setAttribute('aria-hidden', true); +buttonLabel.innerText = 'Match Audio'; +buttonContent.appendChild(buttonLabel); + +// select the target node +document.addSelectorListener('.share-buttons', (event) => { + var input = event.target.parentElement.querySelector('paper-input input'); + // Check that it's an album or track, and not a playlist + const match = input.value.match(/https:\/\/play\.google\.com\/music\/m\/([a-zA-Z0-9]+)/); + if (match) { + event.target.insertBefore(button, event.target.firstChild); + button.addEventListener('click', (event) => { + if (match[1].startsWith('T')) { // Track + window.open(apiUrl + '/google/track/' + match[1], '_blank'); + } else if (match[1].startsWith('B')) { // Album + window.open(apiUrl + '/google/album/' + match[1], '_blank'); + } + }); + } +}); diff --git a/chrome/src/lib/selector-listener.js b/chrome/src/lib/selector-listener.js new file mode 100644 index 0000000..4a6dd91 --- /dev/null +++ b/chrome/src/lib/selector-listener.js @@ -0,0 +1,77 @@ +var events = {}, + selectors = {}, + styles = document.createElement('style'), + keyframes = document.createElement('style'), + head = document.getElementsByTagName('head')[0], + startNames = ['animationstart', 'oAnimationStart', 'MSAnimationStart', 'webkitAnimationStart'], + startEvent = function(event){ + event.selector = (events[event.animationName] || {}).selector; + ((this.selectorListeners || {})[event.animationName] || []).forEach(function(fn){ + fn.call(this, event); + }, this); + }, + prefix = (function() { + var duration = 'animation-duration: 0.001s;', + name = 'animation-name: SelectorListener !important;', + computed = window.getComputedStyle(document.documentElement, ''), + pre = (Array.prototype.slice.call(computed).join('').match(/moz|webkit|ms/)||(computed.OLink===''&&['o']))[0]; + return { + css: '-' + pre + '-', + properties: '{' + duration + name + '-' + pre + '-' + duration + '-' + pre + '-' + name + '}', + keyframes: !!(window.CSSKeyframesRule || window[('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1] + 'CSSKeyframesRule']) + }; + })(); + +styles.type = keyframes.type = 'text/css'; +head.appendChild(styles); +head.appendChild(keyframes); + +HTMLDocument.prototype.addSelectorListener = HTMLElement.prototype.addSelectorListener = function(selector, fn){ + var key = selectors[selector], + listeners = this.selectorListeners = this.selectorListeners || {}; + + if (key) events[key].count++; + else { + key = selectors[selector] = 'SelectorListener-' + new Date().getTime(); + var node = document.createTextNode('@' + (prefix.keyframes ? prefix.css : '') + 'keyframes ' + key + ' {' + +'from { outline-color: #fff; } to { outline-color: #000; }' + + '}'); + keyframes.appendChild(node); + styles.sheet.insertRule(selector + prefix.properties.replace(/SelectorListener/g, key), 0); + events[key] = { count: 1, selector: selector, keyframe: node, rule: styles.sheet.cssRules[0] }; + } + + if (listeners.count) listeners.count++; + else { + listeners.count = 1; + startNames.forEach(function(name){ + this.addEventListener(name, startEvent, false); + }, this); + } + + (listeners[key] = listeners[key] || []).push(fn); +}; + +HTMLDocument.prototype.removeSelectorListener = HTMLElement.prototype.removeSelectorListener = function(selector, fn){ + var listeners = this.selectorListeners || {}, + key = selectors[selector], + listener = listeners[key] || [], + index = listener.indexOf(fn); + + if (index > -1){ + var event = events[selectors[selector]]; + event.count--; + if (!event.count){ + styles.sheet.deleteRule(styles.sheet.cssRules.item(event.rule)); + keyframes.removeChild(event.keyframe); + delete events[key]; + delete selectors[selector]; + } + + listeners.count--; + listener.splice(index, 1); + if (!listeners.count) startNames.forEach(function(name){ + this.removeEventListener(name, startEvent, false); + }, this); + } +}; diff --git a/public/images/xbox.png b/public/images/xbox.png old mode 100755 new mode 100644 index ac50f95a1316a3e60086f5cb69cd209047236ad3..e1f097ab204bf1a3e4c32bc579d8af5c7f56ca62 GIT binary patch literal 17815 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 literal 4548 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 i&=%laXbW&IwEqP-R(wSJGHFl%0000