From 46fbedf0ad7b167a28daf2030e06f34480576394 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Sun, 3 Jun 2018 02:25:34 +0200 Subject: add results page --- public/assets/css/css.css | 55 ++- public/bundle.js | 827 ++++++++++++++++++++++++++++++++++++---------- public/bundle.js.map | 2 +- 3 files changed, 691 insertions(+), 193 deletions(-) (limited to 'public') diff --git a/public/assets/css/css.css b/public/assets/css/css.css index dff2486..0c14c4d 100644 --- a/public/assets/css/css.css +++ b/public/assets/css/css.css @@ -30,6 +30,9 @@ header span > span:first-child { h1, h2, h3 { margin: 0; } +h1 { + font-size: 18px; +} h2 { font-size: 14px; } @@ -193,11 +196,18 @@ h3 { text-align: right; } .filelist .date { - width: 70px; + width: 60px; } .filelist .datetime { width: 100px; } +.filelist .epoch { + width: 45px; +} + +.row .epoch { + white-space: nowrap; +} /* folder list / bluebox */ .bluebox, @@ -256,34 +266,39 @@ h3 { } .lossGraph h3 { margin: 10px; - background: white; padding: 10px; + background: white; + font-size: 14px; } /* datasets */ -.datasets .row.dataset > .col:nth-child(1) { min-width: 350px; } -.datasets .row.dataset > .col:nth-child(2) { min-width: 100px; } -.datasets .row.dataset > .col:nth-child(3) { min-width: 230px; } +.datasets .row.dataset { + max-width: 100vw; + flex-wrap: wrap; +} +.datasets .row.dataset > .col:nth-child(1) { min-width: 300px; } +.datasets .row.dataset > .col:nth-child(2) { min-width: 60px; } +.datasets .row.dataset > .col:nth-child(3) { min-width: 200px; } .datasets .row.dataset > .col:nth-child(4) { min-width: 350px; } .datasets .row.dataset > .col { - padding-top: 3px; - padding-bottom: 0; + padding: 0; } -.datasets .dataset:first-child > .col:nth-child(2), -.datasets .dataset:first-child > .col:nth-child(3), .datasets .dataset:first-child > .col { - padding: 0 0 0 8px; + padding: 0 0 8px 2px; font-size: larger; + opacity: 0.9; } -.datasets .dataset > .col:nth-child(2) div { - padding-top: 3px; +.datasets .dataset:first-child > .col:first-child { + padding: 0 0 3px 0px; +} +.datasets .dataset > .col:nth-child(2) > div { + padding-top: 6px; } -.datasets .dataset > .col:nth-child(2), -.datasets .dataset > .col:nth-child(3) { - padding-top: 7px; - padding-bottom: 0; +.datasets .dataset > .col:nth-child(3) > div { + padding-top: 3px; } -.dataset .checkpoint .filename { +.dataset .filename, +.dataset .filelist .filename { max-width: 160px; } .input_file { @@ -296,6 +311,12 @@ h3 { display: inline-block; margin-right: 4px; } +.checkpoint .filename { + max-width: 100px; +} +.unpersisted { + opacity: 0.5; +} /* bucky bogart.css color shading :) */ .new { color: #000000; font-weight: bold; } diff --git a/public/bundle.js b/public/bundle.js index a5985c1..976a3c4 100644 --- a/public/bundle.js +++ b/public/bundle.js @@ -451,7 +451,7 @@ exports.actions = exports.parser = exports.util = undefined; var _crud = __webpack_require__(/*! ./crud.actions */ "./app/client/api/crud.actions.js"); -var _util = __webpack_require__(/*! ../util */ "./app/client/util.js"); +var _util = __webpack_require__(/*! ../util */ "./app/client/util/index.js"); var util = _interopRequireWildcard(_util); @@ -946,9 +946,7 @@ exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)( Object.defineProperty(exports, "__esModule", { value: true }); -exports.FileRow = exports.fieldSet = exports.orderByFn = exports.FileList = undefined; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); +exports.FileRow = exports.fieldSet = exports.FileList = undefined; var _preact = __webpack_require__(/*! preact */ "./node_modules/preact/dist/preact.esm.js"); @@ -962,7 +960,7 @@ var _moment = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js var _moment2 = _interopRequireDefault(_moment); -var _util = __webpack_require__(/*! ../util */ "./app/client/util.js"); +var _util = __webpack_require__(/*! ../util */ "./app/client/util/index.js"); var util = _interopRequireWildcard(_util); @@ -970,7 +968,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var defaultFields = new Set(['date', 'size']); +var defaultFields = new Set(['name', 'date', 'size']); var FileList = exports.FileList = function FileList(props) { var files = props.files, @@ -988,9 +986,9 @@ var FileList = exports.FileList = function FileList(props) { _props$rowClassName = props.rowClassName, rowClassName = _props$rowClassName === undefined ? 'row file' : _props$rowClassName; - var _orderByFn = orderByFn(orderBy), - mapFn = _orderByFn.mapFn, - sortFn = _orderByFn.sortFn; + var _util$sort$orderByFn = util.sort.orderByFn(orderBy), + mapFn = _util$sort$orderByFn.mapFn, + sortFn = _util$sort$orderByFn.sortFn; var fileList = (files || []).map(mapFn).sort(sortFn).map(function (pair) { return (0, _preact.h)(FileRow, { @@ -1025,64 +1023,6 @@ var FileList = exports.FileList = function FileList(props) { ); }; -var numericSort = { - asc: function asc(a, b) { - return a[0] - b[0]; - }, - desc: function desc(a, b) { - return b[0] - a[0]; - } -}; -var stringSort = { - asc: function asc(a, b) { - return a[0].localeCompare(b[0]); - }, - desc: function desc(a, b) { - return b[0].localeCompare(a[0]); - } -}; -var orderByFn = exports.orderByFn = function orderByFn() { - var s = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'name asc'; - - var _s$split = s.split(' '), - _s$split2 = _slicedToArray(_s$split, 2), - _s$split2$ = _s$split2[0], - field = _s$split2$ === undefined ? 'name' : _s$split2$, - _s$split2$2 = _s$split2[1], - direction = _s$split2$2 === undefined ? 'asc' : _s$split2$2; - - var mapFn = void 0, - sortFn = void 0; - switch (field) { - case 'epoch': - mapFn = function mapFn(a) { - return [a.epoch || a.epochs, a]; - }; - sortFn = numericSort[direction]; - break; - case 'size': - mapFn = function mapFn(a) { - return [a.size, a]; - }; - sortFn = numericSort[direction]; - break; - case 'date': - mapFn = function mapFn(a) { - return [+new Date(a.date || a.created_at), a]; - }; - sortFn = numericSort[direction]; - break; - case 'name': - default: - mapFn = function mapFn(a) { - return [a.id || a.name, a]; - }; - sortFn = stringSort[direction]; - break; - } - return { mapFn: mapFn, sortFn: sortFn }; -}; - var fieldSet = exports.fieldSet = function fieldSet(fields) { if (fields) { if (fields instanceof Set) { @@ -1106,16 +1046,17 @@ var FileRow = exports.FileRow = function FileRow(props) { var size = util.hush_size(file.size); var date = file.date || file.created_at; + var epoch = file.epoch || file.epochs || 0; return (0, _preact.h)( 'div', { 'class': className, key: file.name }, - (0, _preact.h)( + fields.has('name') && (0, _preact.h)( 'div', { className: 'filename', title: file.name || file.url }, file.persisted === false ? (0, _preact.h)( 'span', - null, + { className: 'unpersisted' }, file.name || file.url ) : linkFiles && file.url ? (0, _preact.h)( 'a', @@ -1139,6 +1080,11 @@ var FileRow = exports.FileRow = function FileRow(props) { { className: "username" }, username ), + fields.has('epoch') && (0, _preact.h)( + 'div', + { className: "epoch " + util.hush_null(epoch)[0] }, + epoch > 0 ? 'ep. ' + epoch : '' + ), fields.has('date') && (0, _preact.h)( 'div', { className: "date " + util.carbon_date(date) }, @@ -1154,11 +1100,6 @@ var FileRow = exports.FileRow = function FileRow(props) { { className: "size " + size[0] }, size[1] ), - fields.has('epoch') && (0, _preact.h)( - 'div', - { className: 'epoch' }, - file.epoch > 0 ? 'epoch ' + file.epoch : ' ' - ), (fields.has('activity') || fields.has('module')) && (0, _preact.h)( 'div', { className: 'activity' }, @@ -2316,7 +2257,7 @@ var _reactRedux = __webpack_require__(/*! react-redux */ "./node_modules/react-r var _redux = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); -var _util = __webpack_require__(/*! ../util */ "./app/client/util.js"); +var _util = __webpack_require__(/*! ../util */ "./app/client/util/index.js"); var util = _interopRequireWildcard(_util); @@ -2957,7 +2898,7 @@ var _socket = __webpack_require__(/*! ./socket */ "./app/client/socket/index.js" var socket = _interopRequireWildcard(_socket); -var _util = __webpack_require__(/*! ./util */ "./app/client/util.js"); +var _util = __webpack_require__(/*! ./util */ "./app/client/util/index.js"); var util = _interopRequireWildcard(_util); @@ -4402,24 +4343,30 @@ var _samplernn = __webpack_require__(/*! ./samplernn.datasets */ "./app/client/m var _samplernn2 = _interopRequireDefault(_samplernn); -var _samplernn3 = __webpack_require__(/*! ./samplernn.inspect */ "./app/client/modules/samplernn/samplernn.inspect.js"); +var _samplernn3 = __webpack_require__(/*! ./samplernn.results */ "./app/client/modules/samplernn/samplernn.results.js"); var _samplernn4 = _interopRequireDefault(_samplernn3); -var _samplernn5 = __webpack_require__(/*! ./samplernn.loss */ "./app/client/modules/samplernn/samplernn.loss.js"); +var _samplernn5 = __webpack_require__(/*! ./samplernn.inspect */ "./app/client/modules/samplernn/samplernn.inspect.js"); var _samplernn6 = _interopRequireDefault(_samplernn5); +var _samplernn7 = __webpack_require__(/*! ./samplernn.loss */ "./app/client/modules/samplernn/samplernn.loss.js"); + +var _samplernn8 = _interopRequireDefault(_samplernn7); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function router() { return (0, _preact.h)( 'div', null, - (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/graph/', component: _samplernn6.default }), - (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/inspect/', component: _samplernn4.default }), + (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/graph/', component: _samplernn8.default }), + (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/inspect/', component: _samplernn6.default }), + (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/datasets/', component: _samplernn2.default }), (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/datasets/:id/', component: _samplernn2.default }), - (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/datasets/new/', component: _samplernn2.default }) + (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/datasets/new/', component: _samplernn2.default }), + (0, _preact.h)(_reactRouterDom.Route, { exact: true, path: '/samplernn/results/', component: _samplernn4.default }) ); } @@ -4500,23 +4447,48 @@ function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } var load_directories = exports.load_directories = function load_directories(id) { return function (dispatch) { // console.log(actions) - Promise.all([_actions2.default.folder.index({ module: 'samplernn' }), _actions2.default.file.index({ module: 'samplernn' }), _actions2.default.task.index({ module: 'samplernn' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'datasets' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'results' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'output' })]).then(function (res) { + Promise.all([_actions2.default.folder.index({ module: 'samplernn' }), _actions2.default.file.index({ module: 'samplernn' }), _actions2.default.task.index({ module: 'samplernn' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'datasets' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'results' }), _actions2.default.socket.list_directory({ module: 'samplernn', dir: 'output' }), load_loss()(dispatch)]).then(function (res) { // console.log(res) - var _res = _slicedToArray(res, 6), + var _res = _slicedToArray(res, 7), folders = _res[0], files = _res[1], tasks = _res[2], datasets = _res[3], results = _res[4], - output = _res[5]; + output = _res[5], + lossReport = _res[6]; + + var unsortedFolder = { + id: 0, + name: 'unsorted', + datasets: [] + }; + + var datasetLookup = {}; + + var get_dataset = function get_dataset(name) { + var folder = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : unsortedFolder; + var date = arguments[2]; + + var dataset = datasetLookup[name] || empty_dataset(name, folder); + if (date) { + dataset.date = dataset.date ? Math.max(+new Date(date), dataset.date) : +new Date(date); + } + return dataset; + }; var empty_dataset = function empty_dataset(name) { - return { + var folder = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : unsortedFolder; + + var dataset = { name: name, input: [], checkpoints: [], output: [] }; + datasetLookup[dataset.name] = dataset; + folder.datasets.push(dataset); + return dataset; }; // take all of the folders and put them in a lookup @@ -4525,11 +4497,7 @@ var load_directories = exports.load_directories = function load_directories(id) folder.datasets = []; return folderLookup; }, { - 'unsorted': { - id: 0, - name: 'unsorted', - datasets: [] - } + unsorted: unsortedFolder }); // prepare the files by splitting into two groups @@ -4541,40 +4509,24 @@ var load_directories = exports.load_directories = function load_directories(id) }); // build the initial dataset lookup table using the ungenerated files - var datasetLookup = ungeneratedFiles.reduce(function (datasetLookup, file) { - file.checkpoints = []; + ungeneratedFiles.reduce(function (datasetLookup, file) { if (!file.name) { file.name = (file.opt || {}).token || file.url; - // datasetLookup[] = file } var name = (file.name || 'unsorted').split('.')[0]; - if (!datasetLookup[name]) { - var dataset = empty_dataset(name); - datasetLookup[dataset.name] = dataset; - dataset.input.push(file); - folderLookup[file.folder_id].datasets.push(dataset); - } else { - datasetLookup[name].input.push(file); - } + var dataset = get_dataset(name, folderLookup[file.folder_id], unsortedFolder, file.date); + dataset.input.push(file); return datasetLookup; - }, { - unsorted: empty_dataset('unsorted') - }); + }, datasetLookup); // go over the generated files and add addl datasets (if the files were deleted) generatedFiles.map(function (file) { var pair = file.name.split('.')[0].split('-'); - var dataset = datasetLookup[pair[0]]; - if (!dataset) { - dataset = empty_dataset(pair[0]); - datasetLookup[dataset.name] = dataset; - folderLookup[file.folder_id].datasets.push(dataset); - } + var dataset = get_dataset(pair[0], folderLookup[file.folder_id], unsortedFolder, file.date); dataset.output.push(file); file.epoch = file.epoch || pair[1]; }); - // console.log(datasets) var flatDatasets = datasets.filter(function (s) { return s.name.match(/(wav|aiff?|flac|mp3)$/) && !s.dir; }); @@ -4582,23 +4534,13 @@ var load_directories = exports.load_directories = function load_directories(id) return s.dir; }); builtDatasets.forEach(function (dir) { - var dataset = datasetLookup[dir.name]; - if (!dataset) { - dataset = empty_dataset(dir.name); - datasetLookup[dataset.name] = dataset; - folderLookup.unsorted.datasets.push(dataset); - } + var dataset = get_dataset(dir.name); dataset.isBuilt = true; }); flatDatasets.forEach(function (file) { var name = file.name.split('.')[0]; - var dataset = datasetLookup[name]; - if (!dataset) { - dataset = empty_dataset(name); - datasetLookup[dataset.name] = dataset; - folderLookup.unsorted.datasets.push(dataset); - } + var dataset = get_dataset(name, unsortedFolder, file.date); file.persisted = false; dataset.input.push(file); }); @@ -4614,14 +4556,15 @@ var load_directories = exports.load_directories = function load_directories(id) }).reduce(function (a, b) { return (a[b[0]] = b[1]) && a; }, {}); - checkpoint.name = checkpoint.dataset || checkpoint.exp; + checkpoint.name = checkpoint.name || checkpoint.dataset || checkpoint.exp; checkpoint.date = s.date; checkpoint.dir = s; - var dataset = datasetLookup[checkpoint.dataset]; - if (!dataset) { - dataset = empty_dataset(checkpoint.dataset); - datasetLookup[dataset.name] = dataset; - folderLookup.unsorted.datasets.push(dataset); + checkpoint.persisted = false; + var dataset = get_dataset(checkpoint.name, unsortedFolder, checkpoint.date); + var loss = lossReport[checkpoint.name]; + if (loss) { + dataset.epoch = checkpoint.epoch = loss.length; + checkpoint.training_loss = loss; } dataset.checkpoints.push(checkpoint); return checkpoint; @@ -4629,14 +4572,10 @@ var load_directories = exports.load_directories = function load_directories(id) output.map(function (file) { var pair = file.name.split('.')[0].split('-'); - var dataset = datasetLookup[pair[0]]; - if (!dataset) { - dataset = empty_dataset(pair[0]); - datasetLookup[dataset.name] = dataset; - folderLookup.unsorted.datasets.push(dataset); - } + var dataset = get_dataset(pair[0], unsortedFolder, file.date); file.persisted = false; - file.epoch = file.epoch || pair[1].replace(/^\D+/, ''); + file.epoch = parseInt(file.epoch || pair[1].replace(/^\D+/, '')) || 0; + dataset.epoch = Math.max(file.epoch, dataset.epoch || 0); dataset.output.push(file); }); @@ -4665,7 +4604,7 @@ var load_directories = exports.load_directories = function load_directories(id) var load_loss = exports.load_loss = function load_loss() { return function (dispatch) { - _actions2.default.socket.run_script({ module: 'samplernn', activity: 'report' }).then(function (report) { + return _actions2.default.socket.run_script({ module: 'samplernn', activity: 'report' }).then(function (report) { var lossReport = {}; report.stdout.split('\n\n').filter(function (a) { return !!a; @@ -4688,6 +4627,7 @@ var load_loss = exports.load_loss = function load_loss() { type: _types2.default.samplernn.load_loss, lossReport: lossReport }); + return lossReport; }); }; }; @@ -4733,6 +4673,10 @@ var _redux = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js" var _reactRedux = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); +var _util = __webpack_require__(/*! ../../util */ "./app/client/util/index.js"); + +var util = _interopRequireWildcard(_util); + var _samplernn = __webpack_require__(/*! ./samplernn.actions */ "./app/client/modules/samplernn/samplernn.actions.js"); var samplernnActions = _interopRequireWildcard(_samplernn); @@ -4783,11 +4727,15 @@ var SampleRNNDatasets = function (_Component) { _this.fileOptions = _this.fileOptions.bind(_this); _this.pickFile = _this.pickFile.bind(_this); - var id = props.match.params.id; + var id = props.match.params.id || localStorage.getItem('samplernn.last_id'); if (!id && props.location.pathname.match(/\/new\//)) { id = 'new'; + } else if (id) { + localStorage.setItem('samplernn.last_id', id); + } + if (id && (!props.samplernn.folder || props.samplernn.folder.id !== id)) { + props.actions.load_directories(id); } - props.actions.load_directories(id); return _this; } @@ -4836,9 +4784,6 @@ var SampleRNNDatasets = function (_Component) { ) ); } - }, { - key: 'fetchURL', - value: function fetchURL(url) {} }, { key: 'render', value: function render() { @@ -4846,16 +4791,25 @@ var SampleRNNDatasets = function (_Component) { var folder = samplernn.folder; if (!folder.name) return; - console.log(folder); - var datasets = folder.datasets.map(function (dataset) { - console.log(dataset); + + var _util$sort$orderByFn = util.sort.orderByFn('date desc'), + mapFn = _util$sort$orderByFn.mapFn, + sortFn = _util$sort$orderByFn.sortFn; + + var datasets = folder.datasets.map(mapFn).sort(sortFn).map(function (pair) { + var dataset = pair[1]; return (0, _preact.h)( 'div', { className: 'row dataset' }, (0, _preact.h)( 'div', { className: 'col' }, - !!dataset.input.length && (0, _preact.h)(_fileList.FileList, { files: dataset.input, className: 'input_files', fileListClassName: '', rowClassName: 'input_file' }) + !!dataset.input.length && (0, _preact.h)(_fileList.FileList, { + files: dataset.input, + className: 'input_files', + fileListClassName: '', + rowClassName: 'input_file' + }) ), (0, _preact.h)( 'div', @@ -4863,18 +4817,26 @@ var SampleRNNDatasets = function (_Component) { (0, _preact.h)( 'div', null, - dataset.isBuilt ? 'has dataset' : 'not built' + dataset.isBuilt ? 'cached' : '' ) ), (0, _preact.h)( 'div', { className: 'col checkpoint' }, - !!dataset.checkpoints.length && (0, _preact.h)(_fileList.FileRow, { file: dataset.checkpoints[0] }) + !!dataset.checkpoints.length && (0, _preact.h)(_fileList.FileRow, { + file: dataset.checkpoints[0], + fields: 'name date epoch', + className: 'row checkpoint' + }) ), (0, _preact.h)( 'div', { className: 'col' }, - !!dataset.output.length && (0, _preact.h)(_fileList.FileList, { files: dataset.output, orderBy: 'epoch desc' }) + !!dataset.output.length && (0, _preact.h)(_fileList.FileList, { + files: dataset.output, + orderBy: 'epoch desc', + fields: 'name date epoch size' + }) ) ); }); @@ -4885,7 +4847,7 @@ var SampleRNNDatasets = function (_Component) { 'div', { className: 'heading' }, (0, _preact.h)( - 'h3', + 'h2', null, 'SampleRNN' ) @@ -4901,11 +4863,7 @@ var SampleRNNDatasets = function (_Component) { { 'class': 'col' }, 'input' ), - (0, _preact.h)( - 'div', - { 'class': 'col' }, - 'dataset' - ), + (0, _preact.h)('div', { 'class': 'col' }), (0, _preact.h)( 'div', { 'class': 'col' }, @@ -4926,18 +4884,6 @@ var SampleRNNDatasets = function (_Component) { return SampleRNNDatasets; }(_preact.Component); -// - var mapStateToProps = function mapStateToProps(state) { return { samplernn: state.module.samplernn, @@ -5181,7 +5127,7 @@ var _redux = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js" var _reactRedux = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); -var _util = __webpack_require__(/*! ../../util */ "./app/client/util.js"); +var _util = __webpack_require__(/*! ../../util */ "./app/client/util/index.js"); var _samplernn = __webpack_require__(/*! ./samplernn.actions */ "./app/client/modules/samplernn/samplernn.actions.js"); @@ -5328,9 +5274,15 @@ var SampleRNNLoss = function (_Component) { // if ( (ii % 1) < 0.1) { // ctx.strokeStyle = 'rgba(255,255,255,1.0)' ctx.lineWidth = 2; + ctx.setLineDash([4, 4]); ctx.stroke(); ctx.stroke(); ctx.stroke(); + ctx.setLineDash([0, 0]); + var fontSize = 12; + ctx.font = 'italic ' + fontSize * devicePixelRatio + 'px "Georgia"'; + ctx.fill = 'black'; + ctx.fillText(ii.toFixed(1), w - 50, h - Y + fontSize + 10 * devicePixelRatio); // } } ctx.lineWidth = 1; @@ -5339,7 +5291,7 @@ var SampleRNNLoss = function (_Component) { var loss = lossReport[key]; var vf = parseFloat(loss[loss.length - 1].training_loss) || 0; var vg = parseFloat(loss[0].training_loss) || 5; - console.log(vf); + // console.log(vf) var vv = 1 - (0, _util.norm)(vf, scaleMin, scaleMax / 2); ctx.lineWidth = (1 - (0, _util.norm)(vf, scaleMin, scaleMax)) * 5; ctx.strokeStyle = 'rgba(' + [(0, _util.randrange)(30, 190), (0, _util.randrange)(30, 150), (0, _util.randrange)(60, 120)].join(',') + ',' + 0.8 + ')'; @@ -5477,6 +5429,225 @@ exports.default = samplernnReducer; /***/ }), +/***/ "./app/client/modules/samplernn/samplernn.results.js": +/*!***********************************************************!*\ + !*** ./app/client/modules/samplernn/samplernn.results.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _preact = __webpack_require__(/*! preact */ "./node_modules/preact/dist/preact.esm.js"); + +var _redux = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); + +var _reactRedux = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); + +var _util = __webpack_require__(/*! ../../util */ "./app/client/util/index.js"); + +var util = _interopRequireWildcard(_util); + +var _samplernn = __webpack_require__(/*! ./samplernn.actions */ "./app/client/modules/samplernn/samplernn.actions.js"); + +var samplernnActions = _interopRequireWildcard(_samplernn); + +var _dataset = __webpack_require__(/*! ../../dataset/dataset.component */ "./app/client/dataset/dataset.component.js"); + +var _dataset2 = _interopRequireDefault(_dataset); + +var _group = __webpack_require__(/*! ../../common/group.component */ "./app/client/common/group.component.js"); + +var _group2 = _interopRequireDefault(_group); + +var _slider = __webpack_require__(/*! ../../common/slider.component */ "./app/client/common/slider.component.js"); + +var _slider2 = _interopRequireDefault(_slider); + +var _select = __webpack_require__(/*! ../../common/select.component */ "./app/client/common/select.component.js"); + +var _select2 = _interopRequireDefault(_select); + +var _button = __webpack_require__(/*! ../../common/button.component */ "./app/client/common/button.component.js"); + +var _button2 = _interopRequireDefault(_button); + +var _fileList = __webpack_require__(/*! ../../common/fileList.component */ "./app/client/common/fileList.component.js"); + +var _textInput = __webpack_require__(/*! ../../common/textInput.component */ "./app/client/common/textInput.component.js"); + +var _textInput2 = _interopRequireDefault(_textInput); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var SampleRNNResults = function (_Component) { + _inherits(SampleRNNResults, _Component); + + function SampleRNNResults(props) { + _classCallCheck(this, SampleRNNResults); + + var _this = _possibleConstructorReturn(this, (SampleRNNResults.__proto__ || Object.getPrototypeOf(SampleRNNResults)).call(this)); + + _this.fileOptions = _this.fileOptions.bind(_this); + _this.pickFile = _this.pickFile.bind(_this); + var id = props.match.params.id || localStorage.getItem('samplernn.last_id'); + if (!props.samplernn.data) props.actions.load_directories(); + return _this; + } + + _createClass(SampleRNNResults, [{ + key: 'pickFile', + value: function pickFile(file) { + console.log('pick', file); + } + }, { + key: 'fileOptions', + value: function fileOptions(file) { + var _this2 = this; + + if (file.activity === 'url' && !file.dataset) { + if (this.props.runner.cpu.status !== 'IDLE') { + return (0, _preact.h)( + 'div', + { className: 'gray' }, + 'fetching...' + ); + } else { + return (0, _preact.h)( + 'div', + { className: 'link', onClick: function onClick() { + return _this2.fetchURL(file.url); + } }, + 'fetch' + ); + } + } + return (0, _preact.h)( + 'div', + null, + (0, _preact.h)( + 'div', + { className: 'link', onClick: function onClick() { + return _this2.train(file); + } }, + 'train' + ), + file.epoch == 0 && (0, _preact.h)( + 'div', + { className: 'epochs' }, + file.epochs, + ' ep.' + ) + ); + } + }, { + key: 'render', + value: function render() { + if (this.props.samplernn.loading) return (0, _preact.h)( + 'span', + null, + 'Loading' + ); + console.log(this.props.samplernn.data); + var folderLookup = this.props.samplernn.data.folderLookup; + // const { folderLookup } = samplernn + + console.log(this.props); + + var renders = Object.keys(folderLookup).sort(util.sort.stringSort.asc).map(function (key) { + var folder = folderLookup[key]; + + var _util$sort$orderByFn = util.sort.orderByFn('epoch desc'), + mapFn = _util$sort$orderByFn.mapFn, + sortFn = _util$sort$orderByFn.sortFn; + + console.log(mapFn, sortFn); + var datasetPairs = folder.datasets.map(mapFn).sort(sortFn); + var bestRenders = datasetPairs.map(function (pair) { + return pair[1]; + }).filter(function (dataset) { + return dataset.output.length; + }).map(function (dataset) { + var output = dataset.output; + + return output.map(mapFn).sort(sortFn)[0][1]; + }); + console.log(bestRenders.map(function (r) { + return r.epoch; + })); + return (0, _preact.h)( + 'div', + { className: 'col' }, + (0, _preact.h)( + 'h3', + null, + key + ), + !!bestRenders.length && (0, _preact.h)(_fileList.FileList, { + files: bestRenders, + orderBy: 'epoch desc', + fields: 'name date epoch size' + }) + ); + }); + + return (0, _preact.h)( + 'div', + { className: 'app' }, + (0, _preact.h)( + 'div', + { className: 'heading' }, + (0, _preact.h)( + 'h2', + null, + 'SampleRNN' + ) + ), + (0, _preact.h)( + 'div', + { 'class': 'rows params renders' }, + renders + ) + ); + } + }]); + + return SampleRNNResults; +}(_preact.Component); + +var mapStateToProps = function mapStateToProps(state) { + return { + samplernn: state.module.samplernn, + runner: state.system.runner, + task: state.task + }; +}; + +var mapDispatchToProps = function mapDispatchToProps(dispatch, ownProps) { + return { + actions: (0, _redux.bindActionCreators)(samplernnActions, dispatch) + }; +}; + +exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(SampleRNNResults); + +/***/ }), + /***/ "./app/client/queue/queue.actions.js": /*!*******************************************!*\ !*** ./app/client/queue/queue.actions.js ***! @@ -6891,14 +7062,320 @@ exports.default = (_system$app$folder$fi = { /***/ }), -/***/ "./app/client/util.js": -/*!****************************!*\ - !*** ./app/client/util.js ***! - \****************************/ +/***/ "./app/client/util/index.js": +/*!**********************************!*\ + !*** ./app/client/util/index.js ***! + \**********************************/ /*! no static exports found */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.is_desktop = exports.is_mobile = exports.is_android = exports.is_ipad = exports.is_iphone = exports.sort = undefined; +exports.clamp = clamp; +exports.norm = norm; +exports.lerp = lerp; +exports.mix = mix; +exports.randint = randint; +exports.randrange = randrange; +exports.timeInSeconds = timeInSeconds; +exports.gerund = gerund; +exports.commatize = commatize; +exports.carbon_date = carbon_date; +exports.hush_views = hush_views; +exports.hush_threads = hush_threads; +exports.hush_size = hush_size; +exports.hush_null = hush_null; +exports.get_age = get_age; +exports.courtesy_s = courtesy_s; + +var _sort = __webpack_require__(/*! ./sort */ "./app/client/util/sort.js"); + +var sort = _interopRequireWildcard(_sort); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +exports.sort = sort; +var is_iphone = exports.is_iphone = !!(navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)); +var is_ipad = exports.is_ipad = !!navigator.userAgent.match(/iPad/i); +var is_android = exports.is_android = !!navigator.userAgent.match(/Android/i); +var is_mobile = exports.is_mobile = is_iphone || is_ipad || is_android; +var is_desktop = exports.is_desktop = !is_mobile; + +var htmlClassList = document.body.parentNode.classList; +htmlClassList.add(is_desktop ? 'desktop' : 'mobile'); +htmlClassList.remove('loading'); + +// window.debug = false + +function clamp(n, a, b) { + return n < a ? a : n < b ? n : b; +} +function norm(n, a, b) { + return (n - a) / (b - a); +} +function lerp(n, a, b) { + return (b - a) * n + a; +} +function mix(n, a, b) { + return a * (1 - n) + b * n; +} +function randint(n) { + return Math.floor(Math.random() * n); +} +function randrange(a, b) { + return Math.random() * (b - a) + a; +} + +document.body.style.backgroundImage = 'linear-gradient(' + (randint(40) + 40) + 'deg, #fde, #ffe)'; + +function timeInSeconds(n) { + return (n / 10).toFixed(1) + ' s.'; +} +function gerund(s) { + return s.replace(/e?$/, 'ing'); +} +function commatize(n, radix) { + radix = radix || 1024; + var nums = [], + i, + counter = 0, + r = Math.floor; + if (n > radix) { + n /= radix; + nums.unshift(r(n * 10 % 10)); + nums.unshift("."); + } + do { + i = n % 10; + n = r(n / 10); + if (n && !(++counter % 3)) { + i = ' ' + r(i); + } + nums.unshift(r(i)); + } while (n); + return nums.join(""); +} +function carbon_date(date, no_bold) { + var span = (+new Date() - new Date(date)) / 1000, + color; + if (!no_bold && span < 86400) // modified today + { + color = "new"; + } else if (span < 604800) // modifed this week + { + color = "recent"; + } else if (span < 1209600) // modifed 2 weeks ago + { + color = "med"; + } else if (span < 3024000) // modifed 5 weeks ago + { + color = "old"; + } else if (span < 12315200) // modifed 6 months ago + { + color = "older"; + } else { + color = "quiet"; + } + return color; +} +function hush_views(n, bias, no_bold) { + var txt = commatize(n, 1000); + bias = bias || 1; + n = n || 0; + if (n < 30) { + return ["quiet", n + " v."]; + } + if (n < 200) { + return ["quiet", txt + " v."]; + } else if (n < 500) { + return ["quiet", txt + " v."]; + } else if (n < 1000) { + return ["old", txt + " v."]; + } else if (n < 5000) { + return ["med", txt + " kv."]; + } else if (no_bold || n < 10000) { + return ["recent", txt + " kv."]; + } else { + return ["new", txt + " kv."]; + } +} +function hush_threads(n, bias, no_bold) { + var txt = commatize(n, 1000); + bias = bias || 1; + n = n || 0; + if (n < 10) { + return ["quiet", n + " t."]; + } else if (n < 25) { + return ["old", txt + " t."]; + } else if (n < 50) { + return ["med", txt + " t."]; + } else if (no_bold || n < 100) { + return ["recent", txt + " t."]; + } else { + return ["new", txt + " t."]; + } +} +function hush_size(n, bias, no_bold) { + var txt = commatize(Math.round(n / 1024)); + bias = 1 || bias; + n = n || 0; + if (!n) { + return ['', '']; + } + if (n < 1000) { + return ["quiet", n + " b."]; + } + if (n < 1000000) { + return ["quiet", txt + " kb."]; + } else if (n < 20000000 / bias) { + return ["quiet", txt + " mb."]; + } else if (n < 50000000 / bias) { + return ["old", txt + " mb."]; + } else if (n < 80000000 / bias) { + return ["med", txt + " mb."]; + } else if (no_bold || n < 170000000 / bias) { + return ["recent", txt + " mb."]; + } else { + return ["new", txt + " mb."]; + } +} +function hush_null(n, unit, no_bold) { + var s = unit ? n + " " + unit + "." : n; + if (n < 3) { + return ["quiet", s]; + } else if (n < 6) { + return ["older", s]; + } else if (n < 10) { + return ["old", s]; + } else if (n < 16) { + return ["med", s]; + } else if (no_bold || n < 21) { + return ["recent", s]; + } else { + return ["new", s]; + } +} +function get_age(t) { + var age = Math.abs(+Date.now() - new Date(t)) / 1000; + var r = Math.floor; + var m; + if (age < 5) { + return "now"; + } + if (age < 60) { + return r(age) + "s"; + } + age /= 60; + if (age < 60) { + return r(age) + "m"; + } + m = r(age % 60); + age /= 60; + if (m > 0 && age < 2) { + return r(age) + "h" + m + "m"; + } + if (age < 24) { + return r(age) + "h"; + } + age /= 24; + if (age < 7) { + return r(age) + "d"; + } + age /= 7; + if (age < 12) { + return r(age) + "w"; + } + age /= 4; + if (age < 12) { + return r(age) + "m"; + } + age /= 12; + return r(age) + "y"; +} +function courtesy_s(n, s) { + return n == 1 ? "" : s || "s"; +} + +/***/ }), + +/***/ "./app/client/util/sort.js": +/*!*********************************!*\ + !*** ./app/client/util/sort.js ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + -throw new Error("Module build failed: Error: ENOENT: no such file or directory, open '/Users/user/neural/live-cortex/app/client/util.js'"); +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var numericSort = exports.numericSort = { + asc: function asc(a, b) { + return a[0] - b[0]; + }, + desc: function desc(a, b) { + return b[0] - a[0]; + } +}; +var stringSort = exports.stringSort = { + asc: function asc(a, b) { + return a[0].localeCompare(b[0]); + }, + desc: function desc(a, b) { + return b[0].localeCompare(a[0]); + } +}; +var orderByFn = exports.orderByFn = function orderByFn() { + var s = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'name asc'; + + var _s$split = s.split(' '), + _s$split2 = _slicedToArray(_s$split, 2), + _s$split2$ = _s$split2[0], + field = _s$split2$ === undefined ? 'name' : _s$split2$, + _s$split2$2 = _s$split2[1], + direction = _s$split2$2 === undefined ? 'asc' : _s$split2$2; + + var mapFn = void 0, + sortFn = void 0; + switch (field) { + case 'epoch': + mapFn = function mapFn(a) { + return [parseInt(a.epoch || a.epochs) || 0, a]; + }; + sortFn = numericSort[direction]; + break; + case 'size': + mapFn = function mapFn(a) { + return [a.size, a]; + }; + sortFn = numericSort[direction]; + break; + case 'date': + mapFn = function mapFn(a) { + return [+new Date(a.date || a.created_at), a]; + }; + sortFn = numericSort[direction]; + break; + case 'name': + default: + mapFn = function mapFn(a) { + return [a.id || a.name, a]; + }; + sortFn = stringSort[direction]; + break; + } + return { mapFn: mapFn, sortFn: sortFn }; +}; /***/ }), diff --git a/public/bundle.js.map b/public/bundle.js.map index 5716c67..5fafd8f 100644 --- a/public/bundle.js.map +++ b/public/bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"bundle.js","sources":["webpack:///webpack/bootstrap","webpack:///./app/client/actions.js","webpack:///./app/client/api/crud.actions.js","webpack:///./app/client/api/crud.fetch.js","webpack:///./app/client/api/crud.types.js","webpack:///./app/client/api/crud.upload.js","webpack:///./app/client/api/index.js","webpack:///./app/client/api/parser.js","webpack:///./app/client/common/button.component.js","webpack:///./app/client/common/fileList.component.js","webpack:///./app/client/common/fileUpload.component.js","webpack:///./app/client/common/gallery.component.js","webpack:///./app/client/common/group.component.js","webpack:///./app/client/common/header.component.js","webpack:///./app/client/common/param.component.js","webpack:///./app/client/common/paramGroup.component.js","webpack:///./app/client/common/player.component.js","webpack:///./app/client/common/select.component.js","webpack:///./app/client/common/slider.component.js","webpack:///./app/client/common/textInput.component.js","webpack:///./app/client/dashboard/dashboard.actions.js","webpack:///./app/client/dashboard/dashboard.component.js","webpack:///./app/client/dashboard/dashboard.reducer.js","webpack:///./app/client/dashboard/dashboardheader.component.js","webpack:///./app/client/dashboard/tasklist.component.js","webpack:///./app/client/dataset/dataset.actions.js","webpack:///./app/client/dataset/dataset.component.js","webpack:///./app/client/dataset/dataset.reducer.js","webpack:///./app/client/index.jsx","webpack:///./app/client/live/live.actions.js","webpack:///./app/client/live/live.reducer.js","webpack:///./app/client/live/player.js","webpack:///./app/client/live/whammy.js","webpack:///./app/client/modules/index.js","webpack:///./app/client/modules/module.reducer.js","webpack:///./app/client/modules/pix2pix/index.js","webpack:///./app/client/modules/pix2pix/live.component.js","webpack:///./app/client/modules/samplernn/index.js","webpack:///./app/client/modules/samplernn/samplernn.actions.js","webpack:///./app/client/modules/samplernn/samplernn.datasets.js","webpack:///./app/client/modules/samplernn/samplernn.inspect.js","webpack:///./app/client/modules/samplernn/samplernn.loss.js","webpack:///./app/client/modules/samplernn/samplernn.reducer.js","webpack:///./app/client/queue/queue.actions.js","webpack:///./app/client/queue/queue.reducer.js","webpack:///./app/client/socket/index.js","webpack:///./app/client/socket/socket.actions.js","webpack:///./app/client/socket/socket.connection.js","webpack:///./app/client/socket/socket.live.js","webpack:///./app/client/socket/socket.system.js","webpack:///./app/client/socket/socket.task.js","webpack:///./app/client/store.js","webpack:///./app/client/system/system.actions.js","webpack:///./app/client/system/system.component.js","webpack:///./app/client/system/system.reducer.js","webpack:///./app/client/types.js","webpack:///./node_modules/fbjs/lib/emptyFunction.js","webpack:///./node_modules/fbjs/lib/invariant.js","webpack:///./node_modules/fbjs/lib/warning.js","webpack:///./node_modules/fetch-jsonp/build/fetch-jsonp.js","webpack:///./node_modules/file-saver/FileSaver.js","webpack:///./node_modules/history/DOMUtils.js","webpack:///./node_modules/history/LocationUtils.js","webpack:///./node_modules/history/PathUtils.js","webpack:///./node_modules/history/createBrowserHistory.js","webpack:///./node_modules/history/createHashHistory.js","webpack:///./node_modules/history/createMemoryHistory.js","webpack:///./node_modules/history/createTransitionManager.js","webpack:///./node_modules/history/es/DOMUtils.js","webpack:///./node_modules/history/es/LocationUtils.js","webpack:///./node_modules/history/es/PathUtils.js","webpack:///./node_modules/history/es/createBrowserHistory.js","webpack:///./node_modules/history/es/createHashHistory.js","webpack:///./node_modules/history/es/createMemoryHistory.js","webpack:///./node_modules/history/es/createTransitionManager.js","webpack:///./node_modules/history/es/index.js","webpack:///./node_modules/hoist-non-react-statics/index.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/lodash-es/_Symbol.js","webpack:///./node_modules/lodash-es/_baseGetTag.js","webpack:///./node_modules/lodash-es/_freeGlobal.js","webpack:///./node_modules/lodash-es/_getPrototype.js","webpack:///./node_modules/lodash-es/_getRawTag.js","webpack:///./node_modules/lodash-es/_objectToString.js","webpack:///./node_modules/lodash-es/_overArg.js","webpack:///./node_modules/lodash-es/_root.js","webpack:///./node_modules/lodash-es/isObjectLike.js","webpack:///./node_modules/lodash-es/isPlainObject.js","webpack:///./node_modules/moment/locale/af.js","webpack:///./node_modules/moment/locale/ar-dz.js","webpack:///./node_modules/moment/locale/ar-kw.js","webpack:///./node_modules/moment/locale/ar-ly.js","webpack:///./node_modules/moment/locale/ar-ma.js","webpack:///./node_modules/moment/locale/ar-sa.js","webpack:///./node_modules/moment/locale/ar-tn.js","webpack:///./node_modules/moment/locale/ar.js","webpack:///./node_modules/moment/locale/az.js","webpack:///./node_modules/moment/locale/be.js","webpack:///./node_modules/moment/locale/bg.js","webpack:///./node_modules/moment/locale/bm.js","webpack:///./node_modules/moment/locale/bn.js","webpack:///./node_modules/moment/locale/bo.js","webpack:///./node_modules/moment/locale/br.js","webpack:///./node_modules/moment/locale/bs.js","webpack:///./node_modules/moment/locale/ca.js","webpack:///./node_modules/moment/locale/cs.js","webpack:///./node_modules/moment/locale/cv.js","webpack:///./node_modules/moment/locale/cy.js","webpack:///./node_modules/moment/locale/da.js","webpack:///./node_modules/moment/locale/de-at.js","webpack:///./node_modules/moment/locale/de-ch.js","webpack:///./node_modules/moment/locale/de.js","webpack:///./node_modules/moment/locale/dv.js","webpack:///./node_modules/moment/locale/el.js","webpack:///./node_modules/moment/locale/en-au.js","webpack:///./node_modules/moment/locale/en-ca.js","webpack:///./node_modules/moment/locale/en-gb.js","webpack:///./node_modules/moment/locale/en-ie.js","webpack:///./node_modules/moment/locale/en-il.js","webpack:///./node_modules/moment/locale/en-nz.js","webpack:///./node_modules/moment/locale/eo.js","webpack:///./node_modules/moment/locale/es-do.js","webpack:///./node_modules/moment/locale/es-us.js","webpack:///./node_modules/moment/locale/es.js","webpack:///./node_modules/moment/locale/et.js","webpack:///./node_modules/moment/locale/eu.js","webpack:///./node_modules/moment/locale/fa.js","webpack:///./node_modules/moment/locale/fi.js","webpack:///./node_modules/moment/locale/fo.js","webpack:///./node_modules/moment/locale/fr-ca.js","webpack:///./node_modules/moment/locale/fr-ch.js","webpack:///./node_modules/moment/locale/fr.js","webpack:///./node_modules/moment/locale/fy.js","webpack:///./node_modules/moment/locale/gd.js","webpack:///./node_modules/moment/locale/gl.js","webpack:///./node_modules/moment/locale/gom-latn.js","webpack:///./node_modules/moment/locale/gu.js","webpack:///./node_modules/moment/locale/he.js","webpack:///./node_modules/moment/locale/hi.js","webpack:///./node_modules/moment/locale/hr.js","webpack:///./node_modules/moment/locale/hu.js","webpack:///./node_modules/moment/locale/hy-am.js","webpack:///./node_modules/moment/locale/id.js","webpack:///./node_modules/moment/locale/is.js","webpack:///./node_modules/moment/locale/it.js","webpack:///./node_modules/moment/locale/ja.js","webpack:///./node_modules/moment/locale/jv.js","webpack:///./node_modules/moment/locale/ka.js","webpack:///./node_modules/moment/locale/kk.js","webpack:///./node_modules/moment/locale/km.js","webpack:///./node_modules/moment/locale/kn.js","webpack:///./node_modules/moment/locale/ko.js","webpack:///./node_modules/moment/locale/ky.js","webpack:///./node_modules/moment/locale/lb.js","webpack:///./node_modules/moment/locale/lo.js","webpack:///./node_modules/moment/locale/lt.js","webpack:///./node_modules/moment/locale/lv.js","webpack:///./node_modules/moment/locale/me.js","webpack:///./node_modules/moment/locale/mi.js","webpack:///./node_modules/moment/locale/mk.js","webpack:///./node_modules/moment/locale/ml.js","webpack:///./node_modules/moment/locale/mn.js","webpack:///./node_modules/moment/locale/mr.js","webpack:///./node_modules/moment/locale/ms-my.js","webpack:///./node_modules/moment/locale/ms.js","webpack:///./node_modules/moment/locale/mt.js","webpack:///./node_modules/moment/locale/my.js","webpack:///./node_modules/moment/locale/nb.js","webpack:///./node_modules/moment/locale/ne.js","webpack:///./node_modules/moment/locale/nl-be.js","webpack:///./node_modules/moment/locale/nl.js","webpack:///./node_modules/moment/locale/nn.js","webpack:///./node_modules/moment/locale/pa-in.js","webpack:///./node_modules/moment/locale/pl.js","webpack:///./node_modules/moment/locale/pt-br.js","webpack:///./node_modules/moment/locale/pt.js","webpack:///./node_modules/moment/locale/ro.js","webpack:///./node_modules/moment/locale/ru.js","webpack:///./node_modules/moment/locale/sd.js","webpack:///./node_modules/moment/locale/se.js","webpack:///./node_modules/moment/locale/si.js","webpack:///./node_modules/moment/locale/sk.js","webpack:///./node_modules/moment/locale/sl.js","webpack:///./node_modules/moment/locale/sq.js","webpack:///./node_modules/moment/locale/sr-cyrl.js","webpack:///./node_modules/moment/locale/sr.js","webpack:///./node_modules/moment/locale/ss.js","webpack:///./node_modules/moment/locale/sv.js","webpack:///./node_modules/moment/locale/sw.js","webpack:///./node_modules/moment/locale/ta.js","webpack:///./node_modules/moment/locale/te.js","webpack:///./node_modules/moment/locale/tet.js","webpack:///./node_modules/moment/locale/tg.js","webpack:///./node_modules/moment/locale/th.js","webpack:///./node_modules/moment/locale/tl-ph.js","webpack:///./node_modules/moment/locale/tlh.js","webpack:///./node_modules/moment/locale/tr.js","webpack:///./node_modules/moment/locale/tzl.js","webpack:///./node_modules/moment/locale/tzm-latn.js","webpack:///./node_modules/moment/locale/tzm.js","webpack:///./node_modules/moment/locale/ug-cn.js","webpack:///./node_modules/moment/locale/uk.js","webpack:///./node_modules/moment/locale/ur.js","webpack:///./node_modules/moment/locale/uz-latn.js","webpack:///./node_modules/moment/locale/uz.js","webpack:///./node_modules/moment/locale/vi.js","webpack:///./node_modules/moment/locale/x-pseudo.js","webpack:///./node_modules/moment/locale/yo.js","webpack:///./node_modules/moment/locale/zh-cn.js","webpack:///./node_modules/moment/locale/zh-hk.js","webpack:///./node_modules/moment/locale/zh-tw.js","webpack:///./node_modules/moment/moment.js","webpack:///./node_modules/node-fetch/browser.js","webpack:///./node_modules/object-assign/index.js","webpack:///./node_modules/preact-compat/dist/preact-compat.es.js","webpack:///./node_modules/preact/dist/preact.esm.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/prop-types/checkPropTypes.js","webpack:///./node_modules/prop-types/factoryWithTypeCheckers.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./node_modules/react-redux/es/components/Provider.js","webpack:///./node_modules/react-redux/es/components/connectAdvanced.js","webpack:///./node_modules/react-redux/es/connect/connect.js","webpack:///./node_modules/react-redux/es/connect/mapDispatchToProps.js","webpack:///./node_modules/react-redux/es/connect/mapStateToProps.js","webpack:///./node_modules/react-redux/es/connect/mergeProps.js","webpack:///./node_modules/react-redux/es/connect/selectorFactory.js","webpack:///./node_modules/react-redux/es/connect/verifySubselectors.js","webpack:///./node_modules/react-redux/es/connect/wrapMapToProps.js","webpack:///./node_modules/react-redux/es/index.js","webpack:///./node_modules/react-redux/es/utils/PropTypes.js","webpack:///./node_modules/react-redux/es/utils/Subscription.js","webpack:///./node_modules/react-redux/es/utils/shallowEqual.js","webpack:///./node_modules/react-redux/es/utils/verifyPlainObject.js","webpack:///./node_modules/react-redux/es/utils/warning.js","webpack:///./node_modules/react-router-dom/es/BrowserRouter.js","webpack:///./node_modules/react-router-dom/es/HashRouter.js","webpack:///./node_modules/react-router-dom/es/Link.js","webpack:///./node_modules/react-router-dom/es/MemoryRouter.js","webpack:///./node_modules/react-router-dom/es/NavLink.js","webpack:///./node_modules/react-router-dom/es/Prompt.js","webpack:///./node_modules/react-router-dom/es/Redirect.js","webpack:///./node_modules/react-router-dom/es/Route.js","webpack:///./node_modules/react-router-dom/es/Router.js","webpack:///./node_modules/react-router-dom/es/StaticRouter.js","webpack:///./node_modules/react-router-dom/es/Switch.js","webpack:///./node_modules/react-router-dom/es/index.js","webpack:///./node_modules/react-router-dom/es/matchPath.js","webpack:///./node_modules/react-router-dom/es/withRouter.js","webpack:///./node_modules/react-router-redux/lib/actions.js","webpack:///./node_modules/react-router-redux/lib/index.js","webpack:///./node_modules/react-router-redux/lib/middleware.js","webpack:///./node_modules/react-router-redux/lib/reducer.js","webpack:///./node_modules/react-router-redux/lib/sync.js","webpack:///./node_modules/react-router/es/MemoryRouter.js","webpack:///./node_modules/react-router/es/Prompt.js","webpack:///./node_modules/react-router/es/Redirect.js","webpack:///./node_modules/react-router/es/Route.js","webpack:///./node_modules/react-router/es/Router.js","webpack:///./node_modules/react-router/es/StaticRouter.js","webpack:///./node_modules/react-router/es/Switch.js","webpack:///./node_modules/react-router/es/matchPath.js","webpack:///./node_modules/react-router/es/withRouter.js","webpack:///./node_modules/react-router/node_modules/isarray/index.js","webpack:///./node_modules/react-router/node_modules/path-to-regexp/index.js","webpack:///./node_modules/redux-thunk/lib/index.js","webpack:///./node_modules/redux/es/redux.js","webpack:///./node_modules/resolve-pathname/index.js","webpack:///./node_modules/symbol-observable/es/index.js","webpack:///./node_modules/symbol-observable/es/ponyfill.js","webpack:///./node_modules/uuid/lib/bytesToUuid.js","webpack:///./node_modules/uuid/lib/rng-browser.js","webpack:///./node_modules/uuid/v1.js","webpack:///./node_modules/value-equal/index.js","webpack:///./node_modules/warning/browser.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///(webpack)/buildin/module.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./app/client/index.jsx\");\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _redux = require('redux');\n\nvar _api = require('./api');\n\nvar _live = require('./live/live.actions');\n\nvar liveActions = _interopRequireWildcard(_live);\n\nvar _queue = require('./queue/queue.actions');\n\nvar queueActions = _interopRequireWildcard(_queue);\n\nvar _system = require('./system/system.actions');\n\nvar systemActions = _interopRequireWildcard(_system);\n\nvar _socket = require('./socket/socket.actions');\n\nvar socketActions = _interopRequireWildcard(_socket);\n\nvar _dataset = require('./dataset/dataset.actions');\n\nvar datasetActions = _interopRequireWildcard(_dataset);\n\nvar _store = require('./store');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nexports.default = Object.keys(_api.actions).map(function (a) {\n return [a, _api.actions[a]];\n}).concat([['live', liveActions], ['queue', queueActions], ['system', systemActions], ['dataset', datasetActions]]).map(function (p) {\n return [p[0], (0, _redux.bindActionCreators)(p[1], _store.dispatch)];\n}).concat([['socket', socketActions]]).reduce(function (a, b) {\n return (a[b[0]] = b[1]) && a;\n}, {});","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.crud_action = undefined;\nexports.crud_actions = crud_actions;\n\nvar _crud = require('./crud.fetch');\n\nvar _crud2 = require('./crud.types');\n\nvar _crud3 = require('./crud.upload');\n\nfunction crud_actions(type) {\n var fetch_type = (0, _crud.crud_fetch)(type);\n return ['index', 'show', 'create', 'update', 'destroy'].reduce(function (lookup, param) {\n lookup[param] = crud_action(type, param, function (q) {\n return fetch_type[param](q);\n });\n return lookup;\n }, {\n action: function action(method, fn) {\n return crud_action(type, method, fn);\n },\n upload: function upload(id, fd) {\n return (0, _crud3.upload_action)(type, id, fd);\n }\n });\n}\n\nvar crud_action = exports.crud_action = function crud_action(type, method, fn) {\n return function (q) {\n return function (dispatch) {\n return new Promise(function (resolve, reject) {\n dispatch({ type: (0, _crud2.as_type)(type, method + '_loading') });\n fn(q).then(function (data) {\n dispatch({ type: (0, _crud2.as_type)(type, method), data: data });\n resolve(data);\n }).catch(function (e) {\n dispatch({ type: (0, _crud2.as_type)(type, method + '_error') });\n reject(e);\n });\n });\n };\n };\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.crud_fetch = crud_fetch;\nexports.postBody = postBody;\n\nvar _nodeFetch = require('node-fetch');\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction crud_fetch(type, tag) {\n var uri = '/api/' + type + '/' + (tag || '');\n return {\n index: function index(q) {\n return (0, _nodeFetch2.default)(_get_url(uri, q), _get_headers()).then(function (req) {\n return req.json();\n }).catch(error);\n },\n\n show: function show(id) {\n return (0, _nodeFetch2.default)(uri + id).then(function (req) {\n return req.json();\n }).catch(error);\n },\n\n create: function create(data) {\n return (0, _nodeFetch2.default)(uri, post(data)).then(function (req) {\n return req.json();\n }).catch(error);\n },\n\n update: function update(data) {\n return (0, _nodeFetch2.default)(uri + data.id, put(data)).then(function (req) {\n return req.json();\n }).catch(error);\n },\n\n destroy: function destroy(data) {\n return (0, _nodeFetch2.default)(uri + data.id, _destroy(data)).then(function (req) {\n return req.json();\n }).catch(error);\n }\n };\n}\n\nfunction _get_url(_url, data) {\n var url = new URL(window.location.origin + _url);\n if (data) {\n Object.keys(data).forEach(function (key) {\n return url.searchParams.append(key, data[key]);\n });\n }\n return url;\n}\nfunction _get_headers() {\n return {\n method: 'GET',\n headers: {\n 'Accept': 'application/json'\n }\n };\n}\nfunction post(data) {\n return {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\n };\n}\nfunction postBody(data) {\n return {\n method: 'POST',\n body: data,\n headers: {\n 'Accept': 'application/json'\n }\n };\n}\nfunction put(data) {\n return {\n method: 'PUT',\n body: JSON.stringify(data),\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\n };\n}\nfunction _destroy(data) {\n return {\n method: 'DELETE',\n body: JSON.stringify(data),\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n }\n };\n}\nfunction error(err) {\n console.warn(err);\n}","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar as_type = exports.as_type = function as_type(a, b) {\n return [a, b].join('_').toUpperCase();\n};\n\nvar crud_type = exports.crud_type = function crud_type(type) {\n var actions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return actions.concat(['index_loading', 'index', 'index_error', 'show_loading', 'show', 'show_error', 'create_loading', 'create', 'create_error', 'update_loading', 'update', 'update_error', 'destroy_loading', 'destroy', 'destroy_error', 'upload_loading', 'upload_progress', 'upload_waiting', 'upload_complete', 'upload_error', 'sort']).reduce(function (a, b) {\n return (a[b] = as_type(type, b)) && a;\n }, {});\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.upload_action = undefined;\nexports.crud_upload = crud_upload;\n\nvar _crud = require('./crud.types');\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction crud_upload(type, fd, data, dispatch) {\n return new Promise(function (resolve, reject) {\n var id = data.id;\n\n Object.keys(data).forEach(function (key) {\n if (key !== 'id') {\n fd.append(key, data[key]);\n }\n });\n\n var xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.addEventListener(\"load\", uploadComplete, false);\n xhr.addEventListener(\"error\", uploadFailed, false);\n xhr.addEventListener(\"abort\", uploadCancelled, false);\n xhr.open(\"POST\", '/' + type + '/' + id + '/upload/');\n xhr.send(fd);\n\n dispatch && dispatch({ type: (0, _crud.as_type)(type, 'upload_loading') });\n\n var complete = false;\n\n function uploadProgress(e) {\n if (e.lengthComputable) {\n var percent = Math.round(e.loaded * 100 / e.total) || 0;\n if (percent > 99) {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_waiting'),\n percent: percent\n }, type, id));\n } else {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_progress'),\n percent: percent\n }, type, id));\n }\n } else {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_error'),\n error: 'unable to compute upload progress'\n }, type, id));\n }\n }\n\n function uploadComplete(e) {\n try {\n var _data = JSON.parse(e.target.responseText);\n } catch (e) {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_error'),\n error: 'upload failed'\n }, type, id));\n reject(e);\n return;\n }\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_complete'),\n data: data\n }, type, id));\n resolve(data);\n }\n\n function uploadFailed(evt) {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_error'),\n error: 'upload failed'\n }, type, id));\n reject(evt);\n }\n\n function uploadCancelled(evt) {\n dispatch && dispatch(_defineProperty({\n type: (0, _crud.as_type)(type, 'upload_error'),\n error: 'upload cancelled'\n }, type, id));\n reject(evt);\n }\n });\n}\n\nvar upload_action = exports.upload_action = function upload_action(type, id, fd) {\n return function (dispatch) {\n return crud_upload(type, id, fd, dispatch);\n };\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.actions = exports.parser = exports.util = undefined;\n\nvar _crud = require('./crud.actions');\n\nvar _util = require('../util');\n\nvar util = _interopRequireWildcard(_util);\n\nvar _parser = require('./parser');\n\nvar parser = _interopRequireWildcard(_parser);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/*\nfor our crud events, create corresponding actions\nthe actions fire a 'loading' event, call the underlying api method, and then resolve.\nso you can do ... \n import { folderActions } from '../../api'\n folderActions.index({ module: 'samplernn' })\n folderActions.show(12)\n folderActions.create({ module: 'samplernn', name: 'foo' })\n folderActions.update(12, { module: 'pix2pix' })\n folderActions.destroy(12, { confirm: true })\n folderActions.upload(12, form_data)\n*/\n\nexports.util = util;\nexports.parser = parser;\nvar actions = exports.actions = ['folder', 'file', 'dataset', 'task', 'user'].reduce(function (a, b) {\n return (a[b] = (0, _crud.crud_actions)(b)) && a;\n}, {});","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.tumblr = exports.thumbnail = exports.loadImage = exports.tag = exports.parse = exports.lookup = exports.integrations = undefined;\n\nvar _nodeFetch = require('node-fetch');\n\nvar _nodeFetch2 = _interopRequireDefault(_nodeFetch);\n\nvar _fetchJsonp = require('fetch-jsonp');\n\nvar _fetchJsonp2 = _interopRequireDefault(_fetchJsonp);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar integrations = exports.integrations = [{\n type: 'image',\n regex: /\\.(jpeg|jpg|gif|png|svg)(\\?.*)?$/i,\n fetch: function fetch(url, done) {\n var img = new Image();\n img.onload = function () {\n if (!img) return;\n var width = img.naturalWidth,\n height = img.naturalHeight;\n img = null;\n done({\n url: url,\n type: \"image\",\n token: \"\",\n thumbnail: \"\",\n title: \"\",\n width: width,\n height: height\n });\n };\n img.src = url;\n if (img.complete) {\n img.onload();\n }\n },\n tag: function tag(media) {\n return '';\n }\n}, {\n type: 'video',\n regex: /\\.(mp4|webm)(\\?.*)?$/i,\n fetch: function fetch(url, done) {\n var video = document.createElement(\"video\");\n var url_parts = url.replace(/\\?.*$/, \"\").split(\"/\");\n var filename = url_parts[url_parts.length - 1];\n video.addEventListener(\"loadedmetadata\", function () {\n var width = video.videoWidth,\n height = video.videoHeight;\n video = null;\n done({\n url: url,\n type: \"video\",\n token: url,\n thumbnail: \"/public/assets/img/video-thumbnail.png\",\n title: filename,\n width: width,\n height: height\n });\n });\n video.src = url;\n video.load();\n },\n tag: function tag(media) {\n return '