Moved Knob into project. Replace mediainfo. Unmount client

when switching pages.
This commit is contained in:
empathicqubit 2018-05-27 17:45:42 -04:00
parent 8469c37254
commit a28938aaa2
13 changed files with 594 additions and 90 deletions

View file

@ -5,20 +5,18 @@
"dependencies": {
"material-design-icons": "^3.0.1",
"react": "^16.3.2",
"react-canvas-knob": "^0.5.0",
"react-dom": "^16.3.2",
"react-draggable": "^3.0.5",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",
"react-scripts": "1.1.4",
"react-transform-catch-errors": "^1.0.2",
"react-transform-hmr": "^1.0.4",
"redbox-react": "^1.6.0",
"startaudiocontext": "^1.2.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"build": "NODE_ENV=production react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}

365
frontend/src/Knob.js Normal file
View file

@ -0,0 +1,365 @@
import React from 'react';
import PropTypes from 'prop-types';
class Knob extends React.Component {
static propTypes = {
value: PropTypes.number.isRequired,
onChange: PropTypes.func.isRequired,
onChangeEnd: PropTypes.func,
min: PropTypes.number,
max: PropTypes.number,
step: PropTypes.number,
log: PropTypes.bool,
width: PropTypes.number,
height: PropTypes.number,
thickness: PropTypes.number,
lineCap: PropTypes.oneOf(['butt', 'round']),
bgColor: PropTypes.string,
fgColor: PropTypes.string,
inputColor: PropTypes.string,
font: PropTypes.string,
fontWeight: PropTypes.string,
clockwise: PropTypes.bool,
cursor: PropTypes.oneOfType([
PropTypes.number,
PropTypes.bool,
]),
stopper: PropTypes.bool,
readOnly: PropTypes.bool,
disableTextInput: PropTypes.bool,
displayInput: PropTypes.bool,
displayCustom: PropTypes.func,
angleArc: PropTypes.number,
angleOffset: PropTypes.number,
disableMouseWheel: PropTypes.bool,
title: PropTypes.string,
className: PropTypes.string,
canvasClassName: PropTypes.string,
};
static defaultProps = {
onChangeEnd: () => {},
min: 0,
max: 100,
step: 1,
log: false,
width: 200,
height: 200,
thickness: 0.35,
lineCap: 'butt',
bgColor: '#EEE',
fgColor: '#EA2',
inputColor: '',
font: 'Arial',
fontWeight: 'bold',
clockwise: true,
cursor: false,
stopper: true,
readOnly: false,
disableTextInput: false,
displayInput: true,
angleArc: 360,
angleOffset: 0,
disableMouseWheel: false,
className: null,
canvasClassName: null,
};
constructor(props) {
super(props);
this.w = this.props.width || 200;
this.h = this.props.height || this.w;
this.cursorExt = this.props.cursor === true ? 0.3 : this.props.cursor / 100;
this.angleArc = this.props.angleArc * Math.PI / 180;
this.angleOffset = this.props.angleOffset * Math.PI / 180;
this.startAngle = (1.5 * Math.PI) + this.angleOffset;
this.endAngle = (1.5 * Math.PI) + this.angleOffset + this.angleArc;
this.digits = Math.max(
String(Math.abs(this.props.min)).length,
String(Math.abs(this.props.max)).length,
2
) + 2;
}
componentDidMount() {
this.drawCanvas();
if (!this.props.readOnly) {
this.canvasRef.addEventListener('touchstart', this.handleTouchStart, { passive: false });
}
}
componentWillReceiveProps(nextProps) {
if (nextProps.width && this.w !== nextProps.width) {
this.w = nextProps.width;
}
if (nextProps.height && this.h !== nextProps.height) {
this.h = nextProps.height;
}
}
componentDidUpdate() {
this.drawCanvas();
}
componentWillUnmount() {
this.canvasRef.removeEventListener('touchstart', this.handleTouchStart);
}
getArcToValue = (v) => {
let startAngle;
let endAngle;
const angle = !this.props.log
? ((v - this.props.min) * this.angleArc) / (this.props.max - this.props.min)
: Math.log(Math.pow((v / this.props.min), this.angleArc)) / Math.log(this.props.max / this.props.min);
if (!this.props.clockwise) {
startAngle = this.endAngle + 0.00001;
endAngle = startAngle - angle - 0.00001;
} else {
startAngle = this.startAngle - 0.00001;
endAngle = startAngle + angle + 0.00001;
}
if (this.props.cursor) {
startAngle = endAngle - this.cursorExt;
endAngle += this.cursorExt;
}
return {
startAngle,
endAngle,
acw: !this.props.clockwise && !this.props.cursor,
};
};
// Calculate ratio to scale canvas to avoid blurriness on HiDPI devices
getCanvasScale = (ctx) => {
const devicePixelRatio = window.devicePixelRatio ||
window.screen.deviceXDPI / window.screen.logicalXDPI || // IE10
1;
const backingStoreRatio = ctx.webkitBackingStorePixelRatio || 1;
return devicePixelRatio / backingStoreRatio;
};
coerceToStep = (v) => {
let val = !this.props.log
? (~~(((v < 0) ? -0.5 : 0.5) + (v / this.props.step))) * this.props.step
: Math.pow(this.props.step, ~~(((Math.abs(v) < 1) ? -0.5 : 0.5) + (Math.log(v) / Math.log(this.props.step))));
val = Math.max(Math.min(val, this.props.max), this.props.min);
if (isNaN(val)) { val = 0; }
return Math.round(val * 1000) / 1000;
};
eventToValue = (e) => {
const bounds = this.canvasRef.getBoundingClientRect();
const x = e.clientX - bounds.left;
const y = e.clientY - bounds.top;
let a = Math.atan2(x - (this.w / 2), (this.w / 2) - y) - this.angleOffset;
if (!this.props.clockwise) {
a = this.angleArc - a - (2 * Math.PI);
}
if (this.angleArc !== Math.PI * 2 && (a < 0) && (a > -0.5)) {
a = 0;
} else if (a < 0) {
a += Math.PI * 2;
}
const val = !this.props.log
? (a * (this.props.max - this.props.min) / this.angleArc) + this.props.min
: Math.pow(this.props.max / this.props.min, a / this.angleArc) * this.props.min;
return this.coerceToStep(val);
};
handleMouseDown = (e) => {
this.props.onChange(this.eventToValue(e));
document.addEventListener('mousemove', this.handleMouseMove);
document.addEventListener('mouseup', this.handleMouseUp);
document.addEventListener('keyup', this.handleEsc);
};
handleMouseMove = (e) => {
e.preventDefault();
this.props.onChange(this.eventToValue(e));
};
handleMouseUp = (e) => {
this.props.onChangeEnd(this.eventToValue(e));
document.removeEventListener('mousemove', this.handleMouseMove);
document.removeEventListener('mouseup', this.handleMouseUp);
document.removeEventListener('keyup', this.handleEsc);
};
handleTouchStart = (e) => {
e.preventDefault();
this.touchIndex = e.targetTouches.length - 1;
this.props.onChange(this.eventToValue(e.targetTouches[this.touchIndex]));
document.addEventListener('touchmove', this.handleTouchMove, { passive: false });
document.addEventListener('touchend', this.handleTouchEnd);
document.addEventListener('touchcancel', this.handleTouchEnd);
};
handleTouchMove = (e) => {
e.preventDefault();
this.props.onChange(this.eventToValue(e.targetTouches[this.touchIndex]));
};
handleTouchEnd = (e) => {
this.props.onChangeEnd(this.eventToValue(e));
document.removeEventListener('touchmove', this.handleTouchMove);
document.removeEventListener('touchend', this.handleTouchEnd);
document.removeEventListener('touchcancel', this.handleTouchEnd);
};
handleEsc = (e) => {
if (e.keyCode === 27) {
e.preventDefault();
this.handleMouseUp();
}
};
handleTextInput = (e) => {
const val = Math.max(Math.min(+e.target.value, this.props.max), this.props.min) || this.props.min;
this.props.onChange(val);
};
handleWheel = (e) => {
e.preventDefault();
if (e.deltaX > 0 || e.deltaY > 0) {
this.props.onChange(this.coerceToStep(
!this.props.log
? this.props.value + this.props.step
: this.props.value * this.props.step
));
} else if (e.deltaX < 0 || e.deltaY < 0) {
this.props.onChange(this.coerceToStep(
!this.props.log
? this.props.value - this.props.step
: this.props.value / this.props.step
));
}
};
handleArrowKey = (e) => {
if (e.keyCode === 37 || e.keyCode === 40) {
e.preventDefault();
this.props.onChange(this.coerceToStep(
!this.props.log
? this.props.value - this.props.step
: this.props.value / this.props.step
));
} else if (e.keyCode === 38 || e.keyCode === 39) {
e.preventDefault();
this.props.onChange(this.coerceToStep(
!this.props.log
? this.props.value + this.props.step
: this.props.value * this.props.step
));
}
};
inputStyle = () => ({
width: `${((this.w / 2) + 4) >> 0}px`,
height: `${(this.w / 3) >> 0}px`,
position: 'absolute',
verticalAlign: 'middle',
marginTop: `${(this.w / 3) >> 0}px`,
marginLeft: `-${((this.w * 3 / 4) + 2) >> 0}px`,
border: 0,
background: 'none',
font: `${this.props.fontWeight} ${(this.w / this.digits) >> 0}px ${this.props.font}`,
textAlign: 'center',
color: this.props.inputColor || this.props.fgColor,
padding: '0px',
WebkitAppearance: 'none',
});
drawCanvas() {
const ctx = this.canvasRef.getContext('2d');
const scale = this.getCanvasScale(ctx);
this.canvasRef.width = this.w * scale; // clears the canvas
this.canvasRef.height = this.h * scale;
ctx.scale(scale, scale);
this.xy = this.w / 2; // coordinates of canvas center
this.lineWidth = this.xy * this.props.thickness;
this.radius = this.xy - (this.lineWidth / 2);
ctx.lineWidth = this.lineWidth;
ctx.lineCap = this.props.lineCap;
// background arc
ctx.beginPath();
ctx.strokeStyle = this.props.bgColor;
ctx.arc(
this.xy,
this.xy,
this.radius,
this.endAngle - 0.00001,
this.startAngle + 0.00001,
true
);
ctx.stroke();
// foreground arc
const a = this.getArcToValue(this.props.value);
ctx.beginPath();
ctx.strokeStyle = this.props.fgColor;
ctx.arc(
this.xy,
this.xy,
this.radius,
a.startAngle,
a.endAngle,
a.acw
);
ctx.stroke();
}
renderCenter = () => {
const {
displayCustom,
displayInput,
disableTextInput,
readOnly,
value,
} = this.props;
if (displayInput) {
return (
<input
style={this.inputStyle()}
type="text"
value={value}
onChange={this.handleTextInput}
onKeyDown={this.handleArrowKey}
readOnly={readOnly || disableTextInput}
/>
);
} else if (displayCustom && typeof displayCustom === 'function') {
return displayCustom();
}
return null;
};
render() {
const {
canvasClassName,
className,
disableMouseWheel,
readOnly,
title,
value,
} = this.props;
return (
<div
className={className}
style={{ width: this.w, height: this.h, display: 'inline-block' }}
onWheel={readOnly || disableMouseWheel ? null : this.handleWheel}
>
<canvas
ref={(ref) => { this.canvasRef = ref; }}
className={canvasClassName}
style={{ width: '100%', height: '100%' }}
onMouseDown={readOnly ? null : this.handleMouseDown}
title={title ? `${title}: ${value}` : value}
/>
{this.renderCenter()}
</div>
);
}
}
export default Knob;

