Browse Source

Make audio player using waveform-playlist

tags/v0.1.0
Gerben 5 years ago
parent
commit
92ad01083a
6 changed files with 536 additions and 5 deletions
  1. +82
    -0
      app/assets/main.css
  2. +160
    -0
      app/assets/waveform-playlist.css
  3. +8
    -0
      app/scripts/background.js
  4. +61
    -0
      app/scripts/contentscript.js
  5. +222
    -4
      package-lock.json
  6. +3
    -1
      package.json

+ 82
- 0
app/assets/main.css View File

@@ -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;
}

+ 160
- 0
app/assets/waveform-playlist.css View File

@@ -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 */

+ 8
- 0
app/scripts/background.js View File

@@ -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',
});
}
}



+ 61
- 0
app/scripts/contentscript.js View File

@@ -0,0 +1,61 @@
import * as WaveformPlaylist from 'waveform-playlist';

async function init() {
document.body.innerHTML = `
<main>
<div id="controls">
<button id="playpause">⏯</button>
<div>
<label for="volume" id="volume-label">🔊</label>
<input type="range" min="0" max="100" value="100" id="volume" />
</div>
</div>
<div id="container">
</div>
</main>
`;

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();

+ 222
- 4
package-lock.json View File

@@ -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",


+ 3
- 1
package.json View File

@@ -14,5 +14,7 @@
"devDependencies": {
"webextension-toolbox": "latest"
},
"dependencies": {}
"dependencies": {
"waveform-playlist": "^3.0.4"
}
}

Loading…
Cancel
Save