NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Bandcamp Toggle Playback With Spacebar // @namespace https://openuserjs.org/users/burn // @version 1.11.0 // @description Press spacebar on Bandcamp to control music playback. // @author burn // @copyright 2020, burn (https://openuserjs.org/users/burn) // @license MIT // @updateURL https://openuserjs.org/meta/burn/Bandcamp_Toggle_Playback_With_Spacebar.meta.js // @downloadURL https://openuserjs.org/install/burn/Bandcamp_Toggle_Playback_With_Spacebar.user.js // @match https://*.bandcamp.com/* // @include https://*.bandcamp.com/* // @grant none // @run-at document-end // ==/UserScript== // ==OpenUserJS== // @author burn // ==/OpenUserJS== (function() { 'use strict'; const DBG = false; let log = function(s) { return (DBG && console.log(s)); }, qS = function(el, scope) { scope = (typeof scope === 'object') ? scope : document; return scope.querySelector(el) || false; }, qSall = function(els, scope) { scope = (typeof scope === 'object') ? scope : document; return scope.querySelectorAll(els) || false; }, hidden, visibilityChange, state, tabFocused = function(evt) { log("tab has focus!"); if (document !== evt.target) { log("warning, document not equal to document. it is "); log(evt.target); // should be document } if (evt.target.body !== document.activeElement) { log("warning, document.activeElement not equal to document.body. it is "); log(evt.target.body); // should be document.body } }, elmTarget = qS("#trackInfoInner > div.inline_player > table > tbody > tr:nth-child(1) > td.play_cell > a > div"); if (!elmTarget) { log('main play button not found, exiting'); return; } if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support hidden = "hidden"; visibilityChange = "visibilitychange"; state = "visibilityState"; } else if (typeof document.mozHidden !== "undefined") { hidden = "mozHidden"; visibilityChange = "mozvisibilitychange"; state = "mozVisibilityState"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden"; visibilityChange = "msvisibilitychange"; state = "msVisibilityState"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden"; visibilityChange = "webkitvisibilitychange"; state = "webkitVisibilityState"; } if ('undefined' === typeof hidden) { log('document.hidden not found, exiting'); return; } document.addEventListener(visibilityChange, function(e) { return (false === document[hidden]) && tabFocused(e); }); window.addEventListener('keydown', function(e) { log("in keydown"); if(e.key === " " && e.target === document.body) { log("keydown ok"); e.preventDefault(); } }); qS('body').addEventListener("keyup", function(e) { log("in keyup"); if (e.key === " " && e.target === document.body) { e.preventDefault(); elmTarget.focus(); elmTarget.click(); elmTarget.blur(); log("keyup ok"); } }); })();