View file

@ -240,6 +240,11 @@ class BufferClientBackend {
});
}
close() {
this._context.close();
this._ws.onclose = () => {};
this._ws.close();
}
resume() {
this._context.resume();
}

View file

@ -43,6 +43,10 @@ function getProps(render) {
});
};
client.onComponentUnmount = () => {
backend.close();
}
return client;
};

View file

@ -76,6 +76,9 @@ function getProps (render) {
client.name = name;
render();
},
onComponentUnmount: () => {
backend.close();
}
};
StartAudioContext(backend._context, '.playit')

View file

@ -17,6 +17,8 @@ import getAdminProps from './controller/admin';
import Simulator from './view/simulator';
import getSimulatorProps from './controller/simulator';
registerServiceWorker();
const render = () => ReactDOM.render(router(), document.getElementById('root'));
let clientProps, adminProps, simulatorProps;
@ -33,4 +35,3 @@ const router = () => {
};
render();
registerServiceWorker();

View file

@ -1,7 +1,7 @@
import _ from 'lodash';
import React from 'react';
import ReactDOM from 'react-dom';
import Knob from 'react-canvas-knob';
import Knob from '../Knob';
import './admin.css';

View file

@ -6,6 +6,9 @@ class BufferClient extends React.Component {
constructor(props) {
super(props);
}
componentWillUnmount() {
this.props.onComponentUnmount && this.props.onComponentUnmount();
}
render() {
let enabledSources = this.props.sources.filter(source => source.enabled);
return (

View file

@ -2054,10 +2054,6 @@ dom-urls@^1.1.0:
dependencies:
urijs "^1.16.1"
dom-walk@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
domain-browser@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@ -2966,13 +2962,6 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
global@^4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
dependencies:
min-document "^2.19.0"
process "~0.5.1"
globals@^9.17.0, globals@^9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@ -4264,7 +4253,7 @@ lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
"lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1:
"lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
@ -4462,12 +4451,6 @@ mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
dependencies:
dom-walk "^0.1.0"
minimalistic-assert@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@ -5408,10 +5391,6 @@ process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
progress@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
@ -5553,16 +5532,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-canvas-knob@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/react-canvas-knob/-/react-canvas-knob-0.5.0.tgz#5712742379345ab872d7999046989cf2be574172"
dependencies:
prop-types "^15.5.10"
react-deep-force-update@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c"
react-dev-utils@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.1.tgz#1f396e161fe44b595db1b186a40067289bf06613"
@ -5606,13 +5575,6 @@ react-error-overlay@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4"
react-proxy@^1.1.7:
version "1.1.8"
resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a"
dependencies:
lodash "^4.6.1"
react-deep-force-update "^1.0.0"
react-router-dom@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d"
@ -5685,13 +5647,6 @@ react-transform-catch-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/react-transform-catch-errors/-/react-transform-catch-errors-1.0.2.tgz#1b4d4a76e97271896fc16fe3086c793ec88a9eeb"
react-transform-hmr@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb"
dependencies:
global "^4.3.0"
react-proxy "^1.1.7"
react@^16.3.2:
version "16.3.2"
resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9"

View file

@ -6,7 +6,7 @@ const q = require('q');
const fs = require('fs');
const cors = require('cors');
const execFile = q.denodeify(require('child_process').execFile);
const mediainfo = q.denodeify(require('mediainfo-parser').exec);
const musicMetadata = require('music-metadata');
const path = require('path');
const ws = require('./ws');
const config = require('./config.js');
@ -17,7 +17,7 @@ const app = express();
app.listen(3030, () => console.log('Listening...'));
const whitelist = ['http://localhost:3032', new RegExp('^http://.*:3032')];
const whitelist = ['http://localhost:3032', new RegExp('^http://.*:3032'), new RegExp('^http://.*:3000')];
const corsOptions = {
origin: (origin, callback) => {
@ -41,8 +41,10 @@ app.get('/files.json', cors(corsOptions), (req, res) => {
const getDuration = (filename) => {
return q.resolve()
.then(() => mediainfo(filename))
.then(meta => meta.file.track[0].duration );
.then(() => musicMetadata.parseFile(filename))
.then(meta => {
return meta.format.duration * 1000;
});
};
q.resolve()

View file

@ -6,12 +6,10 @@
"scripts": {
"debug": "npm-run-all --parallel frontend debug-server",
"debug-server": "nodemon --inspect-brk=0.0.0.0:9229 ./index.js",
"frontend": "cd ./frontend && yarn install && yarn run start",
"server": "node ./index.js",
"latency": "npm-run-all --parallel static latency-server",
"latency-server": "node ./latency.js"
"debug-frontend": "cd ./frontend && yarn install && yarn run start",
"start": "npm-run-all --parallel frontend server",
"frontend": "cd ./frontend && yarn install && yarn run build && npx static-html-server -p 3000 -r ./build -f index.html",
"server": "node ./index.js"
},
"dependencies": {
"cors": "^2.8.4",
@ -19,7 +17,7 @@
"express": "^4.16.2",
"http-server": "^0.10.0",
"lowdb": "^1.0.0",
"mediainfo-parser": "^1.1.5",
"music-metadata": "^1.1.0",
"node-storage": "^0.0.7",
"npm-run-all": "^4.1.2",
"q": "^1.5.1",

1
ws.js
View file

@ -5,7 +5,6 @@ const q = require('q');
const fs = require('fs');
const cors = require('cors');
const execFile = q.denodeify(require('child_process').execFile);
const mediainfo = q.denodeify(require('mediainfo-parser').exec);
const path = require('path');
const lowdb = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

225
yarn.lock
View file

@ -24,6 +24,15 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ajv@^5.1.0:
version "5.5.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
dependencies:
co "^4.6.0"
fast-deep-equal "^1.0.0"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.3.0"
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@ -84,6 +93,12 @@ are-we-there-yet@~1.1.2:
delegates "^1.0.0"
readable-stream "^2.0.6"
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
dependencies:
sprintf-js "~1.0.2"
args@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/args/-/args-4.0.0.tgz#5ca24cdba43d4b17111c56616f5f2e9d91933954"
@ -159,10 +174,18 @@ aws-sign2@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
aws4@^1.2.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
aws4@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@ -189,7 +212,7 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
bluebird@3.5.1:
bluebird@3.5.1, bluebird@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
@ -356,6 +379,12 @@ colors@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
combined-stream@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
dependencies:
delayed-stream "~1.0.0"
combined-stream@^1.0.5, combined-stream@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
@ -430,6 +459,16 @@ corser@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
coveralls@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.1.tgz#12e15914eaa29204e56869a5ece7b9e1492d2ae2"
dependencies:
js-yaml "^3.6.1"
lcov-parse "^0.0.10"
log-driver "^1.2.5"
minimist "^1.2.0"
request "^2.79.0"
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@ -470,6 +509,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.8:
dependencies:
ms "2.0.0"
debug@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
decamelize@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -593,6 +638,10 @@ escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
esprima@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
@ -684,7 +733,7 @@ express@^4.16.2:
utils-merge "1.0.1"
vary "~1.1.2"
extend@~3.0.0:
extend@~3.0.0, extend@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
@ -702,6 +751,14 @@ extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
filename-regex@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@ -758,6 +815,14 @@ form-data@~2.1.1:
combined-stream "^1.0.5"
mime-types "^2.1.12"
form-data@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
dependencies:
asynckit "^0.4.0"
combined-stream "1.0.6"
mime-types "^2.1.12"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@ -770,7 +835,7 @@ from@~0:
version "0.1.7"
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
fs-extra@5.0.0:
fs-extra@5.0.0, fs-extra@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
dependencies:
@ -778,6 +843,14 @@ fs-extra@5.0.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
dependencies:
graceful-fs "^4.1.2"
jsonfile "^4.0.0"
universalify "^0.1.0"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@ -897,6 +970,10 @@ har-schema@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
har-validator@~4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
@ -904,6 +981,13 @@ har-validator@~4.2.1:
ajv "^4.9.1"
har-schema "^1.0.5"
har-validator@~5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
dependencies:
ajv "^5.1.0"
har-schema "^2.0.0"
has-flag@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
@ -980,6 +1064,14 @@ http-signature@~1.1.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
@ -1174,6 +1266,13 @@ isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
js-yaml@^3.6.1:
version "3.11.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@ -1182,6 +1281,10 @@ json-parse-better-errors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
@ -1237,6 +1340,10 @@ lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
lcov-parse@^0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
leven@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
@ -1250,10 +1357,14 @@ load-json-file@^4.0.0:
pify "^3.0.0"
strip-bom "^3.0.0"
lodash@4, lodash@^4.16.4:
lodash@4:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
log-driver@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@ -1293,13 +1404,6 @@ media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
mediainfo-parser@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/mediainfo-parser/-/mediainfo-parser-1.1.5.tgz#5a0c0584b1b5aeb79d089ffd9d67c747ad1ff2d7"
dependencies:
lodash "^4.16.4"
xml2js "^0.4.17"
memorystream@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
@ -1353,7 +1457,7 @@ mime-db@~1.30.0:
version "1.30.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
mime-types@2.1.18:
mime-types@2.1.18, mime-types@~2.1.17:
version "2.1.18"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
dependencies:
@ -1405,6 +1509,17 @@ ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
music-metadata@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-1.1.0.tgz#0f08dd39115546408d01ea7cc858ace48ffeb40f"
dependencies:
bluebird "^3.5.1"
debug "^3.1.0"
fs-extra "^6.0.1"
strtok3 "^1.4.2"
then-read-stream "^1.1.3"
token-types "^0.9.4"
nan@^2.3.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
@ -1514,7 +1629,7 @@ number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
oauth-sign@~0.8.1:
oauth-sign@~0.8.1, oauth-sign@~0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
@ -1650,6 +1765,10 @@ performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
@ -1721,6 +1840,10 @@ qs@~6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
qs@~6.5.1:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
randomatic@^1.1.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
@ -1844,6 +1967,31 @@ request@2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@^2.79.0:
version "2.87.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.6.0"
caseless "~0.12.0"
combined-stream "~1.0.5"
extend "~3.0.1"
forever-agent "~0.6.1"
form-data "~2.3.1"
har-validator "~5.0.3"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.17"
oauth-sign "~0.8.2"
performance-now "^2.1.0"
qs "~6.5.1"
safe-buffer "^5.1.1"
tough-cookie "~2.3.3"
tunnel-agent "^0.6.0"
uuid "^3.1.0"
requires-port@1.x.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@ -1864,9 +2012,9 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
sax@>=0.6.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
safe-buffer@^5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
semver-diff@^2.0.0:
version "2.1.0"
@ -2026,6 +2174,10 @@ split@0.3:
dependencies:
through "2"
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
sshpk@^1.7.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
@ -2117,6 +2269,16 @@ strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
strtok3@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-1.4.2.tgz#39aa7990a99edbdb4a94cfa8f0df27b2d6b03cb2"
dependencies:
bluebird "^3.5.1"
coveralls "^3.0.1"
fs-extra "^5.0.0"
then-read-stream "^1.1.3"
token-types "^0.9.4"
supports-color@^4.0.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
@ -2156,6 +2318,12 @@ term-size@^1.2.0:
dependencies:
execa "^0.7.0"
then-read-stream@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/then-read-stream/-/then-read-stream-1.1.3.tgz#1940a884649ca63636bd55e924d4c6f874aea7db"
dependencies:
bluebird "^3.5.1"
through@2, through@~2.3, through@~2.3.1:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -2164,6 +2332,10 @@ timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
token-types@^0.9.4:
version "0.9.4"
resolved "https://registry.yarnpkg.com/token-types/-/token-types-0.9.4.tgz#ea24c5c3fc577292a1d362a252e348a0016361ad"
touch@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
@ -2176,6 +2348,12 @@ tough-cookie@~2.3.0:
dependencies:
punycode "^1.4.1"
tough-cookie@~2.3.3:
version "2.3.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
dependencies:
punycode "^1.4.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@ -2285,6 +2463,10 @@ uuid@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
uuid@^3.1.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
@ -2358,17 +2540,6 @@ xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
xml2js@^0.4.17:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
dependencies:
sax ">=0.6.0"
xmlbuilder "~9.0.1"
xmlbuilder@~9.0.1:
version "9.0.4"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f"
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"