diff --git a/app/assets/main.css b/app/assets/main.css new file mode 100644 index 0000000..168df1b --- /dev/null +++ b/app/assets/main.css @@ -0,0 +1,82 @@ +body { + all: unset; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + user-select: none; +} + +main { + flex-grow: 1; + display: flex; +} + +#controls { + margin: 20px; + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; +} + +#container { + flex-grow: 1; + margin: 20px; +} + +button#playpause { + border: none; + background: none; + cursor: pointer; + font-size: 64px; + margin: 8px; + vertical-align: middle; + transition: all 50ms; +} + +button#playpause:hover, +button#playpause:focus { + filter: brightness(120%); + outline: none; +} + +button#playpause:active { + transform: translate(1px, 1px); +} + +label#volume-label { + font-size: 30px; + vertical-align: middle; +} + +input#volume { + vertical-align: middle; + width: 80px; + height: 30px; + border-radius: 3px; + background: #eee; + cursor: pointer; + -webkit-appearance: none; +} + +input#volume::-moz-range-thumb { + height: 30px; + width: 20px; + background-color: #999; + border-radius: 3px; +} + +input#volume::-webkit-slider-thumb { + height: 30px; + width: 20px; + background-color: #999; + border-radius: 3px; + -webkit-appearance: none; +} + +input#volume:hover, +input#volume:focus { + filter: brightness(102%); + outline: none; +} diff --git a/app/assets/waveform-playlist.css b/app/assets/waveform-playlist.css new file mode 100644 index 0000000..9d8ea52 --- /dev/null +++ b/app/assets/waveform-playlist.css @@ -0,0 +1,160 @@ +.playlist { + margin: 2em 0; } + .playlist .playlist-time-scale { + height: 30px; } + .playlist .playlist-tracks { + background: #E0EFF1; } + .playlist .channel { + background: grey; } + .playlist .channel-progress { + background: orange; } + .playlist .cursor { + background: black; } + .playlist .wp-fade { + background-color: rgba(0, 0, 0, 0.1); } + .playlist .state-cursor, + .playlist .state-select { + cursor: text; } + .playlist .state-fadein { + cursor: w-resize; } + .playlist .state-fadeout { + cursor: e-resize; } + .playlist .state-shift { + cursor: ew-resize; } + .playlist .selection.point { + background: red; } + .playlist .selection.segment { + background: rgba(0, 0, 0, 0.1); } + .playlist .channel-wrapper.silent .channel { + opacity: 0.3; } + .playlist .controls { + background: white; + text-align: center; } + .playlist .controls header { + overflow: hidden; + color: white; + background-color: blueviolet; + margin-bottom: 1em; + height: 20px; } + .playlist .controls label { + margin: 1em auto; + width: 100%; + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); } + .playlist .controls label:before { + content: "\f027"; + color: black; + font-size: 18px; + padding-right: 5px; + -moz-osx-font-smoothing: grayscale; } + .playlist .controls label:after { + content: "\f028"; + color: black; + font-size: 18px; + padding-left: 5px; } + .playlist .controls input[type=range] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + display: inline-block; + width: 75%; } + .playlist .controls input[type=range]::-webkit-slider-runnable-track { + height: 8px; + background: #ddd; + border: none; + border-radius: 3px; + padding: 1px; } + .playlist .controls input[type=range]::-moz-range-track { + height: 8px; + background: #ddd; + border: none; + border-radius: 3px; + padding: 1px; } + .playlist .controls input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: goldenrod; + margin-top: -5px; + cursor: ew-resize; } + .playlist .controls input[type=range]::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: goldenrod; + margin-top: -5px; + cursor: ew-resize; } + .playlist .controls input[type=range]:focus { + outline: none; } + .playlist .controls input[type=range]:focus::-webkit-slider-runnable-track { + background: #ccc; } + .playlist .controls input[type=range]:focus::-moz-range-track { + background: #ccc; } + .playlist .annotations .annotations-boxes { + text-align: center; } + .playlist .annotations .annotation-box { + border: 2px dashed grey; + padding: 0 10px; } + .playlist .annotations .annotation-box .resize-handle { + background: grey; + opacity: 0.3; + cursor: ew-resize; } + .playlist .annotations .annotation-box .id { + cursor: pointer; + display: inline-block; + width: 100%; + height: 100%; } + .playlist .annotations .annotations-text { + font-size: 19px; + font-weight: 300; + margin-top: 1em; + height: 160px; + overflow-x: hidden; + overflow-y: auto; } + .playlist .annotations .annotations-text .annotation { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: stretch; } + .playlist .annotations .annotations-text .annotation span { + margin: 0.3rem 0.6rem; } + .playlist .annotations .annotations-text .annotation span:last-of-type { + margin-right: 1.2rem; } + .playlist .annotations .annotations-text .annotation .annotation-id { + font-size: 16px; + line-height: 27px; } + .playlist .annotations .annotations-text .annotation .annotation-start { + font-size: 16px; + line-height: 27px; } + .playlist .annotations .annotations-text .annotation .annotation-end { + font-size: 16px; + line-height: 27px; } + .playlist .annotations .annotations-text .annotation .annotation-lines { + flex-grow: 10; } + .playlist .annotations .annotations-text .annotation .annotation-actions { + flex-basis: auto; + width: 80px; + text-align: right; + font-size: 16px; } + .playlist .annotations .annotations-text .annotation .annotation-actions i { + margin-right: 0.6rem; } + .playlist .annotations .annotations-text .annotation .annotation-actions i:last-of-type { + margin-right: 0; } + .playlist .annotations .annotations-text .annotation .annotation-actions i:hover { + color: orange; + cursor: pointer; } + .playlist .annotations .current { + background-color: #EBF4F6; } + +/*# sourceMappingURL=test.css.map */ diff --git a/app/scripts/background.js b/app/scripts/background.js index d2071d4..93e5535 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -8,6 +8,14 @@ async function onHeadersReceived({ responseHeaders, url, tabId }) { runAt: 'document_end', file: '/scripts/contentscript.js', }); + browser.tabs.insertCSS(tabId, { + runAt: 'document_end', + file: '/assets/main.css', + }); + browser.tabs.insertCSS(tabId, { + runAt: 'document_end', + file: '/assets/waveform-playlist.css', + }); } } diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index e69de29..e9981b4 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -0,0 +1,61 @@ +import * as WaveformPlaylist from 'waveform-playlist'; + +async function init() { + document.body.innerHTML = ` +
+
+ +
+ + +
+
+
+
+
+ `; + + const playlist = WaveformPlaylist.init({ + container: document.getElementById('container'), + timescale: true, + waveHeight: 100, + state: 'select', + }); + + const eventEmitter = playlist.getEventEmitter(); + + // Hook up play/pause and volume inputs + const playpauseEl = document.getElementById('playpause'); + const volumeEl = document.getElementById('volume'); + playpauseEl.addEventListener('click', + e => eventEmitter.emit(playlist.isPlaying() ? 'pause' : 'play') + ); + volumeEl.addEventListener('input', + e => eventEmitter.emit("mastervolumechange", e.target.value) + ); + + // Read target fragment from URL + let start, end; + const fragmentIdentifier = window.location.hash; + if (fragmentIdentifier) { + const match = fragmentIdentifier.match(/#t=(\d+(?:\.\d+)?)?(?:,(\d+(?:\.\d+)?))?/); + if (match) { + if (match[1] !== undefined) { + start = Number.parseFloat(match[1]); + } + if (match[2] !== undefined) { + end = Number.parseFloat(match[2]); + } + } + } + + await playlist.load([{ + src: document.URL, + selected: { start, end }, + }]); + + // Start playing. A tiny delay seems needed in Firefox to show the cursor at the right place. + requestAnimationFrame(() => eventEmitter.emit('play')); +} + +init(); diff --git a/package-lock.json b/package-lock.json index 82280d9..8a5af7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1390,6 +1390,11 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-split": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browser-split/-/browser-split-0.0.1.tgz", + "integrity": "sha1-ewl1dPjj6tYG+0Zk5krf3aKYGpM=" + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -1545,6 +1550,11 @@ "unset-value": "^1.0.0" } }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, "caniuse-lite": { "version": "1.0.30000999", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz", @@ -1867,6 +1877,15 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1968,6 +1987,11 @@ "path-type": "^3.0.0" } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -2054,6 +2078,16 @@ "prr": "~1.0.1" } }, + "error": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/error/-/error-4.4.0.tgz", + "integrity": "sha1-v2n/JR+0onnBmtzNqmth6Q2b8So=", + "requires": { + "camelize": "^1.0.0", + "string-template": "~0.2.0", + "xtend": "~4.0.0" + } + }, "es-abstract": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", @@ -2083,6 +2117,35 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2120,6 +2183,23 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "ev-store": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz", + "integrity": "sha1-GrDH+CE2UF3XSzHRdwHLK+bSZVg=", + "requires": { + "individual": "^3.0.0" + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", @@ -2272,6 +2352,19 @@ } } }, + "fade-curves": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fade-curves/-/fade-curves-1.0.2.tgz", + "integrity": "sha1-X7pvkoL8YUopJuhiHQQAaTJg0Ds=" + }, + "fade-maker": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fade-maker/-/fade-maker-1.0.3.tgz", + "integrity": "sha1-LK+3w6Z0vJFvISpNwnewI6dcNBo=", + "requires": { + "fade-curves": "^1.0.2" + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -3062,6 +3155,15 @@ } } }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3208,6 +3310,11 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "individual": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz", + "integrity": "sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0=" + }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -3230,6 +3337,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "inline-worker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/inline-worker/-/inline-worker-1.1.0.tgz", + "integrity": "sha1-VelvVJFaZCsAhyotqm/oMrQkyY0=" + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -3381,6 +3493,11 @@ } } }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3538,6 +3655,21 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.forown": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", + "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=" + }, "log-update": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", @@ -3656,6 +3788,14 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -3759,6 +3899,11 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mucss": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/mucss/-/mucss-1.1.5.tgz", + "integrity": "sha1-fNbsWVWQ5gPkg6ENaajsfdJwplY=" + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -3791,6 +3936,11 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -4126,8 +4276,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { "version": "2.0.1", @@ -4771,6 +4920,11 @@ "schema-utils": "^1.0.0" } }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -5105,6 +5259,11 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -5287,6 +5446,33 @@ "object.getownpropertydescriptors": "^2.0.3" } }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "virtual-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/virtual-dom/-/virtual-dom-2.1.1.tgz", + "integrity": "sha1-gO2i1IG57eDASRGM78tKBfIdE3U=", + "requires": { + "browser-split": "0.0.1", + "error": "^4.3.0", + "ev-store": "^7.0.0", + "global": "^4.3.0", + "is-object": "^1.0.1", + "next-tick": "^0.2.2", + "x-is-array": "0.1.0", + "x-is-string": "0.1.0" + }, + "dependencies": { + "next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" + } + } + }, "vm-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", @@ -5304,6 +5490,29 @@ "neo-async": "^2.5.0" } }, + "waveform-playlist": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/waveform-playlist/-/waveform-playlist-3.0.4.tgz", + "integrity": "sha1-7kCxarp48fHmQ+5SEyd6/FDfh0Y=", + "requires": { + "event-emitter": "^0.3.4", + "fade-curves": "^1.0.2", + "fade-maker": "^1.0.3", + "inline-worker": "^1.1.0", + "lodash.assign": "^4.0.0", + "lodash.defaults": "^4.0.0", + "lodash.forown": "^4.0.0", + "mucss": "^1.1.5", + "uuid": "^2.0.1", + "virtual-dom": "^2.1.1", + "webaudio-peaks": "^0.0.6" + } + }, + "webaudio-peaks": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/webaudio-peaks/-/webaudio-peaks-0.0.6.tgz", + "integrity": "sha1-DFeqnU/ZT68/UzI9vj9Xcnux6zQ=" + }, "webextension-polyfill": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz", @@ -5464,11 +5673,20 @@ "async-limiter": "~1.0.0" } }, + "x-is-array": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-array/-/x-is-array-0.1.0.tgz", + "integrity": "sha1-3lIBcdR7P0FvVYfWKbidJrEtwp0=" + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index f52cc07..c35175e 100644 --- a/package.json +++ b/package.json @@ -14,5 +14,7 @@ "devDependencies": { "webextension-toolbox": "latest" }, - "dependencies": {} + "dependencies": { + "waveform-playlist": "^3.0.4" + } }