From e4b278962295f2cb428493f28e144f3381fe6383 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Sat, 8 Feb 2020 06:48:27 +0000 Subject: [PATCH 01/31] Optimise plugin stack --- imports/ui/libraries/tab_Libraries_Folder.jsx | 606 ++++++++++-------- server/main.js | 51 +- 2 files changed, 374 insertions(+), 283 deletions(-) diff --git a/imports/ui/libraries/tab_Libraries_Folder.jsx b/imports/ui/libraries/tab_Libraries_Folder.jsx index 106e35a4..7926b7f2 100644 --- a/imports/ui/libraries/tab_Libraries_Folder.jsx +++ b/imports/ui/libraries/tab_Libraries_Folder.jsx @@ -1,22 +1,22 @@ -import {css} from '@emotion/core'; +import { css } from '@emotion/core'; import Checkbox from '@material-ui/core/Checkbox'; -import {Meteor} from 'meteor/meteor'; -import {withTracker} from 'meteor/react-meteor-data'; -import React, {Component} from 'react'; -import {Button, Dropdown} from 'react-bootstrap'; +import { Meteor } from 'meteor/meteor'; +import { withTracker } from 'meteor/react-meteor-data'; +import React, { Component } from 'react'; +import { Button, Dropdown } from 'react-bootstrap'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import Modal from "reactjs-popup"; -import ReactDOM, {render} from 'react-dom'; +import ReactDOM, { render } from 'react-dom'; import InputRange from 'react-input-range'; import ToggleButton from 'react-toggle-button'; -import {GlobalSettingsDB, SettingsDB, StatisticsDB} from '../../api/tasks.js'; +import { GlobalSettingsDB, SettingsDB, StatisticsDB } from '../../api/tasks.js'; import AudioCodec from './AudioCodec.jsx'; import Plugin from './Plugin.jsx'; import ScheduleBlock from './ScheduleBlock.jsx'; import VideoCodec from './VideoCodec.jsx'; -const borderRadiusStyle = {borderRadius: 2}; +const borderRadiusStyle = { borderRadius: 2 }; import ScaleLoader from 'react-spinners/ScaleLoader'; @@ -36,7 +36,8 @@ class Folder extends Component { cacheBrowser: false, outputBrowser: false, navItemSelected: 'navSourceFolder', - pluginStackCopyList:',,' + pluginStackCopyList: ',,', + pluginsStored: [], }; this.scanFiles = this.scanFiles.bind(this); @@ -67,9 +68,28 @@ class Folder extends Component { this.props.libraryItem._id + 'o' ); - this.interval2 = setInterval(() =>this.getServerTime(), 1000); + this.interval2 = setInterval(() => this.getServerTime(), 1000); + + Meteor.call('searchPlugins', '', 'Local', (error, result) => { + this.setState({ + pluginsStored: result[0] + }); + + }) + + Meteor.call('searchPlugins', '', 'Community', (error, result) => { + + var arr = this.state.pluginsStored + + arr = arr.concat(result[0]) + this.setState({ + pluginsStored: arr + }); + + }) }; + getServerTime = () => { Meteor.call('getTimeNow', (error, result) => { render(result, document.getElementById('serverTime')); @@ -83,83 +103,18 @@ class Folder extends Component { verifyFolder = (folderPath, type, refType) => { - try{ - - Meteor.call( - 'verifyFolder', - folderPath, - this.props.libraryItem._id, - type + 'Valid', - (error, result) => { - if (result === undefined) { - // no-op - } else if (result.length == 0) { - render( - , - - document.getElementById(refType + 'Results') - ); - } else { - var results = result.map((row, i) => { - return ( - - -

{row.folder}

- - - - {' '} - - - - ); - }); + try { - render( -
+ Meteor.call( + 'verifyFolder', + folderPath, + this.props.libraryItem._id, + type + 'Valid', + (error, result) => { + if (result === undefined) { + // no-op + } else if (result.length == 0) { + render( , + + document.getElementById(refType + 'Results') + ); + } else { + var results = result.map((row, i) => { + return ( + + +

{row.folder}

+ + + + {' '} + + + + ); + }); + + render( +
+ - - {results} -
-
, - document.getElementById(refType + 'Results') - ); + + {results} +
+
, + document.getElementById(refType + 'Results') + ); + } } - } - ); + ); - }catch(err){} + } catch (err) { } }; handleChange(event) { - const {name, value} = event.target; - const {_id} = this.props.libraryItem; + const { name, value } = event.target; + const { _id } = this.props.libraryItem; + - //turn off folder watcher if folder name change detected if (name == 'folder') { @@ -237,8 +257,8 @@ class Folder extends Component { } handleChangeChkBx(event) { - const {name, checked} = event.target; - const {_id} = this.props.libraryItem; + const { name, checked } = event.target; + const { _id } = this.props.libraryItem; SettingsDB.upsert(_id, { $set: { @@ -322,42 +342,64 @@ class Folder extends Component { plugins = plugins.filter( setting => setting._id == this.props.libraryItem._id ); - plugins = plugins[0].pluginIDs.sort(function(a, b) { + plugins = plugins[0].pluginIDs.sort(function (a, b) { return a.priority - b.priority; }); - Meteor.call('buildPluginStack', plugins, (error, result) => { - //console.log(result) - result = result.sort(function(a, b) { - return a.priority - b.priority; - }); + var pluginsStored = this.state.pluginsStored + for (var i = 0; i < plugins.length; i++) { + var thisPlugin = pluginsStored.filter(row => row.source == plugins[i].source && row.id == plugins[i]._id) + if (thisPlugin.length == 1) { - var pluginStackCopy = '' + plugins[i] = { ...plugins[i], ...thisPlugin[0] } - var stack = result.map(pluginItem => { + } else { - pluginStackCopy += `${pluginItem.source},${pluginItem._id},,` + var obj = { + Name: "Read error", + Type: "Read error", + Operation: "Read error", + Description: 'Read error', + Version: "Read error", + Link: "Read error" + } + plugins[i] = { ...plugins[i], ...obj } + } + } + var result = plugins - return ( - - ); - }); + var pluginStackCopy = '' + + var stack = result.map(pluginItem => { + + pluginStackCopy += `${pluginItem.source},${pluginItem._id},,` - if (pluginStackCopy != this.state.pluginStackCopyList) { - this.setState({ - pluginStackCopyList: pluginStackCopy, - }); - } + + + + return ( + + ); + }); + + if (pluginStackCopy != this.state.pluginStackCopyList) { + + this.setState({ + pluginStackCopyList: pluginStackCopy, + }); + } + + try { render( @@ -427,7 +469,9 @@ class Folder extends Component { document.getElementById(this.props.libraryItem._id + 'PluginStack') ); - }); + + } catch (err) { console.log(err) } + // }); }; renderVideoCodecsExclude() { @@ -636,10 +680,10 @@ class Folder extends Component { addPlugin(event) { event.preventDefault(); - console.log(event.target.name) + // console.log(event.target.name) - if(event.target.name == 'Single'){ + if (event.target.name == 'Single') { const text = ReactDOM.findDOMNode(this.refs.addPluginText).value.trim(); var source; @@ -660,23 +704,23 @@ class Folder extends Component { ReactDOM.findDOMNode(this.refs.addPluginText).value = ''; - }else if(event.target.name == 'Stack'){ + } else if (event.target.name == 'Stack') { const text = ReactDOM.findDOMNode(this.refs.addStackText).value.trim(); - var arr = text.split(',,') + var arr = text.split(',,') console.log(arr) var priority = this.props.libraryItem.pluginIDs.length - for(var i = 0; i < arr.length; i++){ + for (var i = 0; i < arr.length; i++) { var plugin = arr[i].split(',') //check plugin text is valid - if(plugin.length == 2 && (plugin[0] === 'Local' || plugin[0] === 'Community')){ + if (plugin.length == 2 && (plugin[0] === 'Local' || plugin[0] === 'Community')) { Meteor.call( 'addPluginInclude', @@ -687,13 +731,13 @@ class Folder extends Component { ); priority++ - + } ReactDOM.findDOMNode(this.refs.addStackText).value = ''; } } - + // var thisLibraryPlugins = SettingsDB.find( // {_id: this.props.libraryItem._id}, @@ -710,7 +754,7 @@ class Folder extends Component { - + } addVideoCodecExclude(event) { @@ -807,92 +851,92 @@ class Folder extends Component { -
-
- this.scanFiles(0)} +
+
- Scan (Find new) + this.scanFiles(0)} + > + Scan (Find new) - this.scanFiles(1)} - > - Scan (Fresh) + this.scanFiles(1)} + > + Scan (Fresh) - this.setAllStatus('TranscodeDecisionMaker')} - > - - Requeue all items (transcode) + this.setAllStatus('TranscodeDecisionMaker')} + > + + Requeue all items (transcode) - - this.setAllStatus('HealthCheck')} - > - - Requeue all items (health check) + + this.setAllStatus('HealthCheck')} + > + + Requeue all items (health check) - + - { - if ( - confirm( - "Are you sure you want to reset this library's stats?" - ) - ) { - SettingsDB.upsert(this.props.libraryItem._id, { - $set: { - totalTranscodeCount: 0, - sizeDiff: 0, - totalHealthCheckCount: 0, + { + if ( + confirm( + "Are you sure you want to reset this library's stats?" + ) + ) { + SettingsDB.upsert(this.props.libraryItem._id, { + $set: { + totalTranscodeCount: 0, + sizeDiff: 0, + totalHealthCheckCount: 0, + } } - } - ); + ); - } - } + } + } - }>Reset stats: All + }>Reset stats: All - { + { -var priority = SettingsDB.find({}, { sort: { createdAt: 1 } }).fetch().length -var thisLibrary = (SettingsDB.find({ _id: this.props.libraryItem._id }, { sort: { createdAt: 1 } }).fetch())[0] + var priority = SettingsDB.find({}, { sort: { createdAt: 1 } }).fetch().length + var thisLibrary = (SettingsDB.find({ _id: this.props.libraryItem._id }, { sort: { createdAt: 1 } }).fetch())[0] -thisLibrary.name = thisLibrary.name +" (Duplicate)" -thisLibrary.priority = priority + thisLibrary.name = thisLibrary.name + " (Duplicate)" + thisLibrary.priority = priority -delete thisLibrary._id; -SettingsDB.insert(thisLibrary) + delete thisLibrary._id; + SettingsDB.insert(thisLibrary) -} + } -}>Duplicate library + }>Duplicate library - { + { - if (confirm('Are you sure you want to clear this library? Your files will not be affected.')) { - this.removeLibrary(this.props.libraryItem._id) + if (confirm('Are you sure you want to clear this library? Your files will not be affected.')) { + this.removeLibrary(this.props.libraryItem._id) + } } - } - }>Clear library + }>Clear library - Delete library + Delete library -
+
@@ -1005,7 +1049,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navSourceFolder' ? 'selectedNav' @@ -1022,7 +1066,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navCacheFolder' ? 'selectedNav' @@ -1039,7 +1083,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navOutputFolder' ? 'selectedNav' @@ -1056,7 +1100,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navContainers' ? 'selectedNav' @@ -1073,7 +1117,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navTranscode' ? 'selectedNav' @@ -1090,7 +1134,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navHealthCheck' ? 'selectedNav' @@ -1107,7 +1151,7 @@ SettingsDB.insert(thisLibrary) }, }); }} - style={{cursor: 'pointer'}} + style={{ cursor: 'pointer' }} className={ this.props.libraryItem.navItemSelected == 'navSchedule' ? 'selectedNav' @@ -1361,7 +1405,7 @@ SettingsDB.insert(thisLibrary) >

Under normal operation Tdarr is designed to work directly on - your library, replacing original files so you don't need to touch these options. You can enable folder to folder conversion below however + your library, replacing original files so you don't need to touch these options. You can enable folder to folder conversion below however this doesn't fit in with how Tdarr operates. Please test before using. {' '}

@@ -1377,77 +1421,77 @@ SettingsDB.insert(thisLibrary)

- Output Folder: -

- - - { - SettingsDB.upsert(this.props.libraryItem._id, { - $set: { - folderToFolderConversion: !this.props.libraryItem - .folderToFolderConversion, - }, - }); - }} - /> + Output Folder: +
-
+ { + SettingsDB.upsert(this.props.libraryItem._id, { + $set: { + folderToFolderConversion: !this.props.libraryItem + .folderToFolderConversion, + }, + }); + }} + /> + -Copy to output if conditions already met: -
- - { - SettingsDB.upsert(this.props.libraryItem._id, { - $set: { - copyIfConditionsMet: !this.props.libraryItem - .copyIfConditionsMet, - }, - }); - }} - />
+ Copy to output if conditions already met: +
-Delete source file: -
- - { - SettingsDB.upsert(this.props.libraryItem._id, { - $set: { - folderToFolderConversionDeleteSource: !this.props.libraryItem - .folderToFolderConversionDeleteSource, - }, - }); - }} - /> + { + SettingsDB.upsert(this.props.libraryItem._id, { + $set: { + copyIfConditionsMet: !this.props.libraryItem + .copyIfConditionsMet, + }, + }); + }} + /> +
+ + + Delete source file: +
+ + { + SettingsDB.upsert(this.props.libraryItem._id, { + $set: { + folderToFolderConversionDeleteSource: !this.props.libraryItem + .folderToFolderConversionDeleteSource, + }, + }); + }} + />

@@ -1748,7 +1792,7 @@ SettingsDB.insert(thisLibrary)
- {this.renderPlugins()} + {this.state.pluginsStored ? this.renderPlugins() : null}
@@ -1762,10 +1806,10 @@ SettingsDB.insert(thisLibrary) this.props.libraryItem.decisionMaker.pluginFilter ? 'hidden' : this.props.libraryItem.decisionMaker.videoFilter - ? '' - : this.props.libraryItem.decisionMaker.audioFilter - ? '' - : 'hidden' + ? '' + : this.props.libraryItem.decisionMaker.audioFilter + ? '' + : 'hidden' } >
@@ -1775,7 +1819,7 @@ SettingsDB.insert(thisLibrary)

Output file container:

-
{' '}
-

CLI arguments/preset:

+

CLI arguments/preset:

this.handleChangeChkBx2(event, 'video')} @@ -1837,9 +1881,9 @@ SettingsDB.insert(thisLibrary) name="IncludeSwitch" checked={ this.props.libraryItem.decisionMaker.videoExcludeSwitch != - undefined + undefined ? !this.props.libraryItem.decisionMaker - .videoExcludeSwitch + .videoExcludeSwitch : false } onChange={event => this.handleChangeChkBx2(event, 'video')} @@ -1847,7 +1891,7 @@ SettingsDB.insert(thisLibrary) transcode videos in these codecs:

-
+
this.handleChangeChkBx2(event, 'audio')} @@ -1955,9 +1999,9 @@ SettingsDB.insert(thisLibrary) name="IncludeSwitch" checked={ this.props.libraryItem.decisionMaker.audioExcludeSwitch != - undefined + undefined ? !this.props.libraryItem.decisionMaker - .audioExcludeSwitch + .audioExcludeSwitch : false } onChange={event => this.handleChangeChkBx2(event, 'audio')} @@ -2077,6 +2121,6 @@ export default withTracker(() => { Meteor.subscribe('SettingsDB'); return { - settings: SettingsDB.find({}, {sort: {priority: 1}}).fetch(), + settings: SettingsDB.find({}, { sort: { priority: 1 } }).fetch(), }; })(Folder); diff --git a/server/main.js b/server/main.js index fdc688d0..d5e12a6b 100644 --- a/server/main.js +++ b/server/main.js @@ -1020,12 +1020,23 @@ function main() { var obj = plugin.details(); - + obj.source = pluginType plugins.push(obj) } catch (err) { console.log(err.stack) + var obj = { + Name: "Read error", + Type: "Read error", + Operation: "Read error", + Description: 'Read error', + Version: "Read error", + Link: "Read error", + source: pluginType, + } + plugins.push(obj) + } }); @@ -1084,7 +1095,7 @@ function main() { }, - 'buildPluginStack'(plugins) { + 'buildPluginStack'() { for (var i = 0; i < plugins.length; i++) { @@ -1119,6 +1130,42 @@ function main() { } return plugins + + // + + // for (var i = 0; i < plugins.length; i++) { + + // try { + + + // var pluginLocalPath = path.join(process.cwd(), `/assets/app/plugins/${plugins[i].source}/` + plugins[i]._id + '.js') + // fsextra.copySync(homePath + `/Tdarr/Plugins/${plugins[i].source}/` + plugins[i]._id + ".js", pluginLocalPath) + + // var plugin = importFresh(pluginLocalPath) + + // var obj = plugin.details(); + + // plugins[i] = { ...plugins[i], ...obj }; + + // } catch (err) { + + // var obj = { + // Name: "Read error", + // Type: "Read error", + // Operation: "Read error", + // Description: 'Read error', + // Version: "Read error", + // Link: "Read error" + // } + + // //console.log(err.stack) + + // plugins[i] = { ...plugins[i], ...obj }; + + // } + // } + // return plugins + }, 'verifyPlugin'(pluginID, DB_id, community) { From 0fc04975e5a2147b8517b3a94022cd9560db79e2 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Mon, 10 Feb 2020 23:14:19 +0000 Subject: [PATCH 02/31] Fixe local images paths when using custom base path --- imports/ui/App.jsx | 3 +- imports/ui/Local_Image.jsx | 34 +++++ imports/ui/libraries/tab_Libraries.jsx | 9 +- .../plugins/pluginTemplates/PluginGuide.jsx | 79 ++++++------ imports/ui/tab_Dev.jsx | 6 +- imports/ui/tab_Help.jsx | 118 +++++++++--------- 6 files changed, 147 insertions(+), 102 deletions(-) create mode 100644 imports/ui/Local_Image.jsx diff --git a/imports/ui/App.jsx b/imports/ui/App.jsx index 85257e3c..e47a6b7d 100644 --- a/imports/ui/App.jsx +++ b/imports/ui/App.jsx @@ -36,7 +36,7 @@ const tabs = [ {path: '/', text: 'Dev', component: TabDev}, ]; -const AppRouter = () => { +export default AppRouter = () => { @@ -171,4 +171,3 @@ const AppRouter = () => { ); }; -export default AppRouter; diff --git a/imports/ui/Local_Image.jsx b/imports/ui/Local_Image.jsx new file mode 100644 index 00000000..3b5def62 --- /dev/null +++ b/imports/ui/Local_Image.jsx @@ -0,0 +1,34 @@ + + +import React, { Component } from 'react'; +import { GlobalSettingsDB } from '../api/tasks.js'; + +export default LocalImage = (props) => { + + + const [link, setLink] = React.useState(''); + + React.useEffect(() => { + + + Meteor.subscribe('GlobalSettingsDB', () => { + + + const basePath = GlobalSettingsDB.find({}).fetch()[0].basePath; + + var updatedLink = basePath + props.link + + setLink(updatedLink); + + }); + + }); + + return ( + + {props.alt + + ); + +} + diff --git a/imports/ui/libraries/tab_Libraries.jsx b/imports/ui/libraries/tab_Libraries.jsx index bd48331e..44d647f5 100644 --- a/imports/ui/libraries/tab_Libraries.jsx +++ b/imports/ui/libraries/tab_Libraries.jsx @@ -13,6 +13,7 @@ import Modal from "reactjs-popup"; import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import LocalImage from '../Local_Image.jsx'; @@ -45,9 +46,7 @@ class App extends Component { } } ); - } - } @@ -813,7 +812,8 @@ class App extends Component {

Provide a base folder path and the folder browser will show subfolders which you can navigate to using the buttons.

- + +

'Scan (Find new)' does 2 things - it removes files from the database which don't exist anymore, and adds newly detected files. Turn on 'Folder watch' to automate this process. New files will be scanned for every 30 seconds or so.

All new files will be added to both the transcode queues and the health check queues. If you're not interested in using one or the other, then just make sure not to fire up any workers for that respective queue.

@@ -824,7 +824,8 @@ class App extends Component {

In the library transcode settings, you can either use plugins or manually set either video file or audio file transcode settings.

You can stack plugins but this will increase the number of transcode/remux passes on a file. It's best to use/create a plugin which can do what you need all at once.

- + +

See the plugins tab for plugins info on creating a plugin.

diff --git a/imports/ui/plugins/pluginTemplates/PluginGuide.jsx b/imports/ui/plugins/pluginTemplates/PluginGuide.jsx index c335504d..c31e49f8 100644 --- a/imports/ui/plugins/pluginTemplates/PluginGuide.jsx +++ b/imports/ui/plugins/pluginTemplates/PluginGuide.jsx @@ -1,8 +1,10 @@ import React, { Component } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; -import { Button} from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import ReactDOM from 'react-dom'; +import LocalImage from '../../Local_Image.jsx'; + @@ -13,13 +15,13 @@ var ButtonStyle = { - class App extends Component { +class App extends Component { constructor(props) { super(props); this.state = { - + }; @@ -42,57 +44,58 @@ var ButtonStyle = {
-
-
-
+
+
+
-

Guide

+

Guide

-
-
-
+
+
+
-

Each of your libraries can have its own plugin stack. Use both community and local plugins to create a stack which processes your files to your requirements.

+

Each of your libraries can have its own plugin stack. Use both community and local plugins to create a stack which processes your files to your requirements.

-

Plugins created in the plugin creator will be saved locally in 'Tdarr/Plugins/Local' and can be viewed on the 'Local' plugins tab to the upper left. Plugins are written in JavaScript and are highly configurable. It is encouraged that you open up plugins in a text/code editor and modify them to do exactly what you need.

+

Plugins created in the plugin creator will be saved locally in 'Tdarr/Plugins/Local' and can be viewed on the 'Local' plugins tab to the upper left. Plugins are written in JavaScript and are highly configurable. It is encouraged that you open up plugins in a text/code editor and modify them to do exactly what you need.

-
-
+
+
-

The following illustrates how the plugin stack works.

+

The following illustrates how the plugin stack works.

-
+
-

- -

+

+ {/* */} + +

-
+
-

It is best practice to put video transcode plugins at the top of your stack and then your other plugins. Think logically - about how your files will be processed. For example, let's say you have 2 plugins: +

It is best practice to put video transcode plugins at the top of your stack and then your other plugins. Think logically + about how your files will be processed. For example, let's say you have 2 plugins:

-

(1) Transcode non hevc files into hevc mkv

-

(2) Remux non-mkv files into mkv

-

It would not makes sense to put the remux plugin above the transcode plugin. In the above stack if, for example, a h264 MP4 file enters the stack, only the transcode plugin would need to be used. If the remux plugin was above the transcode plugin, 2 plugins would need to be used, resulting in additional processing time and more disk read/writes.

-

+

(1) Transcode non hevc files into hevc mkv

+

(2) Remux non-mkv files into mkv

+

It would not makes sense to put the remux plugin above the transcode plugin. In the above stack if, for example, a h264 MP4 file enters the stack, only the transcode plugin would need to be used. If the remux plugin was above the transcode plugin, 2 plugins would need to be used, resulting in additional processing time and more disk read/writes.

+

-
-

When using Tdarr it's important that you implement conditions/filters to prevent your files from going through an infinite transcode/remux cycle. For example, if you're transcoding into hevc, then add a filter to prevent hevc being transcoded. That way your new files (in hevc), won't be re-transcoded. You can use the 'Force processing' buttons to force a plugin through your first plugin (applies to plugins created in the plugin creator from 1.101+).

+
+

When using Tdarr it's important that you implement conditions/filters to prevent your files from going through an infinite transcode/remux cycle. For example, if you're transcoding into hevc, then add a filter to prevent hevc being transcoded. That way your new files (in hevc), won't be re-transcoded. You can use the 'Force processing' buttons to force a plugin through your first plugin (applies to plugins created in the plugin creator from 1.101+).

-

Some actions/plugins have built-in filters. This means they'll automatically detect if a file needs to be processed or not (such as the remove subtitles community plugin). Additional filters can be added.

+

Some actions/plugins have built-in filters. This means they'll automatically detect if a file needs to be processed or not (such as the remove subtitles community plugin). Additional filters can be added.

-

To use plugins, press the 'Copy id' button on one of the plugins on the 'Plugins' tab. Paste the id in the plugin id box in the 'Transcode' section of one of your libraries. Make sure to use the checkboxes to specify whether it's a Community or Local plugin.

+

To use plugins, press the 'Copy id' button on one of the plugins on the 'Plugins' tab. Paste the id in the plugin id box in the 'Transcode' section of one of your libraries. Make sure to use the checkboxes to specify whether it's a Community or Local plugin.

-
+
-
-
-
+
+
+
@@ -104,14 +107,14 @@ var ButtonStyle = { export default withTracker(() => { - -return { - + + return { + -}; + }; })(App); diff --git a/imports/ui/tab_Dev.jsx b/imports/ui/tab_Dev.jsx index 4458873b..626d4056 100644 --- a/imports/ui/tab_Dev.jsx +++ b/imports/ui/tab_Dev.jsx @@ -5,6 +5,8 @@ import { Button } from 'react-bootstrap'; import LatestDevNotes from './tab_Dev_latest.jsx'; +import LocalImage from './Local_Image.jsx'; + @@ -55,7 +57,7 @@ export default class App extends Component {

- +

@@ -85,7 +87,7 @@ export default class App extends Component {

- +

diff --git a/imports/ui/tab_Help.jsx b/imports/ui/tab_Help.jsx index 450f0a31..90d17407 100644 --- a/imports/ui/tab_Help.jsx +++ b/imports/ui/tab_Help.jsx @@ -9,6 +9,8 @@ import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; import { render } from 'react-dom'; import ReactDOM from 'react-dom' +import LocalImage from './Local_Image.jsx'; + @@ -63,7 +65,7 @@ export default class App extends Component { - runHelpCommand = (mode, input ) => { + runHelpCommand = (mode, input) => { var text = ReactDOM.findDOMNode(this.refs[input]).value.trim() @@ -93,35 +95,37 @@ export default class App extends Component { -
- +
- +
- - - - - - + + + + + -
- window.open("https://discord.gg/GF8X8cq", "_blank")} alt='icon' height="60" width="60" /> -
- window.open("https://github.com/HaveAGitGat/Tdarr/wiki", "_blank")} alt='icon' height="60" width="60" /> -
- -
- window.open("https://www.reddit.com/r/Tdarr", "_blank")} alt='icon' height="60" width="60" /> -
+
window.open("https://discord.gg/GF8X8cq", "_blank")} > + +
+
+
window.open("https://github.com/HaveAGitGat/Tdarr/wiki", "_blank")}> + +
+
+
window.open("https://www.reddit.com/r/Tdarr", "_blank")}> + +
+
+ -
+
-

-

+

+

unRAID: Enable NVENC: https://forums.unraid.net/topic/77813-plugin-linuxserverio-unraid-nvidia/

@@ -131,69 +135,71 @@ export default class App extends Component {

- - + +
-

Terminal:

- - -

FFmpeg

-

HandBrake

-
+

Terminal:

+ + +

FFmpeg

+

HandBrake

+
+ +
-
+ { - { - - event.preventDefault(); - this.runHelpCommand("ffmpeg", "ffmpegCommand")}} > + event.preventDefault(); + this.runHelpCommand("ffmpeg", "ffmpegCommand") + }} > -
+
-

FFmpeg

-

- -
+

FFmpeg

+

+ +
- + -
-
-
+
+
+
-
{ - event.preventDefault(); - this.runHelpCommand("handbrake", "handbrakeCommand")}} > + { + event.preventDefault(); + this.runHelpCommand("handbrake", "handbrakeCommand") + }} > -
-

HandBrakeCLI

-

- +
+

HandBrakeCLI

+

+ -
+
-
+ -
+
-
- +
+
From 1a4776003e1c7ba73d4d45a7f2afbb8b7af3805e Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 11 Feb 2020 01:52:19 +0000 Subject: [PATCH 03/31] fileScanner improvements --- private/{ => fileScanner}/ccextractor.js | 0 .../{ => fileScanner}/ccextractor/ccextractor | Bin .../ccextractor/ccextractorwin.exe | Bin private/{ => fileScanner}/fileScanner.js | 252 +++--------------- private/fileScanner/runCCExtractor.js | 125 +++++++++ private/fileScanner/runExifTool.js | 52 ++++ private/fileScanner/runFFprobe.js | 58 ++++ 7 files changed, 272 insertions(+), 215 deletions(-) rename private/{ => fileScanner}/ccextractor.js (100%) rename private/{ => fileScanner}/ccextractor/ccextractor (100%) rename private/{ => fileScanner}/ccextractor/ccextractorwin.exe (100%) rename private/{ => fileScanner}/fileScanner.js (66%) create mode 100644 private/fileScanner/runCCExtractor.js create mode 100644 private/fileScanner/runExifTool.js create mode 100644 private/fileScanner/runFFprobe.js diff --git a/private/ccextractor.js b/private/fileScanner/ccextractor.js similarity index 100% rename from private/ccextractor.js rename to private/fileScanner/ccextractor.js diff --git a/private/ccextractor/ccextractor b/private/fileScanner/ccextractor/ccextractor similarity index 100% rename from private/ccextractor/ccextractor rename to private/fileScanner/ccextractor/ccextractor diff --git a/private/ccextractor/ccextractorwin.exe b/private/fileScanner/ccextractor/ccextractorwin.exe similarity index 100% rename from private/ccextractor/ccextractorwin.exe rename to private/fileScanner/ccextractor/ccextractorwin.exe diff --git a/private/fileScanner.js b/private/fileScanner/fileScanner.js similarity index 66% rename from private/fileScanner.js rename to private/fileScanner/fileScanner.js index 5c822d27..6813ff58 100644 --- a/private/fileScanner.js +++ b/private/fileScanner/fileScanner.js @@ -64,17 +64,18 @@ var path = require("path"); var fs = require('fs'); if (fs.existsSync(path.join(process.cwd(), "/npm"))) { - var rootModules = path.join(process.cwd(), '/npm/node_modules/') - } else { var rootModules = '' } const isDocker = require(rootModules + 'is-docker'); -const exiftool = require(rootModules + "exiftool-vendored").exiftool -var shell = require(rootModules + 'shelljs'); +const importFresh = require(rootModules + 'import-fresh'); + +const runFFprobe = importFresh('./runFFprobe.js') +const runExifTool = importFresh('./runExifTool.js') +const runCCExtractor = importFresh('./runCCExtractor.js') var home = require("os").homedir(); @@ -224,9 +225,6 @@ if (arrayOrPathSwitch == 1) { - - - } else { if (checkContainer(fullPath) == true && isInIgnoredFolder(fullPath) == false) { @@ -365,13 +363,9 @@ function ffprobeLaunch(filesToScan) { updateConsole(scannerID, `ffprobeLaunch received these files:${filesToScan} `) - var ffprobe = require(rootModules + 'ffprobe'), - ffprobeStatic = require(rootModules + 'ffprobe-static'); var path = require("path"); - var ffprobeStaticPath = '' - - - ffprobeStaticPath = require(rootModules + 'ffprobe-static').path + var ffprobeStaticPath = require(rootModules + 'ffprobe-static').path + const exiftool = require(rootModules + "exiftool-vendored").exiftool var k = 0; @@ -380,33 +374,42 @@ function ffprobeLaunch(filesToScan) { function loopArray(filesToScan, i) { - - - - var filepath = filesToScan[i] - - try { if (fs.existsSync(filepath)) { - // Meteor.call('logthis', "Extracting data from this file:" + filepath, function (error, result) { }); + updateConsole(scannerID, `Launching FFprobe on this file: ${filepath}`) + async function runExtractions(filepath) { - updateConsole(scannerID, `Launching FFprobe on this file: ${filepath}`) + try { + var fileInfo = { + ffProbeData: '', + exifToolData: '', + ccextractorData: '', + } - ffprobe(filepath, { path: ffprobeStaticPath }, function (err, jsonData) { - //if (err) return done(err); + fileInfo.ffProbeData = await runFFprobe(filepath); + if (fileInfo.ffProbeData.result != 'error') { + fileInfo.exifToolData = await runExifTool(filepath, exiftool); - if (err) { - updateConsole(scannerID, `FFprobe extract error on this file:${filepath}`) + if (closedCaptionScan == 'true') { + fileInfo.ccextractorData = await runCCExtractor(filepath); + extractData(filepath, fileInfo.ffProbeData.data, fileInfo.exifToolData.data, fileInfo.ccextractorData.data) + + } else { + extractData(filepath, fileInfo.ffProbeData.data, fileInfo.exifToolData.data, null) + } + - extractDataError(filepath, err) + } else { + extractDataError(filepath, fileInfo.ffProbeData.data) + } i++; if (i < filesToScan.length) { @@ -415,196 +418,17 @@ function ffprobeLaunch(filesToScan) { exiftool.end() } - + } catch (err) { + console.log(err) } - if (jsonData) { - - updateConsole(scannerID, `FFprobe extract success on this file:${filepath}. Launching exiftool`) - - exiftool - .read(filepath) - .then((tags /*: Tags */) => { - // console.log( - // `Title: ${tags.Title}` - //) - updateConsole(scannerID, `exiftool finished on this file:${filepath}`) - - // extractData(filepath, jsonData, tags) - - - // - - - - - if (closedCaptionScan == 'true') { - - - - var CCExtractorPath - var workerCommand - - if (process.platform == 'win32') { - - if (fs.existsSync(path.join(process.cwd(), "/npm"))) { - CCExtractorPath = path.join(process.cwd(), '/assets/app/ccextractor/ccextractorwin.exe') - } else { - CCExtractorPath = path.join(process.cwd(), '/private/ccextractor/ccextractorwin.exe') - } - - workerCommand = CCExtractorPath + " -debug -stdout -endat 01:00 --screenfuls 1 -out=null \"" + filepath + "\"" - - } - - if (process.platform == 'linux') { - if (fs.existsSync(path.join(process.cwd(), "/npm"))) { - CCExtractorPath = path.join(process.cwd(), '/assets/app/ccextractor/ccextractor') - } else { - CCExtractorPath = path.join(process.cwd(), '/private/ccextractor/ccextractor') - } - - var filepathUnix = filepath.replace(/'/g, '\'\"\'\"\''); - - workerCommand = CCExtractorPath + " -debug -stdout -endat 01:00 --screenfuls 1 -out=null '" + filepathUnix + "'" - - - - } - - if (process.platform == 'darwin') { - workerCommand = "" - - } - - - - // console.log(workerCommand) - - var CCExtractorOutput = "" - - // console.log("Checking for captions") - - updateConsole(scannerID, `Checking for captions`) - - - // - - var childProcess = require('child_process'); - - var workerPath = "assets/app/ccextractor.js" - - var hasClosedCaptions = false - - - shellThreadModule = childProcess.fork(workerPath, [], { - silent: true, - - }); - - - var infoArray = [ - "processFile", - workerCommand - ]; - - - shellThreadModule.send(infoArray); - - var killFlag = false - - - shellThreadModule.stderr.on('data', function (data) { - - //console.log(data) - // console.log(data.toString()) - - if (data.includes('Permission denied') || data.includes('error while loading')) { - console.log(data.toString()) - } - - if (data.includes('XDS:') || data.includes('Caption block')) { - - var infoArray = [ - "exitThread", - "itemCancelled", - ]; - - try { - killFlag = true - if (shellThreadModule != "") { - shellThreadModule.send(infoArray); - } - } catch (err) { } - - hasClosedCaptions = true - - } - - }); - - // setTimeout(killCCExtractor, 1000); - - function killCCExtractor() { - var infoArray = [ - "exitThread", - "itemCancelled", - ]; - - if (killFlag == false) { - - try { - if (shellThreadModule != "") { - shellThreadModule.send(infoArray); - } - } catch (err) { } - } - - } - - - - shellThreadModule.on("exit", function (code, ) { - - ('ccextractor:', code); - - extractData(filepath, jsonData, tags, hasClosedCaptions) - - i++; - if (i < filesToScan.length) { - loopArray(filesToScan, i); - } else { - exiftool.end() - } - - - }); - - - - } else { - - - extractData(filepath, jsonData, tags) - - i++; - if (i < filesToScan.length) { - loopArray(filesToScan, i); - } else { - exiftool.end() - } - - - - } + } + runExtractions(filepath) - // - }) - } - }); } + } catch (err) { console.error(err.stack); @@ -616,8 +440,6 @@ function ffprobeLaunch(filesToScan) { } else { exiftool.end() } - - } } @@ -626,9 +448,9 @@ function ffprobeLaunch(filesToScan) { if (!Array.isArray(filesToScan) || !filesToScan.length) { - exiftool.end() + } else { loopArray(filesToScan, k); @@ -736,9 +558,9 @@ function ffprobeLaunch(filesToScan) { //if (!!("video_codec_name" in thisFileObject)) { - try{ + try { var exifToolVerdict = thisFileObject.meta.MIMEType.includes('video') - }catch(err){ + } catch (err) { var exifToolVerdict = true } diff --git a/private/fileScanner/runCCExtractor.js b/private/fileScanner/runCCExtractor.js new file mode 100644 index 00000000..f34a6c12 --- /dev/null +++ b/private/fileScanner/runCCExtractor.js @@ -0,0 +1,125 @@ + +const fs = require('fs') +const path = require('path'); +if (fs.existsSync(path.join(process.cwd(), "/npm"))) { + var rootModules = path.join(process.cwd(), '/npm/node_modules/') +} else { + var rootModules = '' +} + +module.exports = function runCCExtractor(filepath) { + + + return new Promise(resolve => { + try { + + var CCExtractorPath + var workerCommand + + if (process.platform == 'win32') { + + if (fs.existsSync(path.join(process.cwd(), "/npm"))) { + CCExtractorPath = path.join(process.cwd(), '/assets/app/fileScanner/ccextractor/ccextractorwin.exe') + } else { + CCExtractorPath = path.join(process.cwd(), '/private/fileScanner/ccextractor/ccextractorwin.exe') + } + + workerCommand = CCExtractorPath + " -debug -stdout -endat 01:00 --screenfuls 1 -out=null \"" + filepath + "\"" + + } + + if (process.platform == 'linux') { + if (fs.existsSync(path.join(process.cwd(), "/npm"))) { + CCExtractorPath = path.join(process.cwd(), '/assets/app/fileScanner/ccextractor/ccextractor') + } else { + CCExtractorPath = path.join(process.cwd(), '/private/fileScanner/ccextractor/ccextractor') + } + + var filepathUnix = filepath.replace(/'/g, '\'\"\'\"\''); + workerCommand = CCExtractorPath + " -debug -stdout -endat 01:00 --screenfuls 1 -out=null '" + filepathUnix + "'" + } + + if (process.platform == 'darwin') { + workerCommand = "" + + } + + + + + const childProcess = require('child_process'); + const workerPath = "assets/app/fileScanner/ccextractor.js" + var hasClosedCaptions = false + + + shellThreadModule = childProcess.fork(workerPath, [], { + silent: true, + + }); + + + var infoArray = [ + "processFile", + workerCommand + ]; + + + shellThreadModule.send(infoArray); + + + shellThreadModule.stderr.on('data', function (data) { + + //console.log(data) + // console.log(data.toString()) + + if (data.includes('Permission denied') || data.includes('error while loading')) { + console.log(data.toString()) + } + + if (data.includes('XDS:') || data.includes('Caption block')) { + + var infoArray = [ + "exitThread", + "itemCancelled", + ]; + + try { + killFlag = true + if (shellThreadModule != "") { + shellThreadModule.send(infoArray); + } + } catch (err) { } + + hasClosedCaptions = true + + } + + }); + + + + shellThreadModule.on("exit", function (code, ) { + resolve( + { + result: 'success', + data: hasClosedCaptions, + } + ) + }); + + + } catch (err) { + + resolve( + { + result: 'error', + data: 'CCextractor encountered an error.', + } + ) + + } + }); +} + + + diff --git a/private/fileScanner/runExifTool.js b/private/fileScanner/runExifTool.js new file mode 100644 index 00000000..37a6dea9 --- /dev/null +++ b/private/fileScanner/runExifTool.js @@ -0,0 +1,52 @@ + +const fs = require('fs') +const path = require('path'); +if (fs.existsSync(path.join(process.cwd(), "/npm"))) { + var rootModules = path.join(process.cwd(), '/npm/node_modules/') +} else { + var rootModules = '' +} + +module.exports = function runExifTool(filepath,exiftool) { + + //const exiftool = require(rootModules + "exiftool-vendored").exiftool + + return new Promise(resolve => { + try { + exiftool + .read(filepath) + .then((tags /*: Tags */) => { + + resolve( + { + result: 'success', + data: tags, + } + ) + }) + .catch((error) => { + resolve( + { + result: 'error', + data: error, + } + ) + } + ) + + } catch (err) { + + + resolve( + { + result: 'error', + data: 'Exif tool encountered an error.', + } + ) + + } + }); +} + + + diff --git a/private/fileScanner/runFFprobe.js b/private/fileScanner/runFFprobe.js new file mode 100644 index 00000000..a07e7885 --- /dev/null +++ b/private/fileScanner/runFFprobe.js @@ -0,0 +1,58 @@ + +const fs = require('fs') +const path = require('path'); +if (fs.existsSync(path.join(process.cwd(), "/npm"))) { + var rootModules = path.join(process.cwd(), '/npm/node_modules/') +} else { + var rootModules = '' +} + + +module.exports = function runFFprobe(filepath) { + + const ffprobe = require(rootModules + 'ffprobe') + const ffprobeStaticPath = require(rootModules + 'ffprobe-static').path + + + + return new Promise(resolve => { + try { + ffprobe(filepath, { path: ffprobeStaticPath }, function (err, jsonData) { + //console.log(err) + //console.log(jsonData) + if (err) { + console.log(err) + resolve( + { + result: 'error', + data: 'FFprobe encountered an error:' + err, + } + ) + } + + if (jsonData) { + resolve( + { + result: 'success', + data: jsonData + } + ) + } + }); + } catch (err) { + + console.log(err.stack) + + resolve( + { + result: 'err', + data: 'FFprobe encountered an err:' + err, + } + ) + + } + }); +} + + + From 31634b91b3da4f460059fcda63f88d714705b666 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 11 Feb 2020 08:27:36 +0000 Subject: [PATCH 04/31] Refactor buttons + buttons now maintain load state until queue updated --- imports/ui/ButtonLibrary/Buttons.jsx | 118 +++ imports/ui/item_Button.jsx | 160 ++-- imports/ui/searchResults.jsx | 191 ++-- imports/ui/transcoding/tab_Transcoding.jsx | 990 +++++++++++---------- 4 files changed, 839 insertions(+), 620 deletions(-) create mode 100644 imports/ui/ButtonLibrary/Buttons.jsx diff --git a/imports/ui/ButtonLibrary/Buttons.jsx b/imports/ui/ButtonLibrary/Buttons.jsx new file mode 100644 index 00000000..d959adfc --- /dev/null +++ b/imports/ui/ButtonLibrary/Buttons.jsx @@ -0,0 +1,118 @@ + +import React, { Component } from 'react'; +import ItemButton from '../item_Button.jsx' + + +export class BumpButton extends Component { + + render() { + var obj = { + bumped: new Date(), + } + return + + } +} + + + +export class SkipButton extends Component { + render() { + + var obj = { + TranscodeDecisionMaker:"Transcode success", + lastTranscodeDate: new Date(), + } + return + + } +} + + +export class SkipHealthCheckButton extends Component { + render() { + + var obj = { + HealthCheck: "Success", + lastHealthCheckDate: new Date(), + } + return + + } +} + + +export class CancelBumpButton extends Component { + render() { + + var obj = { + bumped: false, + } + return + + } +} + + + + +export class RedoButton extends Component { + + render() { + + var obj = { + [this.props.mode]: "Queued", + processingStatus: false, + createdAt: new Date(), + } + + + return + } +} + +export class ForceProcessingButton extends Component { + + render() { + var obj = { + forceProcessing: true, + } + return + } +} + +export class CancelForceProcessingButton extends Component { + + render() { + var obj = { + forceProcessing: false, + } + return + } +} + + + +export class IgnoreButton extends Component { + + render() { + var obj = { + [this.props.mode]: "Ignored", + processingStatus: false, + createdAt: new Date(), + } + return + } +} + + + + + +export class CreateSampleButton extends Component { + render() { + + return + } +} + diff --git a/imports/ui/item_Button.jsx b/imports/ui/item_Button.jsx index c1e37ffa..91ce125d 100644 --- a/imports/ui/item_Button.jsx +++ b/imports/ui/item_Button.jsx @@ -13,30 +13,33 @@ export default class App extends Component { constructor(props) { super(props); - this.state = { isShowState: true } + this.state = { + lastUpdate: 0, + } } triggerLoadState = () => { + var tempObj = { + lastUpdate: (new Date()) + + } + Meteor.call('modifyFileDB', 'update', this.props.file.file, tempObj, (error, result) => { }) this.setState({ - ...this.state, - isShowState: false, - isLoadState: true + lastUpdate: (new Date()).getTime(), }) - setTimeout(this.reset, 1000); + // setTimeout(this.reset, 1000); } - reset = () => { - this.setState({ - ...this.state, - isShowState: true, - isLoadState: false - }) + // reset = () => { + // this.setState({ + // lastUpdate:0, + // }) - } + // } @@ -48,31 +51,30 @@ export default class App extends Component { // } + var serverTime = this.props.time + var lastUpdate = this.props.file.lastUpdate ? this.props.file.lastUpdate.getTime() : 0 + + if (this.props.type == "updateDBAction") { return (
- {this.state.isShowState && } - - {this.state.isLoadState && } - + Meteor.call('modifyFileDB', 'update', this.props.file.file, this.props.obj, (error, result) => { }) + }}>{this.props.symbol} : }
@@ -86,23 +88,25 @@ export default class App extends Component { return (
- {this.state.isShowState && } + }}>{this.props.symbol} : } - {this.state.isLoadState && } @@ -119,65 +123,67 @@ export default class App extends Component { return (
- {this.state.isShowState && } - {this.state.isLoadState && {this.props.symbol} : } + - sizeUnit={"px"} - size={25} - color={'white'} - loading={true} - />}
- )} - - if (this.props.type == "reScan") { - - return ( - -
- {this.state.isShowState && } - - {this.state.isLoadState && + {true ? : } - -
- - )} - + + +
+ + ) + } + + } } diff --git a/imports/ui/searchResults.jsx b/imports/ui/searchResults.jsx index 69ec5368..f388a6cb 100644 --- a/imports/ui/searchResults.jsx +++ b/imports/ui/searchResults.jsx @@ -14,15 +14,57 @@ import { withTracker } from 'meteor/react-meteor-data'; import JSONPretty from 'react-json-pretty'; import 'react-json-pretty/themes/monikai.css'; +import { + BumpButton, + SkipButton, + SkipHealthCheckButton, + CancelBumpButton, + RedoButton, + ForceProcessingButton, + CancelForceProcessingButton, + IgnoreButton +} from './ButtonLibrary/Buttons.jsx' + class App extends Component{ + constructor(props) { + super(props); + this.state = { + lastQueueUpdateTime:1 + } + } + renderResults(result){ + try { + + const g = GlobalSettingsDB.find({}).fetch()[0] + + if (g.lastQueueUpdateTime != undefined) { + + var a = this.state.lastQueueUpdateTime + var b = g.lastQueueUpdateTime + + if (a != b) { + this.setState({ + lastQueueUpdateTime: b, + }) + + } + + } + } catch (err) { + + } + + + + if ( !result || result.length == 0) { return

No results

@@ -347,7 +389,7 @@ return null ), id: 'Bump', width: 'Bump'.length*10, - accessor: row => !(row.bumped instanceof Date) ? this.renderBumpButton(row.file):this.renderCancelBumpButton(row.file), + accessor: row => !(row.bumped instanceof Date) ? :, getProps: (state, rowInfo, column) => { return { style: { @@ -368,7 +410,7 @@ return null ), id: 'Create sample', width: 'Create sample'.length*10, - accessor: row => this.renderCreateSampleButton(row.file), + accessor: row => this.renderCreateSampleButton(row), getProps: (state, rowInfo, column) => { return { style: { @@ -389,7 +431,7 @@ return null ), id: 'Transcode', width: 'Transcode'.length*10, - accessor: row => row.TranscodeDecisionMaker == "Queued" ? Queued({row.tPosition}){this.renderSkipButton(row.file)} : this.renderRedoButton(row.file, 'TranscodeDecisionMaker'), + accessor: row => row.TranscodeDecisionMaker == "Queued" ? Queued({row.tPosition}) : , getProps: (state, rowInfo, column) => { return { style: { @@ -409,7 +451,7 @@ return null ), id: 'Health check', width: 'Health check'.length*10, - accessor: row => row.HealthCheck == "Queued" ? Queued({row.hPosition}){this.renderSkipHealthCheckButton(row.file)}: this.renderRedoButton(row.file, 'HealthCheck'), + accessor: row => row.HealthCheck == "Queued" ? Queued({row.hPosition}): , getProps: (state, rowInfo, column) => { return { style: { @@ -485,7 +527,7 @@ return null ), id: 'forceProcessing', width: 'forceProcessing'.length*10, - accessor: row => row.forceProcessing === true ? this.renderCancelForceProcessingButton(row.file) : this.renderForceProcessingButton(row.file), + accessor: row => row.forceProcessing === true ? : , getProps: (state, rowInfo, column) => { return { style: { @@ -634,85 +676,100 @@ return null } -renderBumpButton(file) { - var obj = { - bumped: new Date(), - } - return +// renderBumpButton(file) { +// var obj = { +// bumped: new Date(), +// } +// return - } +// } - renderSkipButton(file) { - var obj = { - TranscodeDecisionMaker:"Transcode success", - lastTranscodeDate: new Date(), - } - return - } + // renderSkipButton(file) { + // var obj = { + // TranscodeDecisionMaker:"Transcode success", + // lastTranscodeDate: new Date(), + // } + // return + // } - renderSkipHealthCheckButton(file) { - var obj = { - HealthCheck: "Success", - lastHealthCheckDate: new Date(), - } - return - } + // renderSkipHealthCheckButton(file) { + // var obj = { + // HealthCheck: "Success", + // lastHealthCheckDate: new Date(), + // } + // return + // } - renderCancelBumpButton(file) { - var obj = { - bumped: false, - } - return - } + // renderCancelBumpButton(file) { + // var obj = { + // bumped: false, + // } + // return + // } - renderCreateSampleButton(file){ + // renderRedoButton(file, mode) { - return + + // var obj = { + // [mode]: "Queued", + // processingStatus: false, + // createdAt: new Date(), + // } + + + // return + // } + + // renderForceProcessingButton(file) { + // var obj = { + // forceProcessing: true, + // } + // return + // } + + // renderCancelForceProcessingButton(file) { + // var obj = { + // forceProcessing: false, + // } + // return + // } - } - renderRedoButton(file, mode) { - - var obj = { - [mode]: "Queued", - processingStatus: false, - createdAt: new Date(), - } + // renderIgnoreButton(file, mode) { + // var obj = { + // [mode]: "Ignored", + // processingStatus: false, + // createdAt: new Date(), + // } + // return + + + // } - return - } - renderForceProcessingButton(file) { - var obj = { - forceProcessing: true, - } - return - } - renderCancelForceProcessingButton(file) { - var obj = { - forceProcessing: false, - } - return - } + renderCreateSampleButton(file){ + return + } - renderIgnoreButton(file, mode) { + renderRemoveButton(file) { - var obj = { - [mode]: "Ignored", - processingStatus: false, - createdAt: new Date(), - } - return + return + } + + renderReScanButton(file) { + + return } + renderInfoButton(row) { var result = [] @@ -799,17 +856,7 @@ renderBumpButton(file) { } - renderRemoveButton(file) { - - return - } - - renderReScanButton(file) { - - return - - } handleChange(event){ diff --git a/imports/ui/transcoding/tab_Transcoding.jsx b/imports/ui/transcoding/tab_Transcoding.jsx index 99bcd257..e6843263 100644 --- a/imports/ui/transcoding/tab_Transcoding.jsx +++ b/imports/ui/transcoding/tab_Transcoding.jsx @@ -29,6 +29,17 @@ import { Markup } from 'interweave'; +import { + BumpButton, + SkipButton, + SkipHealthCheckButton, + CancelBumpButton, + RedoButton, + ForceProcessingButton, + CancelForceProcessingButton, + IgnoreButton +} from '../ButtonLibrary/Buttons.jsx' + var ButtonStyle = { @@ -46,7 +57,12 @@ class App extends Component { constructor(props) { super(props); - this.state = { value: true, lowCPU: true, x: 1, } + this.state = { + value: true, + lowCPU: true, + x: 1, + lastQueueUpdateTime: 1 + } @@ -56,54 +72,54 @@ class App extends Component { - alterWorkerLimit(process,workerType){ + alterWorkerLimit(process, workerType) { var globsettings = this.props.globalSettings[0] - globsettings= globsettings + globsettings = globsettings - if(process == "increase"){ + if (process == "increase") { GlobalSettingsDB.update("globalsettings", - { - $inc: { [workerType]: 1 } - } - ); + { + $inc: { [workerType]: 1 } + } + ); - }else if(process == "decrease"){ + } else if (process == "decrease") { - if(globsettings[workerType] > 0){ + if (globsettings[workerType] > 0) { GlobalSettingsDB.update("globalsettings", - { - $inc: { [workerType]: -1 } - } - ); + { + $inc: { [workerType]: -1 } + } + ); } } } - renderSlider(slider,sliderColour,sliderColour2) { + renderSlider(slider, sliderColour, sliderColour2) { - if(slider == 'generalWorkerLimit'){ + if (slider == 'generalWorkerLimit') { var title = 'General' - }else if(slider == 'transcodeWorkerLimit'){ + } else if (slider == 'transcodeWorkerLimit') { var title = 'Transcode' - }else if(slider == 'healthcheckWorkerLimit'){ + } else if (slider == 'healthcheckWorkerLimit') { var title = 'Health check' } - + return this.props.globalSettings.map((item, i) => ( @@ -111,7 +127,7 @@ class App extends Component { {/*

{title}({item[slider]})

*/} - + - + )); @@ -192,28 +208,28 @@ class App extends Component { renderLowCPUButton() { - + return this.props.globalSettings.map((item, i) => ( { + thumbStyle={borderRadiusStyle} + trackStyle={borderRadiusStyle} - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - lowCPUPriority: !item.lowCPUPriority, + value={item.lowCPUPriority} onToggle={() => { + + GlobalSettingsDB.upsert('globalsettings', + { + $set: { + lowCPUPriority: !item.lowCPUPriority, + } } - } - ); - } - } /> + ); + } + } /> )); } - renderSortBox(type){ + renderSortBox(type) { return this.props.globalSettings.map((item, i) => ( @@ -248,7 +264,7 @@ class App extends Component { { - if(type == `alternateLibraries` && event.target.checked){ + if (type == `alternateLibraries` && event.target.checked) { GlobalSettingsDB.upsert( "globalsettings", @@ -258,16 +274,16 @@ class App extends Component { } } ); - + } - - if(type == `prioritiseLibraries` && event.target.checked){ - + + if (type == `prioritiseLibraries` && event.target.checked) { + GlobalSettingsDB.upsert( "globalsettings", { $set: { - alternateLibraries: false, + alternateLibraries: false, } } ); @@ -293,10 +309,15 @@ class App extends Component { componentDidMount() { - this.interval = setInterval(() => this.renderWorkers(), 500); - this.interval2 = setInterval(() =>this.getServerTime(), 1000); + this.interval = setInterval(() => this.renderWorkers(), 500) + this.interval2 = setInterval(() => this.getServerTime(), 1000) + + } + componentWillUnmount() { + clearInterval(this.interval); + clearInterval(this.interval2); } @@ -307,6 +328,8 @@ class App extends Component { } + + renderWorkers = () => { @@ -347,6 +370,31 @@ class App extends Component { + try { + + const g = GlobalSettingsDB.find({}).fetch()[0] + + if (g.lastQueueUpdateTime != undefined) { + + var a = this.state.lastQueueUpdateTime + var b = g.lastQueueUpdateTime + + if (a != b) { + this.setState({ + lastQueueUpdateTime: b, + }) + + } + + } + } catch (err) { + + } + + + + + var tables = this.props.clientDB @@ -384,46 +432,46 @@ class App extends Component { if (mode == "TranscodeDecisionMaker") { - - - return data.map((row, i) => { - if(row.file_size != undefined){ - var file_size = parseFloat((row.file_size/1000).toPrecision(4)) - }else{ - var file_size = "-" - } - // {row.bumped ? row.bumped.toISOString() : "-"} + return data.map((row, i) => { + + if (row.file_size != undefined) { + var file_size = parseFloat((row.file_size / 1000).toPrecision(4)) + } else { + var file_size = "-" + } + + // {row.bumped ? row.bumped.toISOString() : "-"} - - return -

{i + 1}

{row.file}

{row.forceProcessing === true ? this.renderCancelForceProcessingButton(row.file) : this.renderForceProcessingButton(row.file)}

{row.video_codec_name}

{row.video_resolution}

{file_size}

{ !(row.bumped instanceof Date) ? this.renderBumpButton(row.file):this.renderCancelBumpButton(row.file) }

{this.renderSkipButton(row.file)}

+ + return +

{i + 1}

{row.file}

{row.forceProcessing === true ? : }

{row.video_codec_name}

{row.video_resolution}

{file_size}

{!(row.bumped instanceof Date) ? : }

- } - ); + } + ); - }else{ + } else { - return data.map((row, i) => { + return data.map((row, i) => { - return -

{i + 1}

{row.file}

{!(row.bumped instanceof Date) ? this.renderBumpButton(row.file):this.renderCancelBumpButton(row.file) }

{this.renderSkipHealthCheckButton(row.file)}

+ return +

{i + 1}

{row.file}

{!(row.bumped instanceof Date) ? : }

- } - ); + } + ); - } + } } if (type == "success") { @@ -434,30 +482,30 @@ class App extends Component { return data.map((row, i) => { - if(row.lastTranscodeDate != undefined){ + if (row.lastTranscodeDate != undefined) { var lastTranscodeDate = this.toTime(row.lastTranscodeDate) - }else{ + } else { var lastTranscodeDate = "-" } - if(row.oldSize != undefined){ - var oldSize = parseFloat((row.oldSize).toPrecision(4)) - }else{ + if (row.oldSize != undefined) { + var oldSize = parseFloat((row.oldSize).toPrecision(4)) + } else { var oldSize = "-" } - if(row.newSize != undefined){ - var newSize = parseFloat((row.newSize).toPrecision(4)) - }else{ + if (row.newSize != undefined) { + var newSize = parseFloat((row.newSize).toPrecision(4)) + } else { var newSize = "-" } - - return -

{i + 1}

{lastTranscodeDate}

{row.file}

{row.video_codec_name}

{row.video_resolution}

{row.TranscodeDecisionMaker}

{oldSize}

{newSize}

{this.renderRedoButton(row.file, mode)}

{this.renderInfoButton(row.cliLog)}

{this.renderHistoryButton(row)}

+ + return +

{i + 1}

{lastTranscodeDate}

{row.file}

{row.video_codec_name}

{row.video_resolution}

{row.TranscodeDecisionMaker}

{oldSize}

{newSize}

{this.renderInfoButton(row.cliLog)}

{this.renderHistoryButton(row)}

@@ -467,14 +515,14 @@ class App extends Component { return data.map((row, i) => { - if(row.lastHealthCheckDate != undefined){ + if (row.lastHealthCheckDate != undefined) { var lastHealthCheckDate = this.toTime(row.lastHealthCheckDate) - }else{ + } else { var lastHealthCheckDate = "-" } - - return -

{i + 1}

{lastHealthCheckDate}

{row.file}

{this.renderRedoButton(row.file, mode)}

{this.renderInfoButton(row.cliLog)}

+ + return +

{i + 1}

{lastHealthCheckDate}

{row.file}

{this.renderInfoButton(row.cliLog)}

@@ -488,39 +536,39 @@ class App extends Component { if (mode == "TranscodeDecisionMaker") { - return data.map((row, i) => { + return data.map((row, i) => { - if(row.lastTranscodeDate != undefined){ - var lastTranscodeDate = this.toTime(row.lastTranscodeDate) - }else{ - var lastTranscodeDate = "-" - } + if (row.lastTranscodeDate != undefined) { + var lastTranscodeDate = this.toTime(row.lastTranscodeDate) + } else { + var lastTranscodeDate = "-" + } - return -

{i + 1}

{lastTranscodeDate}

{row.file}

{this.renderRedoButton(row.file, mode)}

{this.renderIgnoreButton(row.file, mode)}

{this.renderInfoButton(row.cliLog)}

- + return +

{i + 1}

{lastTranscodeDate}

{row.file}

{this.renderInfoButton(row.cliLog)}

+ - }); + }); - }else{ + } else { return data.map((row, i) => { - - if(row.lastHealthCheckDate != undefined){ - var lastHealthCheckDate = this.toTime(row.lastHealthCheckDate) - }else{ - var lastHealthCheckDate = "-" - } - return -

{i + 1}

{lastHealthCheckDate}

{row.file}

{this.renderRedoButton(row.file, mode)}

{this.renderIgnoreButton(row.file, mode)}

{this.renderInfoButton(row.cliLog)}

+ if (row.lastHealthCheckDate != undefined) { + var lastHealthCheckDate = this.toTime(row.lastHealthCheckDate) + } else { + var lastHealthCheckDate = "-" + } + + return +

{i + 1}

{lastHealthCheckDate}

{row.file}

{this.renderInfoButton(row.cliLog)}

- - - }); + + + }); @@ -545,62 +593,62 @@ class App extends Component { } - renderBumpButton(file) { - var obj = { - bumped: new Date(), - } - return - } - - renderSkipButton(file) { - var obj = { - TranscodeDecisionMaker:"Transcode success", - lastTranscodeDate: new Date(), - } - return - } - - renderSkipHealthCheckButton(file) { - var obj = { - HealthCheck: "Success", - lastHealthCheckDate: new Date(), - } - return - } - - renderCancelBumpButton(file) { - var obj = { - bumped: false, - } - return - } - - renderRedoButton(file, mode) { - - - var obj = { - [mode]: "Queued", - processingStatus: false, - createdAt: new Date(), - } - - - return - } - - renderForceProcessingButton(file) { - var obj = { - forceProcessing: true, - } - return - } - - renderCancelForceProcessingButton(file) { - var obj = { - forceProcessing: false, - } - return - } + // renderBumpButton(file) { + // var obj = { + // bumped: new Date(), + // } + // return + // } + + // renderSkipButton(file) { + // var obj = { + // TranscodeDecisionMaker: "Transcode success", + // lastTranscodeDate: new Date(), + // } + // return + // } + + // renderSkipHealthCheckButton(file) { + // var obj = { + // HealthCheck: "Success", + // lastHealthCheckDate: new Date(), + // } + // return + // } + + // renderCancelBumpButton(file) { + // var obj = { + // bumped: false, + // } + // return + // } + + // renderRedoButton(file, mode) { + + + // var obj = { + // [mode]: "Queued", + // processingStatus: false, + // createdAt: new Date(), + // } + + + // return + // } + + // renderForceProcessingButton(file) { + // var obj = { + // forceProcessing: true, + // } + // return + // } + + // renderCancelForceProcessingButton(file) { + // var obj = { + // forceProcessing: false, + // } + // return + // } renderIgnoreButton(file, mode) { @@ -610,38 +658,38 @@ class App extends Component { processingStatus: false, createdAt: new Date(), } - return + return } renderInfoButton(cliLog) { - - try{ - cliLog = cliLog.split("\n") + try { - cliLog = cliLog.map( row =>

{row}

) + cliLog = cliLog.split("\n") - return i} - modal - closeOnDocumentClick - > -
-
-
-
- {cliLog} - -
-
-
-
-
+ cliLog = cliLog.map(row =>

{row}

) + + return i} + modal + closeOnDocumentClick + > +
+
+
+
+ {cliLog} + +
+
+
+
+
- }catch(err){ + } catch (err) { return null @@ -652,21 +700,21 @@ class App extends Component { renderHistoryButton(row) { - if(row.history == undefined){ - result ="" - - }else{ + if (row.history == undefined) { + result = "" + + } else { var result = row.history result = result.split("\n") - result = result.map((row, i) => ( - - - )); - + result = result.map((row, i) => ( + + )); - } + + + } return
-
-
-
- {result} +
+
+
+ {result} +
-
} - setAllStatus(mode,table,processStatus,text) { + setAllStatus(mode, table, processStatus, text) { if (confirm(`Are you sure you want to ${text} all files?`)) { - Meteor.call('setAllStatus', 'all', mode,table,processStatus, function (error, result) { }) + Meteor.call('setAllStatus', 'all', mode, table, processStatus, function (error, result) { }) } } @@ -738,168 +786,168 @@ class App extends Component {
-
-
- -
i} - modal - closeOnDocumentClick - > -
-
-
+
+
-
- -

Use the sliders to tell Tdarr to start up and maintain the specified number of workers.

-

Workers which are toggled 'Off' will finish their current item before closing down.

-

If you cancel an item, the worker will move onto the next item in the queue.

+
i} + modal + closeOnDocumentClick + > +
+
+
-

-

Workers process newest items first and cycle between your libraries.

+
-

General workers process both transcode and health check items. They prioritise health check

-

-

-

+

Use the sliders to tell Tdarr to start up and maintain the specified number of workers.

+

Workers which are toggled 'Off' will finish their current item before closing down.

+

If you cancel an item, the worker will move onto the next item in the queue.

-

Important: Workers will not process items unless they are within the scheduled times set in the library settings.

-
- -
-
-
+

+

Workers process newest items first and cycle between your libraries.

-
+

General workers process both transcode and health check items. They prioritise health check

+

+

+

-

Workers:

+

Important: Workers will not process items unless they are within the scheduled times set in the library settings.

+
+
+
+
- +
-
+

Workers:

-
-

General

-
-
-

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].generalWorkerLimit ? this.props.globalSettings[0].generalWorkerLimit : 0})

-
+
+
+

General

+
-
-{this.renderSlider('generalWorkerLimit','black','#808080')} -
+
+

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].generalWorkerLimit ? this.props.globalSettings[0].generalWorkerLimit : 0})

+
-
- - -
+
+ {this.renderSlider('generalWorkerLimit', 'black', '#808080')} +
+
+ + +
-
-

Transcode

-
-
-

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].transcodeWorkerLimit ? this.props.globalSettings[0].transcodeWorkerLimit : 0})

-
+
+

Transcode

+
-
-{this.renderSlider('transcodeWorkerLimit','#66ccff','#B3E6FF')} -
+
+

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].transcodeWorkerLimit ? this.props.globalSettings[0].transcodeWorkerLimit : 0})

+
-
- - -
+
+ {this.renderSlider('transcodeWorkerLimit', '#66ccff', '#B3E6FF')} +
+
+ + +
-
-

Health Check

-
-
-

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].healthcheckWorkerLimit ? this.props.globalSettings[0].healthcheckWorkerLimit : 0})

-
-
-{this.renderSlider('healthcheckWorkerLimit','#4CAF50','#A6D7A8')} -
+
+

Health Check

+
-
- - -
+
+

({this.props.globalSettings && this.props.globalSettings[0] && this.props.globalSettings[0].healthcheckWorkerLimit ? this.props.globalSettings[0].healthcheckWorkerLimit : 0})

+
-
+
+ {this.renderSlider('healthcheckWorkerLimit', '#4CAF50', '#A6D7A8')} +
-
+
+ + +
+
-
- + for (var i = 0; i < workers.length; i++) { -{'\u00A0'}{'\u00A0'}{'\u00A0'}{'\u00A0'} + Meteor.call('killWorker', workers[i]._id, function (error, result) { }) + } -
- Low CPU priority:
+ }); - {this.renderLowCPUButton()} + } + } + } >Cancel all workers -
-
-
+ {'\u00A0'}{'\u00A0'}{'\u00A0'}{'\u00A0'} -
-
+
+ Low CPU priority:
+ + {this.renderLowCPUButton()} + + +
+
+
+ +
+

-
-
-
+
+
+
@@ -908,49 +956,49 @@ class App extends Component {

-

-

+

+

-
+
- i} - modal - closeOnDocumentClick - > -
-
-
+ i} + modal + closeOnDocumentClick + > +
+
+
-
- -

All newly scanned files will be placed in the transcode and health check queues.

- -

Files in the queues will be sent to available workers.

+
-

For transcodes, if files already meet the codec (etc) requirements they will be marked as 'Not required' in 'Transcode: Success/Not required' tab.

- - -

If files don't meet the requirements they will be transcoded. If transcoding is successful files will be marked as 'Transcode success' in the 'Transcode: Success/Not required' tab.

-

+

All newly scanned files will be placed in the transcode and health check queues.

- -

If transcoding fails or is cancelled then files will be marked accordingly in the 'Transcode: Error/Cancelled' tab.

+

Files in the queues will be sent to available workers.

+

For transcodes, if files already meet the codec (etc) requirements they will be marked as 'Not required' in 'Transcode: Success/Not required' tab.

-

-

+

If files don't meet the requirements they will be transcoded. If transcoding is successful files will be marked as 'Transcode success' in the 'Transcode: Success/Not required' tab.

+

-

The end goal of Tdarr is to be able to run it on your library and all items come out as 'Transcode:Not required', meaning nothing needed to be transcoded/remuxed etc.

+

If transcoding fails or is cancelled then files will be marked accordingly in the 'Transcode: Error/Cancelled' tab.

-
- -
-
-
- + +

+

+ + +

The end goal of Tdarr is to be able to run it on your library and all items come out as 'Transcode:Not required', meaning nothing needed to be transcoded/remuxed etc.

+ + +
+ +
+
+
+
@@ -978,197 +1026,197 @@ class App extends Component {

-

Library alternation: {this.renderCheckBox('alternateLibraries')}

-

Library prioritisation: {this.renderCheckBox('prioritiseLibraries')}

+

Library alternation: {this.renderCheckBox('alternateLibraries')}

+

Library prioritisation: {this.renderCheckBox('prioritiseLibraries')}

-

Items: { - - GlobalSettingsDB.upsert( - "globalsettings", - { - $set: { - tableSize: event.target.value, - } - } - ); -}}>

+

Items: { + GlobalSettingsDB.upsert( + "globalsettings", + { + $set: { + tableSize: event.target.value, + } + } + ); + }}>

- - - - -

Transcode queue ({this.renderStat('table1Count')})

-

Transcode: Success/Not required ({this.renderStat('table2Count')})

-

Transcode: Error/Cancelled ({this.renderStat('table3Count')})

-

Health check queue ({this.renderStat('table4Count')})

-

Health check: Healthy ({this.renderStat('table5Count')})

-

Health check: Error/Cancelled ({this.renderStat('table6Count')})

+ + +

Transcode queue ({this.renderStat('table1Count')})

+

Transcode: Success/Not required ({this.renderStat('table2Count')})

+

Transcode: Error/Cancelled ({this.renderStat('table3Count')})

-
-
- - - - - - - - - - - - - {this.renderTable('table1', 'queue','TranscodeDecisionMaker')} -

No.

File

Force processingi} - modal - closeOnDocumentClick - > -

-
-
- -
- -

All new plugins created in v1.101 will have a new force processing switch which overrides filters (or you'll need to modify existing plugins).

- -

It will allow for the FIRST plugin's filter in the plugin stack to be overridden. So you need to have your main transcode plugin at the top of your stack.

-

-

So a typical stack might look like:

-

-

(1) Transcode using HandBrake into h264 (Exclude files already in h264)

-

(2) Remove subs

-

(3) Remove closed captions

-

(4) Remux if not in mkv

-

-

Force processing will force the HandBrake transcode plugin on a file (even if it's already in h264) and then the status for force processing is reset to off.

- -
- -
-
-
- -

Codec

Resolution

Size (GB)

Bump

- +

Health check queue ({this.renderStat('table4Count')})

+

Health check: Healthy ({this.renderStat('table5Count')})

+

Health check: Error/Cancelled ({this.renderStat('table6Count')})

+ +
-
-
- - - - - - - - - - - - - +

No.

Time

File

Codec

Resolution

Transcode

Old size (GB)

New size (GB)

Info

History

+ + + + - {this.renderTable('table2', 'success', 'TranscodeDecisionMaker')} +

All new plugins created in v1.101 will have a new force processing switch which overrides filters (or you'll need to modify existing plugins).

-

No.

File

Force processingi} + modal + closeOnDocumentClick + > +

+
+
+
-
-
+

It will allow for the FIRST plugin's filter in the plugin stack to be overridden. So you need to have your main transcode plugin at the top of your stack.

+

+

So a typical stack might look like:

+

+

(1) Transcode using HandBrake into h264 (Exclude files already in h264)

+

(2) Remove subs

+

(3) Remove closed captions

+

(4) Remux if not in mkv

+

+

Force processing will force the HandBrake transcode plugin on a file (even if it's already in h264) and then the status for force processing is reset to off.

-
+
- - - - - - - - + + + +

+ + + + + - + + {this.renderTable('table1', 'queue', 'TranscodeDecisionMaker')} +

No.

Time

File

Ignore

Info

Codec

Resolution

Size (GB)

Bump

- {this.renderTable('table3', 'error', 'TranscodeDecisionMaker')} - +
+
+ + + + + + + + + + + + + - + + {this.renderTable('table2', 'success', 'TranscodeDecisionMaker')} -
+

No.

Time

File

Codec

Resolution

Transcode

Old size (GB)

New size (GB)

Info

History

+
- - - - - - +
-
- {this.renderTable('table4', 'queue','HealthCheck')} +

No.

File

Bump

+ + + + + + + -

No.

Time

File

Ignore

Info

+ -
-
+ {this.renderTable('table3', 'error', 'TranscodeDecisionMaker')} - - - - - - - - +

No.

Time

File

Info

- {this.renderTable('table5', 'success', 'HealthCheck')} +
+
- + + + + + + + + {this.renderTable('table4', 'queue', 'HealthCheck')} - +

No.

File

Bump

-
- - - - - - - - + - +
+ +

No.

Time

File

Ignore

Info

+ + + + + + + - - {this.renderTable('table6', 'error', 'HealthCheck')} + {this.renderTable('table5', 'success', 'HealthCheck')} -

No.

Time

File

Info

-
- -
-
+ + + +
+ +
+ + + + + + + + + + + + + + + + {this.renderTable('table6', 'error', 'HealthCheck')} + +

No.

Time

File

Ignore

Info

+ +
+ + + ); } @@ -1186,7 +1234,7 @@ export default withTracker(() => { globalSettings: GlobalSettingsDB.find({}, {}).fetch(), - settingsDB:GlobalSettingsDB.find({}, {}).fetch(), + settingsDB: GlobalSettingsDB.find({}, {}).fetch(), clientDB: ClientDB.find({}).fetch(), statistics: StatisticsDB.find({}).fetch(), From 97ef617fa33d24a4060c84e2b13f1c15fcd79538 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 11 Feb 2020 23:24:51 +0000 Subject: [PATCH 05/31] Change DB hook name --- server/main.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/server/main.js b/server/main.js index d5e12a6b..1e848009 100644 --- a/server/main.js +++ b/server/main.js @@ -56,7 +56,7 @@ var filesBeingProcessed = [] var backupStatus = false -var hasFilesDBChanged = true +var hasDBChanged = true var workerLaunched = 0 @@ -334,8 +334,7 @@ Meteor.methods({ } - Meteor.call('FilesDBHasChanged', (error, result) => { }) - + Meteor.call('DBHasChanged', (error, result) => { }) }, @@ -881,13 +880,15 @@ function main() { Meteor.methods({ - 'FilesDBHasChanged'() { + 'DBHasChanged'() { + + //console.log('DBHasChanged') setTimeout(Meteor.bindEnvironment(setHasFilesDBChanged), 1000); function setHasFilesDBChanged() { - hasFilesDBChanged = true + hasDBChanged = true } @@ -3931,12 +3932,12 @@ function main() { if (doTablesUpdate == false) { - } else if (hasFilesDBChanged === true) { + } else if (hasDBChanged === true) { //console.log('Updating queues') - hasFilesDBChanged = false + hasDBChanged = false addFilesToDB = false @@ -4718,19 +4719,19 @@ function main() { added: function (document) { if (!initialising) { //console.log('doc added'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } }, changed: function (new_document, old_document) { if (!initialising) { //console.log('doc changed'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } }, removed: function (document) { if (!initialising) { //console.log('doc removed'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } } }); @@ -4739,19 +4740,19 @@ function main() { added: function (document) { if (!initialising) { //console.log('doc added'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } }, changed: function (new_document, old_document) { if (!initialising) { //console.log('doc changed'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } }, removed: function (document) { if (!initialising) { //console.log('doc removed'); - Meteor.call('FilesDBHasChanged', (error, result) => { }) + Meteor.call('DBHasChanged', (error, result) => { }) } } }); From cd3409e4953450b6a7bc77855f6ea9fba6dcf783 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 12 Feb 2020 07:36:21 +0000 Subject: [PATCH 06/31] Load all plugins into state onload rather than re-reading files on search --- imports/ui/plugins/tab_Plugins.jsx | 511 ++++++++++++++++------------- 1 file changed, 287 insertions(+), 224 deletions(-) diff --git a/imports/ui/plugins/tab_Plugins.jsx b/imports/ui/plugins/tab_Plugins.jsx index 5f966aaf..332e554f 100644 --- a/imports/ui/plugins/tab_Plugins.jsx +++ b/imports/ui/plugins/tab_Plugins.jsx @@ -37,14 +37,36 @@ class App extends Component { constructor(props) { super(props); + this.state = { + pluginsStored: [], + }; + } componentDidMount() { - //this.searchPlugins() + this.loadPlugins() + + } + + loadPlugins = () => { + + Meteor.call('searchPlugins', '', 'Local', (error, result) => { + this.setState({ + pluginsStored: result[0] + }); + + }) + + Meteor.call('searchPlugins', '', 'Community', (error, result) => { + + var arr = this.state.pluginsStored + arr = arr.concat(result[0]) + this.setState({ + pluginsStored: arr + }); - this.searchPlugins(event, 'Community') - this.searchPlugins(event, 'Local') + }) } @@ -62,7 +84,7 @@ class App extends Component { Meteor.call('updatePlugins', ReactDOM.findDOMNode(this.refs.searchStringCommunity).value.trim(), (error, result) => { - setTimeout((event) => this.searchPlugins(event, 'Community'), 5000); + //setTimeout((event) => this.searchPlugins(event, 'Community'), 5000); }) } @@ -150,303 +172,344 @@ class App extends Component { } ); + var string = "searchString" + pluginType + var searchTerm = ReactDOM.findDOMNode(this.refs[string]).value.trim() - Meteor.call('searchPlugins', ReactDOM.findDOMNode(this.refs[string]).value.trim(), pluginType, (error, result) => { + var result = this.state.pluginsStored.filter(row => { + var string = JSON.stringify(row).toLocaleLowerCase() - if (result[0].length == 0) { + if (row.source == pluginType && string.includes(searchTerm.toLocaleLowerCase())) { - render(

No results

, document.getElementById('searchResults' + result[1])); - } else { + return true + } + return false - var data = result[0] - var pluginType = result[1] + }) - const columns = [{ - Header: () => ( -
-

id

-
- ), - id: 'id', - width: 80, - accessor: d => - - , - }, { + if (result.length == 0) { - Header: () => ( -
-

Stage

-
- ), - accessor: 'Stage', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + render(

No results

, document.getElementById('searchResults' + pluginType)); + } else { + + + var data = result + var pluginType = pluginType + + const columns = [{ + Header: () => ( +
+

id

+
+ ), + id: 'id', + width: 80, + accessor: d => + + , + + + }, { + + Header: () => ( +
+

Stage

+
+ ), + accessor: 'Stage', + width: 100, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } - }, { + }, { - Header: () => ( -
-

Type

-
- ), - accessor: 'Type', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + Header: () => ( +
+

Type

+
+ ), + accessor: 'Type', + width: 100, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } - }, { + }, { - Header: () => ( -
-

Operation

-
- ), - accessor: 'Operation', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + Header: () => ( +
+

Operation

+
+ ), + accessor: 'Operation', + width: 100, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } - }, { + }, { - Header: () => ( -
-

Name

-
- ), - accessor: 'Name', - width: 200, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + Header: () => ( +
+

Name

+
+ ), + accessor: 'Name', + width: 200, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } - }, + }, - { + { - Header: () => ( -
-

Description

-
- ), - accessor: 'Description', + Header: () => ( +
+

Description

+
+ ), + accessor: 'Description', - id: 'Description', - style: { 'white-space': 'unset' }, + id: 'Description', + style: { 'white-space': 'unset' }, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - background: rowInfo && rowInfo.row.Description.includes("BUG") ? '#c72c53' : rowInfo && rowInfo.row.Description.includes("TESTING") ? '#ffa500' : null, - }, - } + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + background: rowInfo && rowInfo.row.Description.includes("BUG") ? '#c72c53' : rowInfo && rowInfo.row.Description.includes("TESTING") ? '#ffa500' : null, + }, } + } - }, - { - Header: () => ( -
-

Inputs

-
- ), - id: 'Inputs', - width: 80, - accessor: row => { - - if (row.Inputs == undefined) { - return

- } + }, + { + Header: () => ( +
+

Inputs

+
+ ), + id: 'Inputs', + width: 80, + accessor: row => { - var variableArray = row.Inputs + if (row.Inputs == undefined) { + return

+ } + var variableArray = row.Inputs - var desc = variableArray.map(row => { - var tooltip = row.tooltip.split('\\n') + var desc = variableArray.map(row => { + var tooltip = row.tooltip.split('\\n') - for (var i = 0; i < tooltip.length; i++) { - var current = i + for (var i = 0; i < tooltip.length; i++) { - if (tooltip[i].includes('Example:') && i+1 < tooltip.length) { - tooltip[i + 1] =

{tooltip[i + 1]}

- i++ - } + var current = i - tooltip[current] =

{tooltip[current]}

+ if (tooltip[i].includes('Example:') && i + 1 < tooltip.length) { + tooltip[i + 1] =

{tooltip[i + 1]}

+ i++ } - return
i} - modal - closeOnDocumentClick - > -
-
-
+ tooltip[current] =

{tooltip[current]}

+ } + + return
i} + modal + closeOnDocumentClick + > +
+
+
-
-

Usage:

-

-

- {tooltip} +
+

Usage:

+

+

+ {tooltip} -
-

{row.name}

- }) +
+

{row.name}

+ }) - return desc + return desc - }, - style: { 'whiteSpace': 'unset' } }, - { + style: { 'whiteSpace': 'unset' } + }, + { - Header: () => ( -
-

Version

-
- ), - accessor: 'Version', - width: 100, - - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + Header: () => ( +
+

Version

+
+ ), + accessor: 'Version', + width: 100, + + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } - }, { - show: pluginType == "Local" ? true : false, - Header: () => ( -
-

Delete

-
- ), - accessor: '', - id: 'Delete', - width: 70, - accessor: d => , + } + + this.setState({ + pluginsStored: arr + }); - }, { + Meteor.call('deletePlugin', d.id, (error, result) => { + if (result === true) { - show: pluginType == "Community" ? true : false, - Header: () => ( -
-

Stars

-
- ), - accessor: 'Stars', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } + alert('Plugin deleted successfully!') + + } else { + + alert('Error deleting plugin. Please delete manually.') - }, { - show: pluginType == "Community" ? true : false, - Header: () => ( -
-

Link

-
- ), - id: 'Link', - accessor: row =>

{ - e.preventDefault(); - window.open(row.Link, "_blank") - }}>{row.Link}

, - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, } + + this.searchPlugins(event, 'Local') + + }) + }} >X, + + + }, { + + show: pluginType == "Community" ? true : false, + Header: () => ( +
+

Stars

+
+ ), + accessor: 'Stars', + width: 100, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, } + } + }, { + show: pluginType == "Community" ? true : false, + Header: () => ( +
+

Link

+
+ ), + id: 'Link', + accessor: row =>

{ + e.preventDefault(); + window.open(row.Link, "_blank") + }}>{row.Link}

, + width: 100, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } } + } + + + ] + + render(
+ +
, document.getElementById('searchResults' + pluginType)); - ] - render(
- -
, document.getElementById('searchResults' + result[1])); + } + + GlobalSettingsDB.upsert('globalsettings', + { + $set: { + pluginSearchLoading: false, } + } + ); - }) } catch (err) { GlobalSettingsDB.upsert('globalsettings', { From 60383733820fe54c3f7317335b6bec9b525bd1d7 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 12 Feb 2020 11:09:21 +0000 Subject: [PATCH 07/31] Put workers in flexbox --- imports/ui/styles/main.scss | 4 ++-- imports/ui/transcoding/tab_Transcoding_Worker.jsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index f31faf22..e4cf1ddd 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -424,8 +424,8 @@ input[type="text"] margin: auto; display: 'inline-block'; - display: grid; - grid-template-columns: repeat(3, 1fr); + display: flex; + flex-wrap: wrap; } .workerItemsGrid{ diff --git a/imports/ui/transcoding/tab_Transcoding_Worker.jsx b/imports/ui/transcoding/tab_Transcoding_Worker.jsx index 73ee3763..e17c7464 100644 --- a/imports/ui/transcoding/tab_Transcoding_Worker.jsx +++ b/imports/ui/transcoding/tab_Transcoding_Worker.jsx @@ -10,7 +10,7 @@ import { render } from 'react-dom'; import ToggleButton from 'react-toggle-button' -var path = require('path') +const path = require('path') var ButtonStyle = { display: 'inline-block', From 11a9a0cddfcc7b180cb597fedbad8fe1bcda2237 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 12 Feb 2020 11:45:58 +0000 Subject: [PATCH 08/31] Plugin organisation --- imports/ui/plugins/PluginCategory.jsx | 371 +++++++++++++++++++++++ imports/ui/plugins/tab_Plugins.jsx | 413 +++----------------------- imports/ui/styles/main.scss | 42 ++- 3 files changed, 446 insertions(+), 380 deletions(-) create mode 100644 imports/ui/plugins/PluginCategory.jsx diff --git a/imports/ui/plugins/PluginCategory.jsx b/imports/ui/plugins/PluginCategory.jsx new file mode 100644 index 00000000..1e73a50c --- /dev/null +++ b/imports/ui/plugins/PluginCategory.jsx @@ -0,0 +1,371 @@ +import React, { Component } from 'react'; +import { Button } from 'react-bootstrap'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import Modal from "reactjs-popup"; + +// App component - represents the whole app +export default class App extends Component { + + constructor(props) { + super(props); + + this.state = { + selectedNav: 'All', + }; + + } + + componentDidMount() { + + + } + + renderPlugins(pluginType, cattags) { + + //'h265,hevc' + + + var result = this.props.pluginsStoredFiltered + + if (result.length == 0) { + + return

No plugins

+ + + } else { + + result = this.props.pluginsStoredFiltered.filter(row => { + if (row.source == pluginType) { + return true + } + return false + }) + + + + cattags = cattags.split(',') + + result = result.filter(row => { + + // console.log(row) + + var plugTags = row.Tags + + try { + plugTags.split(',').map(row => row.toLowerCase()) + } catch (err) { + plugTags = [''] + } + + for (var i = 0; i < cattags.length; i++) { + if (plugTags.includes(cattags[i].toLowerCase())) + + return true + + } + + return false + + }) + + + + result = result.map(row =>
+ +

{row.Name}

+ +
+

{row.Description}

+ + +
+
+ + + {'\u00A0'} + {row.Inputs ? Configurable} + modal + closeOnDocumentClick + > +
+
+
+
+ + {row.Inputs.map(row => { + + var tooltip = row.tooltip.split('\\n') + + + + for (var i = 0; i < tooltip.length; i++) { + + var current = i + + if (tooltip[i].includes('Example:') && i + 1 < tooltip.length) { + tooltip[i + 1] =

{tooltip[i + 1]}

+ i++ + } + + tooltip[current] =

{tooltip[current]}

+ } + + return
+ +

{row.name}

+ + {tooltip} + +
+
+ + + +
+ + + })} + + + + + +
+
+
+
+
: null} + +
+
+ + + +
) + + return
{result}
+ + + } + } + + + render() { + return ( + + + + +
+ + +
+ +
+ +
+
+
+ +

{ + this.setState({ selectedNav: 'All' }) + }} className={this.state && this.state.selectedNav == "All" ? 'selectedNav' : 'unselectedNav'}>All

+ + +
+
+ +

{ + this.setState({ selectedNav: 'H265/HEVC' }) + }} className={this.state && this.state.selectedNav == "H265/HEVC" ? 'selectedNav' : 'unselectedNav'}>H265/HEVC

+ + +

{ + this.setState({ selectedNav: 'H264' }) + }} className={this.state && this.state.selectedNav == "H264" ? 'selectedNav' : 'unselectedNav'}>H264

+ + + +
+
+ + + +

{ + this.setState({ selectedNav: 'NVENC H265' }) + }} className={this.state && this.state.selectedNav == "NVENC H265" ? 'selectedNav' : 'unselectedNav'}>NVENC H265

+ + + +

{ + this.setState({ selectedNav: 'NVENC H264' }) + }} className={this.state && this.state.selectedNav == "NVENC H264" ? 'selectedNav' : 'unselectedNav'}>NVENC H264

+ + +
+
+ + +

{ + this.setState({ selectedNav: 'Video only' }) + }} className={this.state && this.state.selectedNav == "Video only" ? 'selectedNav' : 'unselectedNav'}>Video only

+ + +

{ + this.setState({ selectedNav: 'Audio only' }) + }} className={this.state && this.state.selectedNav == "Audio only" ? 'selectedNav' : 'unselectedNav'}>Audio only

+ +

{ + this.setState({ selectedNav: 'Subtitle only' }) + }} className={this.state && this.state.selectedNav == "Subtitle only" ? 'selectedNav' : 'unselectedNav'}>Subtitle only

+ + + +
+
+ + + +

{ + this.setState({ selectedNav: 'HandBrake' }) + }} className={this.state && this.state.selectedNav == "HandBrake" ? 'selectedNav' : 'unselectedNav'}>HandBrake

+ + + +

{ + this.setState({ selectedNav: 'FFmpeg' }) + }} className={this.state && this.state.selectedNav == "FFmpeg" ? 'selectedNav' : 'unselectedNav'}>FFmpeg

+ + +
+
+ + +

{ + this.setState({ selectedNav: 'Radarr' }) + }} className={this.state && this.state.selectedNav == "Radarr" ? 'selectedNav' : 'unselectedNav'}>Radarr

+ +

{ + this.setState({ selectedNav: 'Sonarr' }) + }} className={this.state && this.state.selectedNav == "Sonarr" ? 'selectedNav' : 'unselectedNav'}>Sonarr

+ + +
+
+ + +

{ + this.setState({ selectedNav: 'Pre-processing' }) + }} className={this.state && this.state.selectedNav == "Pre-processing" ? 'selectedNav' : 'unselectedNav'}>Pre-processing

+ + + +

{ + this.setState({ selectedNav: 'Post-processing' }) + }} className={this.state && this.state.selectedNav == "Post-processing" ? 'selectedNav' : 'unselectedNav'}>Post-processing

+ + +
+ + + + +
+
+
+
+
+
+ + + +
+ + + + +
+ +
+ {this.renderPlugins(this.props.pluginType, '')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'h265,hevc')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'h264')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'nvenc h265')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'nvenc h264')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'video only')} +
+ +
+ {this.renderPlugins(this.props.pluginType, 'audio only')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'subtitle only')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'handbrake')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'ffmpeg')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'radarr')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'sonarr')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'pre-processing')} +
+ + +
+ {this.renderPlugins(this.props.pluginType, 'post-processing')} +
+ + +
+ + +
+ + +
+ ); + } +} + + + diff --git a/imports/ui/plugins/tab_Plugins.jsx b/imports/ui/plugins/tab_Plugins.jsx index 332e554f..bb11efa8 100644 --- a/imports/ui/plugins/tab_Plugins.jsx +++ b/imports/ui/plugins/tab_Plugins.jsx @@ -2,9 +2,6 @@ import React, { Component } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import ReactDOM from 'react-dom'; import { render } from 'react-dom'; -import ReactTable from "react-table"; - -import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Button } from 'react-bootstrap'; import Modal from "reactjs-popup"; @@ -13,6 +10,8 @@ import { GlobalSettingsDB } from '../../api/tasks.js'; import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import PluginCategory from './PluginCategory.jsx' + @@ -39,6 +38,7 @@ class App extends Component { this.state = { pluginsStored: [], + pluginsStoredFiltered:[], }; } @@ -63,7 +63,8 @@ class App extends Component { var arr = this.state.pluginsStored arr = arr.concat(result[0]) this.setState({ - pluginsStored: arr + pluginsStored: arr, + pluginsStoredFiltered: arr }); }) @@ -108,10 +109,10 @@ class App extends Component { {'\u00A0'} - {'\u00A0'} + }} style={ButtonStyle}>Clear{'\u00A0'} */} {pluginType == "Community" ? : null} @@ -157,6 +158,9 @@ class App extends Component { searchPlugins = (event, pluginType) => { + + console.log('here') + try { if (event) { @@ -176,341 +180,39 @@ class App extends Component { var string = "searchString" + pluginType var searchTerm = ReactDOM.findDOMNode(this.refs[string]).value.trim() - var result = this.state.pluginsStored.filter(row => { - - var string = JSON.stringify(row).toLocaleLowerCase() - - - if (row.source == pluginType && string.includes(searchTerm.toLocaleLowerCase())) { + //row.source == pluginType && + var result = this.state.pluginsStored.filter(row => { + var string = JSON.stringify(row).toLowerCase() + if (string.includes(searchTerm.toLowerCase())) { return true } - return false - }) - if (result.length == 0) { - - render(

No results

, document.getElementById('searchResults' + pluginType)); - } else { - - - var data = result - var pluginType = pluginType - - const columns = [{ - Header: () => ( -
-

id

-
- ), - id: 'id', - width: 80, - accessor: d => - - , - - - }, { - - Header: () => ( -
-

Stage

-
- ), - accessor: 'Stage', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, { - - Header: () => ( -
-

Type

-
- ), - accessor: 'Type', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, { - - Header: () => ( -
-

Operation

-
- ), - accessor: 'Operation', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, { - - Header: () => ( -
-

Name

-
- ), - accessor: 'Name', - width: 200, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, - - { - - Header: () => ( -
-

Description

-
- ), - accessor: 'Description', - - id: 'Description', - style: { 'white-space': 'unset' }, - - - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - background: rowInfo && rowInfo.row.Description.includes("BUG") ? '#c72c53' : rowInfo && rowInfo.row.Description.includes("TESTING") ? '#ffa500' : null, - }, - } - } - - }, - { - Header: () => ( -
-

Inputs

-
- ), - id: 'Inputs', - width: 80, - accessor: row => { - - if (row.Inputs == undefined) { - return

- } - - var variableArray = row.Inputs - - - var desc = variableArray.map(row => { - - var tooltip = row.tooltip.split('\\n') - + this.setState({ + pluginsStoredFiltered:result + }) - for (var i = 0; i < tooltip.length; i++) { - - var current = i - - if (tooltip[i].includes('Example:') && i + 1 < tooltip.length) { - tooltip[i + 1] =

{tooltip[i + 1]}

- i++ - } - - tooltip[current] =

{tooltip[current]}

- } - - return
i} - modal - closeOnDocumentClick - > -
-
-
-
-

Usage:

-

-

- {tooltip} -
-
-
-
-

{row.name}

- }) - - return desc - - }, - style: { 'whiteSpace': 'unset' } - }, + GlobalSettingsDB.upsert('globalsettings', { - - Header: () => ( -
-

Version

-
- ), - accessor: 'Version', - width: 100, - - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, { - show: pluginType == "Local" ? true : false, - Header: () => ( -
-

Delete

-
- ), - accessor: '', - id: 'Delete', - width: 70, - accessor: d => , - - - }, { - - show: pluginType == "Community" ? true : false, - Header: () => ( -
-

Stars

-
- ), - accessor: 'Stars', - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } - } - - }, { - show: pluginType == "Community" ? true : false, - Header: () => ( -
-

Link

-
- ), - id: 'Link', - accessor: row =>

{ - e.preventDefault(); - window.open(row.Link, "_blank") - }}>{row.Link}

, - width: 100, - getProps: (state, rowInfo, column) => { - return { - style: { - color: "#e1e1e1", - fontSize: "14px", - }, - } + $set: { + pluginSearchLoading: false, } - } + ); - ] - - render(
- -
, document.getElementById('searchResults' + pluginType)); - - - - - - - } - - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - pluginSearchLoading: false, - } - } - ); + } catch (err) { + console.log(err) GlobalSettingsDB.upsert('globalsettings', { $set: { @@ -518,7 +220,11 @@ class App extends Component { } } ); + + } + + } @@ -574,13 +280,11 @@ class App extends Component {

+ -
- -
- -
+
+

@@ -608,12 +312,12 @@ class App extends Component { -
-
+
+ -
+
@@ -664,17 +368,6 @@ class App extends Component {


- - - - - - - - - - -


@@ -702,51 +395,15 @@ class App extends Component { - - - - - - {/* -
- -
- - -
- -
*/} - - - - - - -
- - - - - - - - - - - - - - - - -
+ + diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index e4cf1ddd..380ff3b4 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -437,6 +437,7 @@ input[type="text"] display: 'inline-block'; border-radius: 5px; + width:400px; } .borderStyleGeneral{ @@ -948,6 +949,44 @@ table.sliderTable td { } +.box { + display: flex; + flex-wrap: wrap; +} + +.pluginCard{ + + border: 1px solid white; + border-radius: 5px; + margin:1em; + width:300px; + height:400px; + word-wrap: break-word; + padding:0.5em; + position: relative; + box-shadow: 3px 3px grey; + + +} + +.pluginCardBottom{ + position: absolute; + bottom: 1px; + left: 2px; +} + +.pluginModal{ + + border-bottom: 1px solid black; + +} + +.pluginInput{ + color:green; +} + + + table.sliderTable { border-radius: 5px; width: 100%; @@ -1086,8 +1125,7 @@ table.pluginStackTable td { .pluginTabGrid-itemRight { width:100%; - padding: 0 0 0 2em - + padding: 0 0 0 2em; } From 4e96df53d3414ef4727f6cbebb86d9ae1c58171f Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 13 Feb 2020 01:31:41 +0000 Subject: [PATCH 09/31] Plugin cards --- imports/ui/plugins/PluginCategory.jsx | 180 ++++++++++++++++---------- imports/ui/plugins/tab_Plugins.jsx | 8 +- imports/ui/styles/main.scss | 7 + 3 files changed, 123 insertions(+), 72 deletions(-) diff --git a/imports/ui/plugins/PluginCategory.jsx b/imports/ui/plugins/PluginCategory.jsx index 1e73a50c..bb42007f 100644 --- a/imports/ui/plugins/PluginCategory.jsx +++ b/imports/ui/plugins/PluginCategory.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import { Button } from 'react-bootstrap'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import Modal from "reactjs-popup"; +import ClipLoader from 'react-spinners/ClipLoader'; // App component - represents the whole app export default class App extends Component { @@ -11,16 +12,24 @@ export default class App extends Component { this.state = { selectedNav: 'All', + showPlugin:false, }; } + + componentDidMount() { + setTimeout(this.showPluginCard, 1000); + + } + showPluginCard = () => { + this.setState({showPlugin:true,}) } - renderPlugins(pluginType, cattags) { + renderPlugins(returnCount, pluginType, cattags) { //'h265,hevc' @@ -29,7 +38,13 @@ export default class App extends Component { if (result.length == 0) { - return

No plugins

+ if (returnCount) { + return 0 + } else { + return

No plugins

+ } + + } else { @@ -47,7 +62,7 @@ export default class App extends Component { result = result.filter(row => { - // console.log(row) + // console.log(row) var plugTags = row.Tags @@ -68,10 +83,14 @@ export default class App extends Component { }) + if (returnCount) { + return result.length + } - result = result.map(row =>
- + + result = result.map(row =>
+

{row.Name}


@@ -80,24 +99,24 @@ export default class App extends Component {
- - - {'\u00A0'} - {row.Inputs ? Configurable} - modal - closeOnDocumentClick - > -
-
-
-
+ + + {'\u00A0'} + {row.Inputs ? Configurable} + modal + closeOnDocumentClick + > +
+
+
+
- {row.Inputs.map(row => { + {row.Inputs.map(input => { + + var tooltip = input.tooltip.split('\\n') - var tooltip = row.tooltip.split('\\n') - for (var i = 0; i < tooltip.length; i++) { @@ -113,38 +132,58 @@ export default class App extends Component { return
-

{row.name}

+

{input.name}

{tooltip} -
-
- +
+
+
})} - - -
-
+ +
-
: null} - +
+
+ : null} + +

Tags:{row.Tags}

+ +
+
+
+ +
+
+
+ +
+
+ +
+ -
) - return
{result}
+ return
{result}
} @@ -170,105 +209,110 @@ export default class App extends Component {

{ this.setState({ selectedNav: 'All' }) - }} className={this.state && this.state.selectedNav == "All" ? 'selectedNav' : 'unselectedNav'}>All

+ }} className={this.state && this.state.selectedNav == "All" ? 'selectedNav' : 'unselectedNav'}>All ({this.renderPlugins(true, this.props.pluginType, '')})


-
+

{ this.setState({ selectedNav: 'H265/HEVC' }) - }} className={this.state && this.state.selectedNav == "H265/HEVC" ? 'selectedNav' : 'unselectedNav'}>H265/HEVC

+ }} className={this.state && this.state.selectedNav == "H265/HEVC" ? 'selectedNav' : 'unselectedNav'}>H265/HEVC ({this.renderPlugins(true, this.props.pluginType, 'h265,hevc')})

{ this.setState({ selectedNav: 'H264' }) - }} className={this.state && this.state.selectedNav == "H264" ? 'selectedNav' : 'unselectedNav'}>H264

+ }} className={this.state && this.state.selectedNav == "H264" ? 'selectedNav' : 'unselectedNav'}>H264 ({this.renderPlugins(true, this.props.pluginType, 'h264')})


-
+

{ this.setState({ selectedNav: 'NVENC H265' }) - }} className={this.state && this.state.selectedNav == "NVENC H265" ? 'selectedNav' : 'unselectedNav'}>NVENC H265

+ }} className={this.state && this.state.selectedNav == "NVENC H265" ? 'selectedNav' : 'unselectedNav'}>NVENC H265 ({this.renderPlugins(true, this.props.pluginType, 'nvenc h265')})

{ this.setState({ selectedNav: 'NVENC H264' }) - }} className={this.state && this.state.selectedNav == "NVENC H264" ? 'selectedNav' : 'unselectedNav'}>NVENC H264

+ }} className={this.state && this.state.selectedNav == "NVENC H264" ? 'selectedNav' : 'unselectedNav'}>NVENC H264 ({this.renderPlugins(true, this.props.pluginType, 'nvenc h264')})


-
+

{ this.setState({ selectedNav: 'Video only' }) - }} className={this.state && this.state.selectedNav == "Video only" ? 'selectedNav' : 'unselectedNav'}>Video only

+ }} className={this.state && this.state.selectedNav == "Video only" ? 'selectedNav' : 'unselectedNav'}>Video only ({this.renderPlugins(true, this.props.pluginType, 'video only')})

{ this.setState({ selectedNav: 'Audio only' }) - }} className={this.state && this.state.selectedNav == "Audio only" ? 'selectedNav' : 'unselectedNav'}>Audio only

+ }} className={this.state && this.state.selectedNav == "Audio only" ? 'selectedNav' : 'unselectedNav'}>Audio only ({this.renderPlugins(true, this.props.pluginType, 'audio only')})

{ this.setState({ selectedNav: 'Subtitle only' }) - }} className={this.state && this.state.selectedNav == "Subtitle only" ? 'selectedNav' : 'unselectedNav'}>Subtitle only

+ }} className={this.state && this.state.selectedNav == "Subtitle only" ? 'selectedNav' : 'unselectedNav'}>Subtitle only ({this.renderPlugins(true, this.props.pluginType, 'subtitle only')})


-
+

{ this.setState({ selectedNav: 'HandBrake' }) - }} className={this.state && this.state.selectedNav == "HandBrake" ? 'selectedNav' : 'unselectedNav'}>HandBrake

+ }} className={this.state && this.state.selectedNav == "HandBrake" ? 'selectedNav' : 'unselectedNav'}>HandBrake ({this.renderPlugins(true, this.props.pluginType, 'handbrake')})

{ this.setState({ selectedNav: 'FFmpeg' }) - }} className={this.state && this.state.selectedNav == "FFmpeg" ? 'selectedNav' : 'unselectedNav'}>FFmpeg

+ }} className={this.state && this.state.selectedNav == "FFmpeg" ? 'selectedNav' : 'unselectedNav'}>FFmpeg ({this.renderPlugins(true, this.props.pluginType, 'ffmpeg')})


-
+

{ this.setState({ selectedNav: 'Radarr' }) - }} className={this.state && this.state.selectedNav == "Radarr" ? 'selectedNav' : 'unselectedNav'}>Radarr

+ }} className={this.state && this.state.selectedNav == "Radarr" ? 'selectedNav' : 'unselectedNav'}>Radarr ({this.renderPlugins(true, this.props.pluginType, 'radarr')})

{ this.setState({ selectedNav: 'Sonarr' }) - }} className={this.state && this.state.selectedNav == "Sonarr" ? 'selectedNav' : 'unselectedNav'}>Sonarr

+ }} className={this.state && this.state.selectedNav == "Sonarr" ? 'selectedNav' : 'unselectedNav'}>Sonarr ({this.renderPlugins(true, this.props.pluginType, 'sonarr')})


-
+

{ this.setState({ selectedNav: 'Pre-processing' }) - }} className={this.state && this.state.selectedNav == "Pre-processing" ? 'selectedNav' : 'unselectedNav'}>Pre-processing

+ }} className={this.state && this.state.selectedNav == "Pre-processing" ? 'selectedNav' : 'unselectedNav'}>Pre-processing ({this.renderPlugins(true, this.props.pluginType, 'pre-processing')})

{ this.setState({ selectedNav: 'Post-processing' }) - }} className={this.state && this.state.selectedNav == "Post-processing" ? 'selectedNav' : 'unselectedNav'}>Post-processing

+ }} className={this.state && this.state.selectedNav == "Post-processing" ? 'selectedNav' : 'unselectedNav'}>Post-processing ({this.renderPlugins(true, this.props.pluginType, 'post-processing')})


+

{ + this.setState({ selectedNav: 'Configurable' }) + }} className={this.state && this.state.selectedNav == "Configurable" ? 'selectedNav' : 'unselectedNav'}>Configurable ({this.renderPlugins(true, this.props.pluginType, 'configurable')})

+ +
@@ -288,71 +332,75 @@ export default class App extends Component {
- {this.renderPlugins(this.props.pluginType, '')} + {this.renderPlugins(false, this.props.pluginType, '')}
- {this.renderPlugins(this.props.pluginType, 'h265,hevc')} + {this.renderPlugins(false, this.props.pluginType, 'h265,hevc')}
- {this.renderPlugins(this.props.pluginType, 'h264')} + {this.renderPlugins(false, this.props.pluginType, 'h264')}
- {this.renderPlugins(this.props.pluginType, 'nvenc h265')} + {this.renderPlugins(false, this.props.pluginType, 'nvenc h265')}
- {this.renderPlugins(this.props.pluginType, 'nvenc h264')} + {this.renderPlugins(false, this.props.pluginType, 'nvenc h264')}
- {this.renderPlugins(this.props.pluginType, 'video only')} + {this.renderPlugins(false, this.props.pluginType, 'video only')}
- {this.renderPlugins(this.props.pluginType, 'audio only')} + {this.renderPlugins(false, this.props.pluginType, 'audio only')}
- {this.renderPlugins(this.props.pluginType, 'subtitle only')} + {this.renderPlugins(false, this.props.pluginType, 'subtitle only')}
- {this.renderPlugins(this.props.pluginType, 'handbrake')} + {this.renderPlugins(false, this.props.pluginType, 'handbrake')}
- {this.renderPlugins(this.props.pluginType, 'ffmpeg')} + {this.renderPlugins(false, this.props.pluginType, 'ffmpeg')}
- {this.renderPlugins(this.props.pluginType, 'radarr')} + {this.renderPlugins(false, this.props.pluginType, 'radarr')}
- {this.renderPlugins(this.props.pluginType, 'sonarr')} + {this.renderPlugins(false, this.props.pluginType, 'sonarr')}
- {this.renderPlugins(this.props.pluginType, 'pre-processing')} + {this.renderPlugins(false, this.props.pluginType, 'pre-processing')}
- {this.renderPlugins(this.props.pluginType, 'post-processing')} + {this.renderPlugins(false, this.props.pluginType, 'post-processing')} +
+ +
+ {this.renderPlugins(false, this.props.pluginType, 'configurable')}
diff --git a/imports/ui/plugins/tab_Plugins.jsx b/imports/ui/plugins/tab_Plugins.jsx index bb11efa8..070d5006 100644 --- a/imports/ui/plugins/tab_Plugins.jsx +++ b/imports/ui/plugins/tab_Plugins.jsx @@ -109,10 +109,7 @@ class App extends Component { {'\u00A0'} - {/* {'\u00A0'} */} {pluginType == "Community" ? : null} @@ -180,8 +177,7 @@ class App extends Component { var string = "searchString" + pluginType var searchTerm = ReactDOM.findDOMNode(this.refs[string]).value.trim() - //row.source == pluginType && - + var result = this.state.pluginsStored.filter(row => { var string = JSON.stringify(row).toLowerCase() if (string.includes(searchTerm.toLowerCase())) { @@ -311,7 +307,7 @@ class App extends Component {

- +
diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index 380ff3b4..77452dde 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -965,10 +965,17 @@ table.sliderTable td { padding:0.5em; position: relative; box-shadow: 3px 3px grey; + background-color: #222b44; } +.pluginCardLoading{ + + width:300px; + height:400px; +} + .pluginCardBottom{ position: absolute; bottom: 1px; From b19f77ab5011667f1e42246e193d87bc101de3ac Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Sat, 15 Feb 2020 01:19:43 +0000 Subject: [PATCH 10/31] Tidy --- .gitignore | 3 +- .meteor/.gitignore | 1 + imports/api/pluginCreatorMethods.js | 4 +- imports/ui/ErrorBoundary.jsx | 1 + imports/ui/libraries/tab_Libraries_Folder.jsx | 6 +- imports/ui/styles/main.scss | 23 ++++-- imports/ui/tab_Search.jsx | 80 +++++++++---------- imports/ui/tab_Statistics.jsx | 2 - private/fileScanner/ccextractor.js | 4 +- private/fileScanner/fileScanner.js | 29 +++---- private/fileScanner/runExifTool.js | 6 +- 11 files changed, 83 insertions(+), 76 deletions(-) diff --git a/.gitignore b/.gitignore index d55def8e..0eb4fb67 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules .meteor/local -.idea \ No newline at end of file +.idea +version.desktop diff --git a/.meteor/.gitignore b/.meteor/.gitignore index 40830374..5f1ac4cf 100644 --- a/.meteor/.gitignore +++ b/.meteor/.gitignore @@ -1 +1,2 @@ local +desktop-build \ No newline at end of file diff --git a/imports/api/pluginCreatorMethods.js b/imports/api/pluginCreatorMethods.js index e49b3f5a..6dff24f9 100644 --- a/imports/api/pluginCreatorMethods.js +++ b/imports/api/pluginCreatorMethods.js @@ -6,8 +6,8 @@ import { Meteor } from 'meteor/meteor'; const shortid = require('shortid'); //Globals -var fs = require('fs'); -var path = require('path'); +const fs = require('fs'); +const path = require('path'); diff --git a/imports/ui/ErrorBoundary.jsx b/imports/ui/ErrorBoundary.jsx index fe6b801f..1e2df398 100644 --- a/imports/ui/ErrorBoundary.jsx +++ b/imports/ui/ErrorBoundary.jsx @@ -12,6 +12,7 @@ export class ErrorBoundary extends React.Component { componentDidCatch(error, errorInfo) { console.error(error); + console.error(error.stack); console.log(errorInfo); } diff --git a/imports/ui/libraries/tab_Libraries_Folder.jsx b/imports/ui/libraries/tab_Libraries_Folder.jsx index 7926b7f2..a66e9b18 100644 --- a/imports/ui/libraries/tab_Libraries_Folder.jsx +++ b/imports/ui/libraries/tab_Libraries_Folder.jsx @@ -80,7 +80,6 @@ class Folder extends Component { Meteor.call('searchPlugins', '', 'Community', (error, result) => { var arr = this.state.pluginsStored - arr = arr.concat(result[0]) this.setState({ pluginsStored: arr @@ -89,6 +88,11 @@ class Folder extends Component { }) }; + componentWillUnmount() { + clearInterval(this.interval2); +} + + getServerTime = () => { Meteor.call('getTimeNow', (error, result) => { diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index 77452dde..0e4cdd29 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -198,12 +198,6 @@ input[type="text"] size:14px; } - .resultColumnOptions { - - width: 100px; - display: inline-block; - - } .filterByDate { @@ -1046,11 +1040,26 @@ table.pluginStackTable td { } .optionsDropdown{ - background-color: #383838; } +.optionsDropdownSR{ + + background-color: black; + +} + + +.resultColumnOptions { + + width: 100px; + display: inline-block; + + } + + + .dropdownScan{ color:green; } diff --git a/imports/ui/tab_Search.jsx b/imports/ui/tab_Search.jsx index a7f31263..035de012 100644 --- a/imports/ui/tab_Search.jsx +++ b/imports/ui/tab_Search.jsx @@ -53,46 +53,46 @@ class App extends Component { return
- {'\u00A0'} + {'\u00A0'} {'\u00A0'} - i} - modal - closeOnDocumentClick - > - -
-
-
- + }} style={ButtonStyle}>Clear{'\u00A0'} + i} + modal + closeOnDocumentClick + > -
-

Search for files based on hundreds of properties

- -

Codec suggestions: h264,hevc,mpeg4,mpeg2video,vp9,vp8,theora,aac,ac3,dts

-

Other suggestions: subtitle,mp4,mkv,shrek,stereo,1080p

+
+
+
-

Search for files with multiple properties by separating search terms with a comma. E.g.:

-

shrek,aac,h264,subtitle

+
+

Search for files based on hundreds of properties

+

Codec suggestions: h264,hevc,mpeg4,mpeg2video,vp9,vp8,theora,aac,ac3,dts

+

Other suggestions: subtitle,mp4,mkv,shrek,stereo,1080p

-

+

Search for files with multiple properties by separating search terms with a comma. E.g.:

-

Create a 30 second sample using the '✄' button. The sample will be placed in the 'Samples' folder in the Tdarr documents/data folder with suffix '- TdarrSample'. Use the sample to test plugins/transcode settings and to help when reporting bugs.

+

shrek,aac,h264,subtitle

-

-

To return a list of all files, leave the search bar empty.

+

+ +

Create a 30 second sample using the '✄' button. The sample will be placed in the 'Samples' folder in the Tdarr documents/data folder with suffix '- TdarrSample'. Use the sample to test plugins/transcode settings and to help when reporting bugs.

+ +

+

To return a list of all files, leave the search bar empty.

+ +
+
+
-
-
-
- +
@@ -120,10 +120,10 @@ class App extends Component { Meteor.call('searchDB', ReactDOM.findDOMNode(this.refs.searchString).value.trim(), (error, result) => { - -render(
, document.getElementById('searchResults')); + + render(
, document.getElementById('searchResults')); }) @@ -145,28 +145,28 @@ render(
-
-

Search

-
+
+

Search

+

- +

-
+
- +
- -

- {this.renderSearchButtons()} +

+ + {this.renderSearchButtons()}
@@ -174,9 +174,9 @@ render(
- - + +
diff --git a/imports/ui/tab_Statistics.jsx b/imports/ui/tab_Statistics.jsx index c112711a..2e738856 100644 --- a/imports/ui/tab_Statistics.jsx +++ b/imports/ui/tab_Statistics.jsx @@ -4,8 +4,6 @@ import { FileDB,StatisticsDB,GlobalSettingsDB } from '../api/tasks.js'; import ReactDOM from 'react-dom'; import ClipLoader from 'react-spinners/ClipLoader'; import { Button } from 'react-bootstrap'; -import Modal from "reactjs-popup"; -import ItemButton from './item_Button.jsx' import { render } from 'react-dom'; import SearchResults from './searchResults.jsx' diff --git a/private/fileScanner/ccextractor.js b/private/fileScanner/ccextractor.js index 76425d3b..85a8eb3f 100644 --- a/private/fileScanner/ccextractor.js +++ b/private/fileScanner/ccextractor.js @@ -4,8 +4,8 @@ process.on('uncaughtException', function (err) { -var path = require("path"); -var fs = require('fs'); +const path = require("path"); +const fs = require('fs'); if (fs.existsSync(path.join(process.cwd(),"/npm"))) { var rootModules = path.join(process.cwd(),'/npm/node_modules/') diff --git a/private/fileScanner/fileScanner.js b/private/fileScanner/fileScanner.js index 6813ff58..cd1f80a2 100644 --- a/private/fileScanner/fileScanner.js +++ b/private/fileScanner/fileScanner.js @@ -59,9 +59,8 @@ foldersToIgnore = foldersToIgnore.split(",") updateConsole(scannerID, "Online.") - -var path = require("path"); -var fs = require('fs'); +const path = require("path"); +const fs = require('fs'); if (fs.existsSync(path.join(process.cwd(), "/npm"))) { var rootModules = path.join(process.cwd(), '/npm/node_modules/') @@ -309,7 +308,6 @@ function isInIgnoredFolder(filePath) { function checkContainer(newFile) { try { - var path = require('path'); var fileType = ((path.extname(newFile)).split(".")).join("") for (var j = 0; j < allowedContainers.length; j++) { @@ -362,9 +360,6 @@ function ffprobeLaunch(filesToScan) { updateConsole(scannerID, `ffprobeLaunch received these files:${filesToScan} `) - - var path = require("path"); - var ffprobeStaticPath = require(rootModules + 'ffprobe-static').path const exiftool = require(rootModules + "exiftool-vendored").exiftool @@ -411,17 +406,19 @@ function ffprobeLaunch(filesToScan) { extractDataError(filepath, fileInfo.ffProbeData.data) } - i++; - if (i < filesToScan.length) { - loopArray(filesToScan, i); - } else { - exiftool.end() - } - } catch (err) { console.log(err) } + i++; + if (i < filesToScan.length) { + loopArray(filesToScan, i); + } else { + exiftool.end() + } + + + } runExtractions(filepath) @@ -463,7 +460,6 @@ function ffprobeLaunch(filesToScan) { var thisFileObject = {} - var path = require('path'); var container = ((path.extname(filepath)).split(".")).join("") thisFileObject.container = container.toLowerCase(); @@ -514,9 +510,6 @@ function ffprobeLaunch(filesToScan) { updateConsole(scannerID, `Beginning extractData on:${filepath}`) - - - var path = require('path'); var container = ((path.extname(filepath)).split(".")).join("") thisFileObject.container = container.toLowerCase(); diff --git a/private/fileScanner/runExifTool.js b/private/fileScanner/runExifTool.js index 37a6dea9..1a350f42 100644 --- a/private/fileScanner/runExifTool.js +++ b/private/fileScanner/runExifTool.js @@ -7,7 +7,7 @@ if (fs.existsSync(path.join(process.cwd(), "/npm"))) { var rootModules = '' } -module.exports = function runExifTool(filepath,exiftool) { +module.exports = function runExifTool(filepath, exiftool) { //const exiftool = require(rootModules + "exiftool-vendored").exiftool @@ -16,7 +16,7 @@ module.exports = function runExifTool(filepath,exiftool) { exiftool .read(filepath) .then((tags /*: Tags */) => { - + resolve( { result: 'success', @@ -36,7 +36,7 @@ module.exports = function runExifTool(filepath,exiftool) { } catch (err) { - + resolve( { result: 'error', From a8a3185c842a300ebb62a8d81cd941b3300ae1d6 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Sun, 16 Feb 2020 11:59:45 +0000 Subject: [PATCH 11/31] Button UI changes --- imports/ui/item_Button.jsx | 40 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/imports/ui/item_Button.jsx b/imports/ui/item_Button.jsx index 91ce125d..255bc895 100644 --- a/imports/ui/item_Button.jsx +++ b/imports/ui/item_Button.jsx @@ -4,7 +4,6 @@ import ReactDOM from 'react-dom'; import { Button } from 'react-bootstrap'; import ClipLoader from 'react-spinners/ClipLoader'; - import { FileDB } from '../api/tasks.js'; @@ -15,10 +14,44 @@ export default class App extends Component { this.state = { lastUpdate: 0, + showButton:true, } } + componentDidMount() { + + // this.getDBStatus() + + } + + getDBStatus = () => { + + Meteor.subscribe('FileDB', () => { + + + var file = FileDB.find({ _id: this.props.file._id }).fetch()[0] + + if (this.props.time >= file.lastUpdate) { + this.setState({ + showButton: true, + }) + + } else { + + this.setState({ + showButton: false, + }) + + } + + + + }); + + } + + triggerLoadState = () => { var tempObj = { @@ -41,6 +74,7 @@ export default class App extends Component { // } + @@ -53,6 +87,8 @@ export default class App extends Component { var serverTime = this.props.time var lastUpdate = this.props.file.lastUpdate ? this.props.file.lastUpdate.getTime() : 0 + //this.props.time >= this.state.lastUpdate + //this.state.showButton if (this.props.type == "updateDBAction") { @@ -60,7 +96,7 @@ export default class App extends Component { return (
- {serverTime >= this.state.lastUpdate ?
-
- {this.renderPlugins(false, this.props.pluginType, 'radarr')} +
+ {this.renderPlugins(false, this.props.pluginType, '3rd party')}
-
- {this.renderPlugins(false, this.props.pluginType, 'sonarr')} -
+
From 599be2ffd71ef0dfd8caf36024f0c2e04bbfcb69 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 18 Feb 2020 02:26:43 +0000 Subject: [PATCH 17/31] Basework for button dropdown --- imports/ui/searchResults.jsx | 1217 ++++++++++++++++------------------ 1 file changed, 571 insertions(+), 646 deletions(-) diff --git a/imports/ui/searchResults.jsx b/imports/ui/searchResults.jsx index f388a6cb..c8fdd204 100644 --- a/imports/ui/searchResults.jsx +++ b/imports/ui/searchResults.jsx @@ -29,591 +29,597 @@ import { -class App extends Component{ +class App extends Component { constructor(props) { super(props); this.state = { - lastQueueUpdateTime:1 - } + lastQueueUpdateTime: 1 + } } -renderResults(result){ + renderResults(result) { - try { + try { - const g = GlobalSettingsDB.find({}).fetch()[0] + const g = GlobalSettingsDB.find({}).fetch()[0] - if (g.lastQueueUpdateTime != undefined) { + if (g.lastQueueUpdateTime != undefined) { - var a = this.state.lastQueueUpdateTime - var b = g.lastQueueUpdateTime + var a = this.state.lastQueueUpdateTime + var b = g.lastQueueUpdateTime - if (a != b) { - this.setState({ - lastQueueUpdateTime: b, - }) + if (a != b) { + this.setState({ + lastQueueUpdateTime: b, + }) + + } } + } catch (err) { } - } catch (err) { - - } -if ( !result || result.length == 0) { + if (!result || result.length == 0) { - return

No results

+ return

No results

- }else{ + } else { - var data = result + var data = result - var columns = this.props.globalSettings[0].searchResultColumns + var columns = this.props.globalSettings[0].searchResultColumns - function getStreams(file){ + function getStreams(file) { - var streams = file.ffProbeData.streams - streams = streams.map((row) => { - return + var streams = file.ffProbeData.streams + streams = streams.map((row) => { + return {row.index} {row.codec_type} {row.codec_name} - {row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4))+" Mbs" : "-"} + {row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4)) + " Mbs" : "-"} - }) + }) - return - + return
+ - {streams} - -
+ {streams} + + - - } - var getColumnWidth = (rows, accessor, headerText) => { - var maxWidth = 400 - var magicSpacing = 10 - var cellLength = Math.max( - ...rows.map(row => (`${row[accessor]}` || '').length), - headerText.length, - ) - return Math.min(maxWidth, cellLength * magicSpacing) - } + } -function fancyTimeFormat(time) { + var getColumnWidth = (rows, accessor, headerText) => { + var maxWidth = 400 + var magicSpacing = 10 + var cellLength = Math.max( + ...rows.map(row => (`${row[accessor]}` || '').length), + headerText.length, + ) + return Math.min(maxWidth, cellLength * magicSpacing) + } - var hrs = ~~(time / 3600); - var mins = ~~((time % 3600) / 60); - var secs = ~~time % 60; + function fancyTimeFormat(time) { - var ret = ""; - ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); - ret += "" + mins + ":" + (secs < 10 ? "0" : ""); - ret += "" + secs; - return ret; - } + var hrs = ~~(time / 3600); + var mins = ~~((time % 3600) / 60); + var secs = ~~time % 60; + var ret = ""; + ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); + ret += "" + mins + ":" + (secs < 10 ? "0" : ""); + ret += "" + secs; + return ret; + } - - var columns = [ - - { - show: columns.index != undefined ? columns.index : true, - Header: "", - id: "row", - maxWidth: 50, - filterable: false, - Cell: (row) => { - return

{row.index+1}

; - } - }, + var columns = [ - { - show: columns.fileName != undefined ? columns.fileName : true, - Header: () => ( -
-

File

-
- ), - accessor: 'file', - width: getColumnWidth(data, 'file', 'File'), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, + { + show: columns.index != undefined ? columns.index : true, + Header: "", + id: "row", + maxWidth: 50, + filterable: false, + Cell: (row) => { + return

{row.index + 1}

; + } + }, - { - show: columns.streams != undefined ? columns.streams : true, - Header: () => ( -
-

Streams

-
- ), - id: 'streams', - accessor: row => { + // { + // show: columns.optionsDropdownMenu != undefined ? columns.optionsDropdownMenu : true, + // Header: () => ( + //
+ //

Options

+ //
+ // ), + // id: 'Options', + // width: 'OptionsOptions'.length * 10, + // accessor: row => { - if(row.ffProbeData && row.ffProbeData.streams){ - var streams = row.ffProbeData.streams - streams = streams.map((row) => { - return -

{row.codec_name}

+ // return + // + // Options + // -

{row.codec_type}

+ // + //
+ //

Bump:{!(row.bumped instanceof Date) ? : }

+ //

Create sample:{this.renderCreateSampleButton(row.file)}

-

{row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4))+" Mbs" : "-"}

+ //

{row.TranscodeDecisionMaker == "Queued" ? Queued({row.tPosition}) : }

+ //

{row.HealthCheck == "Queued" ? Queued({row.hPosition}) : }

+ //

{this.renderInfoButton(row)}

+ //

{this.renderHistoryButton(row)}

+ //

{this.renderRemoveButton(row)}

+ //

{row.forceProcessing === true ? : }

+ //

{this.renderReScanButton(row)}

+ //
+ //
+ //
-

{ row.tags != undefined && row.tags.language != undefined ? row.tags.language : "-"}

-

{ row.channels != undefined ? row.channels : "-"}

-

{ row.tags != undefined && row.tags.title != undefined ? row.tags.title : "-"}

- - - - }) - - return - + // }, + // getProps: (state, rowInfo, column) => { + // return { + // style: { + // color: "#e1e1e1", + // fontSize: "14px", + // overflow: "visible", + // }, + // } + // } - {streams} - -
+ // }, -}else{ -return null -} - - }, - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - - },{ - show: columns.closedCaptions != undefined ? columns.closedCaptions : true, - Header: () => ( -
-

Closed Captions

-
- ), - id: 'CC', - accessor: row => row.hasClosedCaptions != undefined ? row.hasClosedCaptions == true ? 'yes' : 'no' : 'Not checked', - width: getColumnWidth(data, 'hasClosedCaptions', 'CC'), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.codec != undefined ? columns.codec : true, - Header: () => ( -
-

Codec

-
- ), - accessor: 'ffProbeData.streams[0].codec_name', - width: getColumnWidth(data, 'video_codec_name', 'Codec'), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.resolution != undefined ? columns.resolution : true, - Header: () => ( -
-

Resolution

-
- ), - accessor: 'video_resolution', - width: getColumnWidth(data, 'video_resolution', 'Resolution'), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.size != undefined ? columns.size : true, - Header: () => ( -
-

Size(GB)

-
- ), - id: 'size', - accessor: row => row.file_size != undefined ? parseFloat((row.file_size / 1000).toPrecision(4)) : 0, - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - - { - show: columns.bitrate != undefined ? columns.bitrate : true, - Header: () => ( -
-

Bitrate(Mbs)

-
- ), - id: 'Bitrate', - accessor: row => row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4)) : 0, - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - - { - show: columns.duration != undefined ? columns.duration : true, - Header: () => ( -
-

Duration(s)

-
- ), - id: 'Duration', - accessor: row => row.ffProbeData && row.ffProbeData.streams[0]["duration"] ? fancyTimeFormat(parseFloat((row.ffProbeData.streams[0]["duration"]))) : "00:00:00", - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - } - //,{ - // show: columns.bump != undefined ? columns.bump : true, - // Header: () => ( - //
- //

Options

- //
- // ), - // id: 'Options', - // width: 'Bump'.length*10, - // accessor: row => { - - - - // return - // - // Options - // - - // - - //
- //

Bump:{!(row.bumped instanceof Date) ? this.renderBumpButton(row.file) : this.renderCancelBumpButton(row.file)}

- //

Create sample:{this.renderCreateSampleButton(row.file)}

- - //
- //
- //
- - - - - - - - // }, - // getProps: (state, rowInfo, column) => { - // return { - // style: { - // color:"#e1e1e1", - // fontSize :"14px", - // }, - // } - // } - - // }, - - - - - ,{ - show: columns.bump != undefined ? columns.bump : true, - Header: () => ( -
-

Bump

-
- ), - id: 'Bump', - width: 'Bump'.length*10, - accessor: row => !(row.bumped instanceof Date) ? :, - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - - }, - - { - show: columns.createSample != undefined ? columns.createSample : true, - Header: () => ( -
-

Create sample

-
- ), - id: 'Create sample', - width: 'Create sample'.length*10, - accessor: row => this.renderCreateSampleButton(row), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - - }, - - { - show: columns.transcode != undefined ? columns.transcode : true, - Header: () => ( -
-

Transcode

-
- ), - id: 'Transcode', - width: 'Transcode'.length*10, - accessor: row => row.TranscodeDecisionMaker == "Queued" ? Queued({row.tPosition}) : , - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - - { - show: columns.healthCheck != undefined ? columns.healthCheck : true, - Header: () => ( -
-

Health check

-
- ), - id: 'Health check', - width: 'Health check'.length*10, - accessor: row => row.HealthCheck == "Queued" ? Queued({row.hPosition}): , - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.info != undefined ? columns.info : true, - Header: () => ( -
-

Info

-
- ), - id: 'Info', - width: 'Info'.length*10, - accessor: row => this.renderInfoButton(row), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.history != undefined ? columns.history : true, - Header: () => ( -
-

History

-
- ), - id: 'History', - width: 'History'.length*10, - accessor: row => this.renderHistoryButton(row), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.remove != undefined ? columns.remove : true, - Header: () => ( -
-

Remove

-
- ), - id: 'Remove', - width: 'Remove'.length*10, - accessor: row => this.renderRemoveButton(row), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - { - show: columns.forceProcessing != undefined ? columns.forceProcessing : true, - Header: () => ( -
-

Force processing

-
- ), - id: 'forceProcessing', - width: 'forceProcessing'.length*10, - accessor: row => row.forceProcessing === true ? : , - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - - - { - show: columns.reScan != undefined ? columns.reScan : true, - Header: () => ( -
-

Re-scan

-
- ), - id: 'reScan', - width: 'reScan'.length*10, - accessor: row => this.renderReScanButton(row), - getProps: (state, rowInfo, column) => { - return { - style: { - color:"#e1e1e1", - fontSize :"14px", - }, - } - } - }, - - - - - - ] - - - function filterMethod(filter, row){ - - try{ - - - if(filter.id == "streams"){ - - var text = renderToString(row[filter.id]) - - - if((text).toString().includes(filter.value)){ - return true - } - - - }else{ - - if((row[filter.id]).toString().includes(filter.value)){ - return true - } - - - } - - }catch(err){ - - return false - - } - - - } - - - return
- -
- -

Tip: Use the table headers to sort & filter files

-

Count:{data.length}

-
- -
- - + + + { + show: columns.fileName != undefined ? columns.fileName : true, + Header: () => ( +
+

File

+
+ ), + accessor: 'file', + width: getColumnWidth(data, 'file', 'File'), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + { + show: columns.streams != undefined ? columns.streams : true, + Header: () => ( +
+

Streams

+
+ ), + id: 'streams', + accessor: row => { + + if (row.ffProbeData && row.ffProbeData.streams) { + var streams = row.ffProbeData.streams + streams = streams.map((row) => { + return + +

{row.codec_name}

+ + +

{row.codec_type}

+ + +

{row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4)) + " Mbs" : "-"}

+ + +

{row.tags != undefined && row.tags.language != undefined ? row.tags.language : "-"}

+

{row.channels != undefined ? row.channels : "-"}

+ + +

{row.tags != undefined && row.tags.title != undefined ? row.tags.title : "-"}

+ + + + }) + + return + + + + + + {streams} + +
+ + } else { + return null + } + + }, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + + } + , { + show: columns.closedCaptions != undefined ? columns.closedCaptions : true, + Header: () => ( +
+

Closed Captions

+
+ ), + id: 'CC', + accessor: row => row.hasClosedCaptions != undefined ? row.hasClosedCaptions == true ? 'yes' : 'no' : 'Not checked', + width: getColumnWidth(data, 'hasClosedCaptions', 'CC'), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.codec != undefined ? columns.codec : true, + Header: () => ( +
+

Codec

+
+ ), + accessor: 'ffProbeData.streams[0].codec_name', + width: getColumnWidth(data, 'video_codec_name', 'Codec'), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.resolution != undefined ? columns.resolution : true, + Header: () => ( +
+

Resolution

+
+ ), + accessor: 'video_resolution', + width: getColumnWidth(data, 'video_resolution', 'Resolution'), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.size != undefined ? columns.size : true, + Header: () => ( +
+

Size(GB)

+
+ ), + id: 'size', + accessor: row => row.file_size != undefined ? parseFloat((row.file_size / 1000).toPrecision(4)) : 0, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + { + show: columns.bitrate != undefined ? columns.bitrate : true, + Header: () => ( +
+

Bitrate(Mbs)

+
+ ), + id: 'Bitrate', + accessor: row => row.bit_rate != undefined ? parseFloat((row.bit_rate / 1000000).toPrecision(4)) : 0, + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + { + show: columns.duration != undefined ? columns.duration : true, + Header: () => ( +
+

Duration(s)

+
+ ), + id: 'Duration', + accessor: row => row.ffProbeData && row.ffProbeData.streams[0]["duration"] ? fancyTimeFormat(parseFloat((row.ffProbeData.streams[0]["duration"]))) : "00:00:00", + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + } + , { + show: columns.bump != undefined ? columns.bump : true, + Header: () => ( +
+

Bump

+
+ ), + id: 'Bump', + width: 'Bump'.length * 10, + accessor: row => !(row.bumped instanceof Date) ? : , + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + + }, + + { + show: columns.createSample != undefined ? columns.createSample : true, + Header: () => ( +
+

Create sample

+
+ ), + id: 'Create sample', + width: 'Create sample'.length * 10, + accessor: row => this.renderCreateSampleButton(row), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + + }, + + { + show: columns.transcode != undefined ? columns.transcode : true, + Header: () => ( +
+

Transcode

+
+ ), + id: 'Transcode', + width: 'Transcode'.length * 10, + accessor: row => row.TranscodeDecisionMaker == "Queued" ? Queued({row.tPosition}) : , + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + { + show: columns.healthCheck != undefined ? columns.healthCheck : true, + Header: () => ( +
+

Health check

+
+ ), + id: 'Health check', + width: 'Health check'.length * 10, + accessor: row => row.HealthCheck == "Queued" ? Queued({row.hPosition}) : , + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.info != undefined ? columns.info : true, + Header: () => ( +
+

Info

+
+ ), + id: 'Info', + width: 'Info'.length * 10, + accessor: row => this.renderInfoButton(row), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.history != undefined ? columns.history : true, + Header: () => ( +
+

History

+
+ ), + id: 'History', + width: 'History'.length * 10, + accessor: row => this.renderHistoryButton(row), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.remove != undefined ? columns.remove : true, + Header: () => ( +
+

Remove

+
+ ), + id: 'Remove', + width: 'Remove'.length * 10, + accessor: row => this.renderRemoveButton(row), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + { + show: columns.forceProcessing != undefined ? columns.forceProcessing : true, + Header: () => ( +
+

Force processing

+
+ ), + id: 'forceProcessing', + width: 'forceProcessing'.length * 10, + accessor: row => row.forceProcessing === true ? : , + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + + { + show: columns.reScan != undefined ? columns.reScan : true, + Header: () => ( +
+

Re-scan

+
+ ), + id: 'reScan', + width: 'reScan'.length * 10, + accessor: row => this.renderReScanButton(row), + getProps: (state, rowInfo, column) => { + return { + style: { + color: "#e1e1e1", + fontSize: "14px", + }, + } + } + }, + + + + + + ] + + + function filterMethod(filter, row) { + + try { + + + if (filter.id == "streams") { + + var text = renderToString(row[filter.id]) + + + if ((text).toString().includes(filter.value)) { + return true + } + + + } else { + + if ((row[filter.id]).toString().includes(filter.value)) { + return true + } + + + } + + } catch (err) { + + return false + + } + + + } + + + return
+ +
+ +

Tip: Use the table headers to sort & filter files

+

Count:{data.length}

+
+ +
+ + Columns - + @@ -627,10 +633,10 @@ return null

Size

Bitrate

Duration

- + {/*

Options

*/} - +

Bump

Create Sample

Transcode

@@ -642,14 +648,6 @@ return null

Re-scan

- - - - - - - -
@@ -657,101 +655,27 @@ return null
-
- -
- - - filterMethod(filter, row)} - /> -
- -} -} - - -// renderBumpButton(file) { -// var obj = { -// bumped: new Date(), -// } -// return - -// } +
- // renderSkipButton(file) { - // var obj = { - // TranscodeDecisionMaker:"Transcode success", - // lastTranscodeDate: new Date(), - // } - // return - // } +
- // renderSkipHealthCheckButton(file) { - // var obj = { - // HealthCheck: "Success", - // lastHealthCheckDate: new Date(), - // } - // return - // } - // renderCancelBumpButton(file) { - // var obj = { - // bumped: false, - // } - // return - // } - - - // renderRedoButton(file, mode) { - - - // var obj = { - // [mode]: "Queued", - // processingStatus: false, - // createdAt: new Date(), - // } - - - // return - // } - - // renderForceProcessingButton(file) { - // var obj = { - // forceProcessing: true, - // } - // return - // } - - // renderCancelForceProcessingButton(file) { - // var obj = { - // forceProcessing: false, - // } - // return - // } - - - - // renderIgnoreButton(file, mode) { - - // var obj = { - // [mode]: "Ignored", - // processingStatus: false, - // createdAt: new Date(), - // } - // return + filterMethod(filter, row)} + /> +
+ } + } - // } - - renderCreateSampleButton(file){ + renderCreateSampleButton(file) { return @@ -759,13 +683,13 @@ return null renderRemoveButton(file) { - return + return } renderReScanButton(file) { - - return + + return } @@ -801,18 +725,18 @@ return null closeOnDocumentClick >
-
-
-
- {/* {result} */} +
+
+
+ {/* {result} */} - + +
-
@@ -825,17 +749,17 @@ return null renderHistoryButton(row) { - if(row.history == undefined){ - result ="" - - }else{ + if (row.history == undefined) { + result = "" + + } else { var result = row.history result = result.split("\n") - result = result.map((row, i) => ( - - - )); + result = result.map((row, i) => ( + + + )); } return
-
-
-
- {result} +
+
+
+ {result} +
-
} - handleChange(event){ + handleChange(event) { - var key = "searchResultColumns."+event.target.name + var key = "searchResultColumns." + event.target.name @@ -876,22 +800,23 @@ return null } ); - + } -render() { + render() { return ( -
+
{this.renderResults(this.props.results)} -
+
- )} + ) + } } From 2e3b1b456f6a65703a57de163ff0535fcfe8e1cf Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 18 Feb 2020 02:28:29 +0000 Subject: [PATCH 18/31] Remove button loading --- imports/ui/plugins/tab_Plugins.jsx | 42 +++++++++++++++--------------- package.json | 7 ++++- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/imports/ui/plugins/tab_Plugins.jsx b/imports/ui/plugins/tab_Plugins.jsx index 070d5006..c41029af 100644 --- a/imports/ui/plugins/tab_Plugins.jsx +++ b/imports/ui/plugins/tab_Plugins.jsx @@ -165,13 +165,13 @@ class App extends Component { } - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - pluginSearchLoading: true, - } - } - ); + // GlobalSettingsDB.upsert('globalsettings', + // { + // $set: { + // pluginSearchLoading: true, + // } + // } + // ); var string = "searchString" + pluginType @@ -196,26 +196,26 @@ class App extends Component { - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - pluginSearchLoading: false, - } - } - ); + // GlobalSettingsDB.upsert('globalsettings', + // { + // $set: { + // pluginSearchLoading: false, + // } + // } + // ); } catch (err) { console.log(err) - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - pluginSearchLoading: false, - } - } - ); + // GlobalSettingsDB.upsert('globalsettings', + // { + // $set: { + // pluginSearchLoading: false, + // } + // } + // ); } diff --git a/package.json b/package.json index 583faf4e..01e1e90b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha", "visualize": "meteor --production --extra-packages bundle-visualizer", "lint": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}}", - "lint:fix": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}} --fix" + "lint:fix": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}} --fix", + "desktop": "meteor-desktop" }, "dependencies": { "@babel/runtime": "^7.8.4", @@ -80,5 +81,9 @@ "server": "server/main.js" }, "testModule": "tests/main.js" + }, + "devDependencies": { + "electron": "6.1.7", + "electron-builder": "21.2.0" } } From 8ce5e4c1cc9a8c2ddd622739304af4961789ae38 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Tue, 18 Feb 2020 08:07:19 +0000 Subject: [PATCH 19/31] Sort backups. Set backup limit --- imports/ui/tab_Options.jsx | 39 +++++++++++---------- server/main.js | 72 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 22 deletions(-) diff --git a/imports/ui/tab_Options.jsx b/imports/ui/tab_Options.jsx index 0582b046..497323aa 100644 --- a/imports/ui/tab_Options.jsx +++ b/imports/ui/tab_Options.jsx @@ -22,30 +22,30 @@ class App extends Component { handleChange = (event) => { - if (event.target.name == "basePath") { + var value = event.target.value - var URL = event.target.value + if (event.target.name == "basePath") { - if (URL.charAt(0) !== "/") { - URL = "/" + URL - } + if (value.charAt(0) !== "/") { + value = "/" + value - GlobalSettingsDB.upsert( + } - "globalsettings", - { - $set: { - [event.target.name]: URL, - } - } - ); + } + GlobalSettingsDB.upsert( - } + "globalsettings", + { + $set: { + [event.target.name]: value, + } + } + ); } @@ -124,11 +124,12 @@ class App extends Component { } />
- - - - - +
+
+
+

Backup limit (default 30):

+ +
diff --git a/server/main.js b/server/main.js index 66fca776..6b426c40 100644 --- a/server/main.js +++ b/server/main.js @@ -345,11 +345,15 @@ Meteor.methods({ fs.readdirSync(homePath + `/Tdarr/Backups/`).forEach(file => { if (file.includes('.zip')) { - var sizeInMbytes = (((fs.statSync(homePath + `/Tdarr/Backups/` + file)).size) / 1000000.0).toPrecision(2); + var fullPath = homePath + `/Tdarr/Backups/` + file + var statSync = fs.statSync(fullPath) + var sizeInMbytes = ((statSync.size) / 1000000.0).toPrecision(2); + backups.push({ name: file, size: sizeInMbytes, + statSync : statSync , }) } @@ -358,10 +362,68 @@ Meteor.methods({ } catch (err) { console.log(err.stack) } + + + backups = backups.sort(function (a, b) { + return new Date(b.statSync.ctime) - new Date(a.statSync.ctime); + }); + return backups }, + 'trimBackups'() { + + try { + var backups = [] + fs.readdirSync(homePath + `/Tdarr/Backups/`).forEach(file => { + if (file.includes('.zip')) { + + var fullPath = homePath + `/Tdarr/Backups/` + file + var statSync = fs.statSync(fullPath) + + backups.push({ + fullPath: fullPath, + statSync : statSync , + }) + + } + }); + + + backups = backups.sort(function (a, b) { + return new Date(a.statSync.ctime) - new Date(b.statSync.ctime); + }); + + var backupLimit = (GlobalSettingsDB.find({}, {}).fetch())[0].backupLimit + + if (backupLimit == undefined) { + backupLimit = 30 + } + + console.log(`Num backups:${backups.length}, Backup limit:${backupLimit}`) + + + while (backups.length > backupLimit) { + + + console.log('Deleting backup:' + backups[0].fullPath) + + fs.unlinkSync(backups[0].fullPath) + backups.splice(0, 1) + + } + + + + + + } catch (err) { + console.log(err.stack) + } + + }, + 'restoreBackup'(name) { backupStatus = [ @@ -579,7 +641,9 @@ Meteor.methods({ //Backup var dailyBackup = schedule.scheduleJob('0 0 0 * * *', Meteor.bindEnvironment(function () { - Meteor.call('createBackup', (error, result) => { }) + Meteor.call('createBackup', (error, result) => { + Meteor.call('trimBackups', (error, result) => { }) + }) })); @@ -596,11 +660,13 @@ var dailyBackup = schedule.scheduleJob('0 0 0 * * *', Meteor.bindEnvironment(fun -setTimeout(Meteor.bindEnvironment(main), 10000); +setTimeout(Meteor.bindEnvironment(main), 1000); function main() { + + console.log("Initialising DB") From 82bf3c19c576ba4d9c34bdafe3998fea5f39b780 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:10:53 +0000 Subject: [PATCH 20/31] Put plugin into grid item --- imports/ui/libraries/Plugin.jsx | 282 ++++++++++++++------------------ 1 file changed, 123 insertions(+), 159 deletions(-) diff --git a/imports/ui/libraries/Plugin.jsx b/imports/ui/libraries/Plugin.jsx index 05b2c6cc..1d0c06ba 100644 --- a/imports/ui/libraries/Plugin.jsx +++ b/imports/ui/libraries/Plugin.jsx @@ -1,107 +1,107 @@ import React, { Component } from 'react'; import Checkbox from '@material-ui/core/Checkbox'; -import { Button} from 'react-bootstrap'; +import { Button } from 'react-bootstrap'; import Modal from "reactjs-popup"; -import { SettingsDB} from '../../api/tasks.js'; +import { SettingsDB } from '../../api/tasks.js'; export default class Plugin extends Component { - constructor(props) { - super(props); + constructor(props) { + super(props); + + this.toggleChecked = this.toggleChecked.bind(this); + this.deleteThisPlugin = this.deleteThisPlugin.bind(this); - this.toggleChecked = this.toggleChecked.bind(this); - this.deleteThisPlugin = this.deleteThisPlugin.bind(this); - - - } - toggleChecked(event) { + } + toggleChecked(event) { - Meteor.call('updatePluginInclude',this.props.DB_id, this.props.pluginItem._id,event.target.checked,function (error, result) { }); + Meteor.call('updatePluginInclude', this.props.DB_id, this.props.pluginItem._id, event.target.checked, function (error, result) { }); - } - deleteThisPlugin(){ + } + + deleteThisPlugin() { - var thisLibraryPlugins = SettingsDB.find({ _id: this.props.DB_id }, { sort: { createdAt: 1 } }).fetch()[0].pluginIDs + var thisLibraryPlugins = SettingsDB.find({ _id: this.props.DB_id }, { sort: { createdAt: 1 } }).fetch()[0].pluginIDs - for (var i = 0; i < thisLibraryPlugins.length; i++) { + for (var i = 0; i < thisLibraryPlugins.length; i++) { - if (thisLibraryPlugins[i].priority > this.props.pluginItem.priority) { + if (thisLibraryPlugins[i].priority > this.props.pluginItem.priority) { + + thisLibraryPlugins[i].priority = thisLibraryPlugins[i].priority - 1 - thisLibraryPlugins[i].priority = thisLibraryPlugins[i].priority - 1 - - } } + } - SettingsDB.upsert( - this.props.DB_id, - { - $set: { - pluginIDs: thisLibraryPlugins, - } + SettingsDB.upsert( + this.props.DB_id, + { + $set: { + pluginIDs: thisLibraryPlugins, } - ); - + } + ); - Meteor.call('removePluginInclude',this.props.DB_id, this.props.pluginItem._id,function (error, result) { }); - } + Meteor.call('removePluginInclude', this.props.DB_id, this.props.pluginItem._id, function (error, result) { }); + } - renderInputs = (inputs) => { + renderInputs = (inputs) => { - var desc = inputs.map(row => { - var tooltip = row.tooltip.split('\\n') + var desc = inputs.map(row => { - for (var i = 0; i < tooltip.length; i++) { + var tooltip = row.tooltip.split('\\n') - var current = i + for (var i = 0; i < tooltip.length; i++) { - if (tooltip[i].includes('Example:') && i+1 < tooltip.length) { - tooltip[i + 1] =

{tooltip[i + 1]}

- i++ - } + var current = i - tooltip[current] =

{tooltip[current]}

+ if (tooltip[i].includes('Example:') && i + 1 < tooltip.length) { + tooltip[i + 1] =

{tooltip[i + 1]}

+ i++ } + tooltip[current] =

{tooltip[current]}

+ } + - return
i} - modal - closeOnDocumentClick - > -
-
-
+ return
i} + modal + closeOnDocumentClick + > +
+
+
-
-

Usage:

-

-

- {tooltip} +
+

Usage:

+

+

+ {tooltip} -
-

{row.name}:

- }) +
+

{row.name}:

+ }) - return desc + return desc - } + } saveInput = (event) => { @@ -109,7 +109,7 @@ export default class Plugin extends Component { var thisLibraryPlugins = SettingsDB.find({ _id: this.props.DB_id }, { sort: { createdAt: 1 } }).fetch()[0].pluginIDs - if(thisLibraryPlugins[this.props.pluginItem.priority].InputsDB == undefined){ + if (thisLibraryPlugins[this.props.pluginItem.priority].InputsDB == undefined) { thisLibraryPlugins[this.props.pluginItem.priority].InputsDB = {} @@ -131,143 +131,107 @@ export default class Plugin extends Component { - render() { - return ( - - + render() { - - {this.props.pluginItem.source != undefined ? this.props.pluginItem.source : "-"} - + var stack = [ +
{this.props.pluginItem.source != undefined ? this.props.pluginItem.source : "-"}
, +
, +
{this.props.pluginItem._id}
, +
{this.props.pluginItem.Stage}
, +
{this.props.pluginItem.Type}
, +
{this.props.pluginItem.Operation != undefined ? this.props.pluginItem.Operation : "-"}
, +
{this.props.pluginItem.Name != undefined ? this.props.pluginItem.Name : "-"}
, +
{this.props.pluginItem.Description != undefined ? this.props.pluginItem.Description : "-"}
, +
{this.props.pluginItem.Inputs != undefined ? this.renderInputs(this.props.pluginItem.Inputs) : "-"}
, +
+ +
+
- - - + +
+
-
+
+ - -{'\u00A0'}{'\u00A0'}{this.props.pluginItem.priority != undefined ? this.props.pluginItem.priority+1 : "-"} {'\u00A0'}{'\u00A0'} - - +
, +
, + ] + return ( + stack - } else { - - var thisPlugin = thisLibraryPlugins[this.props.pluginItem.priority] - thisPlugin.priority = thisPlugin.priority + 1 - var pluginAbove = thisLibraryPlugins[this.props.pluginItem.priority + 1] - pluginAbove.priority = pluginAbove.priority - 1 - - thisLibraryPlugins.splice(this.props.pluginItem.priority,2,pluginAbove,thisPlugin) - - SettingsDB.upsert( - this.props.DB_id, - { - $set: { - pluginIDs: thisLibraryPlugins, - } - } ); } +} -}} > - - - - - - - - - - - - - - - - ); - } - } - - var noBreak = { display: 'inline-block', } \ No newline at end of file From 68f99439568ea0019a77ac31de3d460b1ad143e2 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:12:02 +0000 Subject: [PATCH 21/31] Plugin grid --- imports/ui/libraries/tab_Libraries_Folder.jsx | 98 +++++++------------ imports/ui/styles/main.scss | 77 +++++++++++++-- 2 files changed, 102 insertions(+), 73 deletions(-) diff --git a/imports/ui/libraries/tab_Libraries_Folder.jsx b/imports/ui/libraries/tab_Libraries_Folder.jsx index a66e9b18..56d154a8 100644 --- a/imports/ui/libraries/tab_Libraries_Folder.jsx +++ b/imports/ui/libraries/tab_Libraries_Folder.jsx @@ -24,6 +24,11 @@ var libButtonStyle = { display: 'inline-block', }; + +var tabCol1 = { + width:'200px', +}; + const override = css``; class Folder extends Component { @@ -407,71 +412,36 @@ class Folder extends Component { render( - - - - - - - - - - - - - - - - {stack} - -
-
-

Source

-
-
-
-

Enabled

-
-
-
-

id

-
-
-
-

Stage

-
-
-
-

Type

-
-
-
-

Operation

-
-
-
-

Name

-
-
-
-

Description

-
-
-
-

Inputs

-
-
-
-

Priority

-
-
-
-

Remove

-
-
, +
+ +

Source

+ +

Enabled

+ +

id

+ +

Stage

+ +

Type

+ +

Operation

+ +

Name

+ +

Description

+ +

Inputs

+ +

Priority

+ +

Remove

+ + {stack} + + - document.getElementById(this.props.libraryItem._id + 'PluginStack') +
,document.getElementById(this.props.libraryItem._id + 'PluginStack') ); } catch (err) { console.log(err) } @@ -1797,7 +1767,7 @@ class Folder extends Component {
{this.state.pluginsStored ? this.renderPlugins() : null} -
+
diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index 0e4cdd29..1d46527b 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -473,6 +473,7 @@ input[type="text"] .libraryContainer2{ margin:0em 4em; + width:auto; } @@ -741,8 +742,9 @@ input[type="text"] border: 2px solid black; border-radius: 5px; - - overflow: auto; + display:inline-block; + background:#373737; + padding:2em; @@ -946,11 +948,12 @@ table.sliderTable td { .box { display: flex; flex-wrap: wrap; + height:auto; } .pluginCard{ - border: 1px solid white; + border: 1px solid #222b44; border-radius: 5px; margin:1em; width:300px; @@ -964,6 +967,37 @@ table.sliderTable td { } + + +.pluginCard ::-webkit-scrollbar { + width: 12px; + + /* for vertical scrollbars */ + height: 12px; + + /* for horizontal scrollbars */ +} + +.pluginCard ::-webkit-scrollbar-track { + background: #222b44; +} + +.pluginCard ::-webkit-scrollbar-thumb { + background: #096b9c; +} + + +.pluginDesc{ + + overflow-y:auto; + overflow-y:scroll; + height:200px; + } + + .pluginDesc p{ + color:rgb(199, 198, 198); + } + .pluginCardLoading{ width:300px; @@ -986,6 +1020,15 @@ table.sliderTable td { color:green; } +.pluginTitle p{ + color:rgb(27, 117, 158); +} + +.pluginID p{ + font-size:0.5em; + color:rgb(74, 73, 104); +} + table.sliderTable { @@ -1011,22 +1054,38 @@ table.searchResultsTable td { } -table.pluginStackTable th { - border: 1px solid white; - color: black; +.pluginStackGrid{ + + display: grid; + grid-template-columns: auto auto 100px auto auto auto 100px 200px auto auto auto; + word-wrap: break-word; + + + border: 2px solid black; + border-radius: 5px; + background:#373737; + width:200%; + } -table.pluginStackTable td { +.pluginStackCol1{ + border-bottom: 1px solid black; + border-right: 1px solid black; + padding:0.5em; - border: 1px solid white; - color: black; } +.priorityButtonsGrid{ + display: grid; + grid-template-columns: auto; +} + + .iconContainer { background-color: grey; display: inline-block; From 41d776f6ea36e248d8ffd9af1edc1e7ef13fe5dc Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:12:30 +0000 Subject: [PATCH 22/31] Notify if libraries unchecked for processing --- server/main.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/server/main.js b/server/main.js index 6b426c40..38892869 100644 --- a/server/main.js +++ b/server/main.js @@ -4235,13 +4235,15 @@ function main() { } + var tab1Length = table1data.length + StatisticsDB.upsert('statistics', { $set: { tdarrScore: ((table2data.length * 100.00) / (table1data.length + table2data.length + table3data.length)).toPrecision(4), healthCheckScore: ((table5data.length * 100.00) / (table4data.length + table5data.length + table6data.length)).toPrecision(4), - table1Count: table1data.length, + // table1Count: table1data.length, table2Count: table2data.length, table3Count: table3data.length, table4Count: table4data.length, @@ -4282,11 +4284,16 @@ function main() { timeIdx = parseInt(timeIdx) + (d * 24) + var libNotice = ' -Libraries OFF:' + + for (var i = 0; i < settings.length; i++) { try { if ((settings[i].schedule[timeIdx] !== undefined && settings[i].schedule[timeIdx].checked === false) || settings[i].processLibrary === false) { + libNotice += (i+1)+',' + generalFiles = generalFiles.filter(row => row.DB != settings[i]._id); transcodeFiles = transcodeFiles.filter(row => row.DB != settings[i]._id); healthcheckFiles = healthcheckFiles.filter(row => row.DB != settings[i]._id); @@ -4304,6 +4311,20 @@ function main() { //old + if(libNotice == ' -Libraries OFF:'){ + libNotice = '' + } + + + StatisticsDB.upsert('statistics', + { + $set: { + table1Count: tab1Length +libNotice, + } + } + ); + + From b3489f1060159580f12ca0c32e47ca64ebff3a57 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:12:59 +0000 Subject: [PATCH 23/31] Handle rejected promise --- private/fileScanner/fileScanner.js | 46 +++++++++++++++++++++++++++--- private/fileScanner/runExifTool.js | 2 ++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/private/fileScanner/fileScanner.js b/private/fileScanner/fileScanner.js index cd1f80a2..86be0359 100644 --- a/private/fileScanner/fileScanner.js +++ b/private/fileScanner/fileScanner.js @@ -386,15 +386,53 @@ function ffprobeLaunch(filesToScan) { ccextractorData: '', } - fileInfo.ffProbeData = await runFFprobe(filepath); + + updateConsole(scannerID, 'Running ffmpeg on file') + + await runFFprobe(filepath) + .then((res) => { + fileInfo.ffProbeData = res + }).catch((err) => { + console.log(err) + fileInfo.ffProbeData = { + result: 'error', + data: 'FFprobe encountered an error ' + err, + } + }) if (fileInfo.ffProbeData.result != 'error') { - fileInfo.exifToolData = await runExifTool(filepath, exiftool); + updateConsole(scannerID, 'Running exiftool on file') + + await runExifTool(filepath, exiftool) + .then((res) => { + fileInfo.exifToolData = res + }) + .catch((err) => { + console.log(err) + fileInfo.exifToolData = { + result: 'error', + data: 'Exiftool encountered an error ' + err, + } + }) if (closedCaptionScan == 'true') { - fileInfo.ccextractorData = await runCCExtractor(filepath); + + updateConsole(scannerID, 'Running ccextractor on file') + await runCCExtractor(filepath) + .then((res) => { + fileInfo.ccextractorData = res + }) + .catch((err) => { + console.log(err) + fileInfo.ccextractorData = { + result: 'error', + data: 'CCextractor encountered an error ' + err, + } + }) + + extractData(filepath, fileInfo.ffProbeData.data, fileInfo.exifToolData.data, fileInfo.ccextractorData.data) } else { @@ -477,7 +515,7 @@ function ffprobeLaunch(filesToScan) { } catch (err) { } - thisFileObject.cliLog = "FFprobe was unable to extract data from this file. It is highly likely that the file is corrupt." + thisFileObject.cliLog = "FFprobe was unable to extract data from this file. It is likely that the file is corrupt." updateConsole(scannerID, `FFprobe was unable to extract data from this file:${filepath}`) diff --git a/private/fileScanner/runExifTool.js b/private/fileScanner/runExifTool.js index 1a350f42..da9f2f70 100644 --- a/private/fileScanner/runExifTool.js +++ b/private/fileScanner/runExifTool.js @@ -46,6 +46,8 @@ module.exports = function runExifTool(filepath, exiftool) { } }); + + } From 8b20ce180e48edf2e2ae77e35711b9a8c3f0a82b Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 07:14:38 +0000 Subject: [PATCH 24/31] Format plugin card --- imports/ui/plugins/PluginCategory.jsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/imports/ui/plugins/PluginCategory.jsx b/imports/ui/plugins/PluginCategory.jsx index 51ed9e90..a1ce2384 100644 --- a/imports/ui/plugins/PluginCategory.jsx +++ b/imports/ui/plugins/PluginCategory.jsx @@ -91,15 +91,16 @@ export default class App extends Component { result = result.map(row =>
-

{row.Name}

+

{row.id}

+

{row.Name}

-
-

{row.Description}

+

{row.Description}

-
- + +
+ {'\u00A0'} {row.Inputs ?
- : null} + : null} +
+

Tags:{row.Tags}

From 8a9eec305b4cb118befffbdb08d338ce7cc01315 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Wed, 19 Feb 2020 08:25:35 +0000 Subject: [PATCH 25/31] Git free method for updating plugins + indent --- package-lock.json | 20 +- package.json | 2 +- server/main.js | 499 ++++++++++++++++++++++++++++++---------------- 3 files changed, 342 insertions(+), 179 deletions(-) diff --git a/package-lock.json b/package-lock.json index f464ff5d..624b2e15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2678,11 +2678,6 @@ "assert-plus": "^1.0.0" } }, - "git-clone": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz", - "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=" - }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -5604,6 +5599,21 @@ } } }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "requires": { + "throttleit": "^1.0.0" + }, + "dependencies": { + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + } + } + }, "request-promise-core": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", diff --git a/package.json b/package.json index 01e1e90b..a50863d4 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "ffprobe": "^1.1.0", "ffprobe-static": "^3.0.0", "fs-extra": "^8.1.0", - "git-clone": "^0.1.0", "import-fresh": "^3.2.1", "interweave": "^12.2.0", "is-docker": "^2.0.0", @@ -68,6 +67,7 @@ "react-toggle-button": "^2.2.0", "reactjs-popup": "^1.5.0", "recharts": "^1.8.5", + "request-progress": "^3.0.0", "rimraf": "^3.0.1", "shelljs": "^0.8.3", "shortid": "^2.2.15", diff --git a/server/main.js b/server/main.js index 38892869..db2b5615 100644 --- a/server/main.js +++ b/server/main.js @@ -336,7 +336,7 @@ Meteor.methods({ Meteor.call('DBHasChanged', (error, result) => { }) - + }, 'getBackups'() { @@ -348,12 +348,12 @@ Meteor.methods({ var fullPath = homePath + `/Tdarr/Backups/` + file var statSync = fs.statSync(fullPath) var sizeInMbytes = ((statSync.size) / 1000000.0).toPrecision(2); - + backups.push({ name: file, size: sizeInMbytes, - statSync : statSync , + statSync: statSync, }) } @@ -384,7 +384,7 @@ Meteor.methods({ backups.push({ fullPath: fullPath, - statSync : statSync , + statSync: statSync, }) } @@ -532,7 +532,6 @@ Meteor.methods({ } - }, 'deleteBackup'(name) { @@ -665,7 +664,7 @@ setTimeout(Meteor.bindEnvironment(main), 1000); function main() { - + console.log("Initialising DB") @@ -1199,40 +1198,40 @@ function main() { return plugins - // + // - // for (var i = 0; i < plugins.length; i++) { + // for (var i = 0; i < plugins.length; i++) { - // try { + // try { - // var pluginLocalPath = path.join(process.cwd(), `/assets/app/plugins/${plugins[i].source}/` + plugins[i]._id + '.js') - // fsextra.copySync(homePath + `/Tdarr/Plugins/${plugins[i].source}/` + plugins[i]._id + ".js", pluginLocalPath) + // var pluginLocalPath = path.join(process.cwd(), `/assets/app/plugins/${plugins[i].source}/` + plugins[i]._id + '.js') + // fsextra.copySync(homePath + `/Tdarr/Plugins/${plugins[i].source}/` + plugins[i]._id + ".js", pluginLocalPath) - // var plugin = importFresh(pluginLocalPath) + // var plugin = importFresh(pluginLocalPath) - // var obj = plugin.details(); + // var obj = plugin.details(); - // plugins[i] = { ...plugins[i], ...obj }; + // plugins[i] = { ...plugins[i], ...obj }; - // } catch (err) { + // } catch (err) { - // var obj = { - // Name: "Read error", - // Type: "Read error", - // Operation: "Read error", - // Description: 'Read error', - // Version: "Read error", - // Link: "Read error" - // } + // var obj = { + // Name: "Read error", + // Type: "Read error", + // Operation: "Read error", + // Description: 'Read error', + // Version: "Read error", + // Link: "Read error" + // } - // //console.log(err.stack) + // //console.log(err.stack) - // plugins[i] = { ...plugins[i], ...obj }; + // plugins[i] = { ...plugins[i], ...obj }; - // } - // } - // return plugins + // } + // } + // return plugins }, @@ -1281,60 +1280,214 @@ function main() { }, 'updatePlugins'() { + const request = require('request'); + const progress = require('request-progress'); + try { + fsextra.removeSync(homePath + '/Tdarr/Plugins/temp.zip') + } catch (err) { console.log(err.stack) } try { fsextra.removeSync(homePath + '/Tdarr/Plugins/temp') } catch (err) { console.log(err.stack) } - var clone = require('git-clone'); + - console.log('Cloning plugins') + (async function clonePlugins() { - clone("https://github.com/HaveAGitGat/Tdarr_Plugins/", homePath + '/Tdarr/Plugins/temp/', Meteor.bindEnvironment(function (err, result) { + console.log('Cloning plugins') - console.log(err) - try { - fsextra.copySync(homePath + '/Tdarr/Plugins/temp/Community', homePath + "/Tdarr/Plugins/Community", { overwrite: true }) - } catch (err) { console.log(err.stack) } + var downloadStatus - try { - //COMMENT OUT WHEN WORKING ON LIBRARY FITLERS/ACTIONS - fsextra.copySync(homePath + '/Tdarr/Plugins/temp/methods', homePath + '/Tdarr/Plugins/methods', { overwrite: true }) - } catch (err) { console.log(err.stack) } + await downloadNew() + .then((res) => { + downloadStatus = res + }) + .catch((err) => { + console.log(err) + downloadStatus = 'Error!' + }) - try { - fsextra.copySync(homePath + '/Tdarr/Plugins/methods', path.join(process.cwd(), `/assets/app/plugins/methods`), { overwrite: true }) - } catch (err) { console.log(err.stack) } + if (downloadStatus == 'Done!') { + var unzipStatus - try { - fsextra.removeSync(homePath + '/Tdarr/Plugins/temp') - } catch (err) { console.log(err.stack) } + await unzip() + .then((res) => { + unzipStatus = res + }) + .catch((err) => { + console.log(err) + unzipStatus = 'Error!' + }) + await waitUnzip() - console.log('Plugin update finished') + if (unzipStatus == 'Done!') { + try { + fsextra.copySync(homePath + '/Tdarr/Plugins/temp/Tdarr_Plugins-master/Community', homePath + "/Tdarr/Plugins/Community", { overwrite: true }) + } catch (err) { console.log(err.stack) } - GlobalSettingsDB.upsert('globalsettings', - { - $set: { - pluginSearchLoading: false, + try { + //COMMENT OUT WHEN WORKING ON LIBRARY FITLERS/ACTIONS + fsextra.copySync(homePath + '/Tdarr/Plugins/temp/Tdarr_Plugins-master/methods', homePath + '/Tdarr/Plugins/methods', { overwrite: true }) + } catch (err) { console.log(err.stack) } + + + + try { + fsextra.copySync(homePath + '/Tdarr/Plugins/methods', path.join(process.cwd(), `/assets/app/plugins/methods`), { overwrite: true }) + } catch (err) { console.log(err.stack) } + + + try { + fsextra.removeSync(homePath + '/Tdarr/Plugins/temp.zip') + } catch (err) { console.log(err.stack) } + + + try { + fsextra.removeSync(homePath + '/Tdarr/Plugins/temp') + } catch (err) { console.log(err.stack) } + + + console.log('Plugin update finished') + + + + GlobalSettingsDB.upsert('globalsettings', + { + $set: { + pluginSearchLoading: false, + } + } + ); + + + } else { + console.log('Plugin unzip failed!') } + + + + } else { + console.log('Plugin download failed!') } - ); - }) - ) + + })(); + + + + function waitUnzip() { + + return new Promise(resolve => { + setTimeout(() => { + resolve(); + }, 2000); + + }); + + } + + + function downloadNew(fresh) { + + fresh = true; + + + + return new Promise(resolve => { + + try { + + + if (fresh) { + + + const filename = homePath + '/Tdarr/Plugins/temp.zip' + + + + if (fs.existsSync(filename)) { + fs.unlinkSync(filename) + } + + + progress(request('https://github.com/HaveAGitGat/Tdarr_Plugins/archive/master.zip'), { + }) + .on('progress', function (state) { + }) + .on('error', function (err) { + // Do something with err + console.log(err) + resolve('Error!') + }) + .on('end', function () { + // Do something after request finishes + + console.log('Finished downloading plugins!') + + resolve('Done!') + + + }) + .pipe(fs.createWriteStream(filename)) + + } else { + + resolve('Done!') + } + + } catch (err) { + console.log(err) + + resolve('Error!') + } + }); + } + + + + function unzip() { + + return new Promise(resolve => { + + try { + + var zipPath = homePath + '/Tdarr/Plugins/temp.zip' + var unzipPath = homePath + '/Tdarr/Plugins/temp' + + if (!fs.existsSync(zipPath)) { + console.log('Zip path does not exist!') + + resolve('Error!') + } else { + + var stream = fs.createReadStream(zipPath) + .pipe(unzipper.Extract({ path: unzipPath })) + .on('error', err => { + }) + .on('finish', function () { + resolve('Done!') + }) + } + + } catch (err) { + console.log(err) + resolve('Error!') + } + }); + } }, 'setAllStatus'(DB_id, mode, table, processStatus) { @@ -1540,11 +1693,11 @@ function main() { 'launchWorker'(workerType, number) { - - for (var i = 1; i <= number; i++) { - launchWorkerModule(workerType) - } + + for (var i = 1; i <= number; i++) { + launchWorkerModule(workerType) + } @@ -2708,135 +2861,116 @@ function main() { - for (var i = 0; i < pluginsSelected.length; i++) { + for (var i = 0; i < pluginsSelected.length; i++) { - try { + try { - var pluginID = pluginsSelected[i]._id - var pluginLocalPath = path.join(process.cwd(), `/assets/app/plugins/${pluginsSelected[i].source}/` + pluginID + '.js') - fsextra.copySync(homePath + `/Tdarr/Plugins/${pluginsSelected[i].source}/` + pluginID + '.js', pluginLocalPath) - - - lastPluginDetails = { - source: pluginsSelected[i].source, - id: pluginID, - number: (i + 1) + '/' + pluginsSelected.length - } - - - - - var otherArguments = { - homePath: homePath - } - - var librarySettings = settings[0] - var plugin = importFresh(pluginLocalPath) - + var pluginID = pluginsSelected[i]._id + var pluginLocalPath = path.join(process.cwd(), `/assets/app/plugins/${pluginsSelected[i].source}/` + pluginID + '.js') + fsextra.copySync(homePath + `/Tdarr/Plugins/${pluginsSelected[i].source}/` + pluginID + '.js', pluginLocalPath) + lastPluginDetails = { + source: pluginsSelected[i].source, + id: pluginID, + number: (i + 1) + '/' + pluginsSelected.length + } - var pluginInputs = SettingsDB.find({ _id: firstItem.DB }, { sort: { createdAt: 1 } }).fetch()[0].pluginIDs.filter(row => row._id == pluginID)[0].InputsDB - //run if pre-processing plugin - if (plugin.details().Stage == undefined || plugin.details().Stage == 'Pre-processing') { - cliLogAdd += plugin.details().id + " - Pre-processing\n" + var otherArguments = { + homePath: homePath + } - preProcPluginSelected = true + var librarySettings = settings[0] + var plugin = importFresh(pluginLocalPath) - var response = plugin.plugin(firstItem, librarySettings, pluginInputs, otherArguments); - if (response && response.removeFromDB == true) { - Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) - Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) - } - if (response && response.updateDB == true) { - Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) - Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) - Meteor.call('modifyFileDB', 'insert', response.file._id, response.file, (error, result) => { }) - firstItem = { ...firstItem, ...response.file }; - } - //run post processing functions inside - pre-processing plugins (last run plugin ID must match) - if (firstItem.lastPluginDetails && firstItem.lastPluginDetails.id === pluginID) { - cliLogAdd += plugin.details().id + " - Transcode success post processing\n" - try { + var pluginInputs = SettingsDB.find({ _id: firstItem.DB }, { sort: { createdAt: 1 } }).fetch()[0].pluginIDs.filter(row => row._id == pluginID)[0].InputsDB - var temp = plugin.onTranscodeSuccess(firstItem, librarySettings, pluginInputs, otherArguments); + //run if pre-processing plugin + if (plugin.details().Stage == undefined || plugin.details().Stage == 'Pre-processing') { - if (temp && temp.removeFromDB == true) { - Meteor.call('modifyFileDB', 'removeOne', temp.file._id, (error, result) => { }) - Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) - } - if (temp && temp.updateDB == true) { - Meteor.call('modifyFileDB', 'removeOne', temp.file._id, (error, result) => { }) - Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) - Meteor.call('modifyFileDB', 'insert', temp.file._id, temp.file, (error, result) => { }) - firstItem = { ...firstItem, ...temp.file }; - } + cliLogAdd += plugin.details().id + " - Pre-processing\n" - } catch (err) { } - } + preProcPluginSelected = true + var response = plugin.plugin(firstItem, librarySettings, pluginInputs, otherArguments); + if (response && response.removeFromDB == true) { + Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) + Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) + } + if (response && response.updateDB == true) { + Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) + Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) + Meteor.call('modifyFileDB', 'insert', response.file._id, response.file, (error, result) => { }) + firstItem = { ...firstItem, ...response.file }; + } - console.dir(response) + //run post processing functions inside - pre-processing plugins (last run plugin ID must match) + if (firstItem.lastPluginDetails && firstItem.lastPluginDetails.id === pluginID) { - processFile = response.processFile - if(processFile === undefined){ - throw 'No proceesFile value returned from plugin!' - } - preset = response.preset - container = response.container - handBrakeMode = response.handBrakeMode - FFmpegMode = response.FFmpegMode - reQueueAfter = response.reQueueAfter - cliLogAdd += response.infoLog + cliLogAdd += plugin.details().id + " - Transcode success post processing\n" + try { - if (processFile == true && plugin.details().Operation == "Filter") { + var temp = plugin.onTranscodeSuccess(firstItem, librarySettings, pluginInputs, otherArguments); - //do nothing + if (temp && temp.removeFromDB == true) { + Meteor.call('modifyFileDB', 'removeOne', temp.file._id, (error, result) => { }) + Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) + } + if (temp && temp.updateDB == true) { + Meteor.call('modifyFileDB', 'removeOne', temp.file._id, (error, result) => { }) + Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) + Meteor.call('modifyFileDB', 'insert', temp.file._id, temp.file, (error, result) => { }) + firstItem = { ...firstItem, ...temp.file }; + } - } else if (processFile == false && plugin.details().Operation == "Filter") { + } catch (err) { } + } - break - } else if (processFile == true) { - break + console.dir(response) - } + processFile = response.processFile + if (processFile === undefined) { + throw 'No proceesFile value returned from plugin!' } + preset = response.preset + container = response.container + handBrakeMode = response.handBrakeMode + FFmpegMode = response.FFmpegMode + reQueueAfter = response.reQueueAfter + cliLogAdd += response.infoLog - } catch (err) { - console.log(err) - // err = JSON.stringify(err) + if (processFile == true && plugin.details().Operation == "Filter") { + //do nothing - processFile = false - preset = '' - container = '' - handBrakeMode = '' - FFmpegMode = '' - reQueueAfter = '' - cliLogAdd += `☒Plugin error! ${err} \n` + } else if (processFile == false && plugin.details().Operation == "Filter") { - TranscodeDecisionMaker = "Transcode error" + break - break + } else if (processFile == true) { + break + } } - } - - if(preProcPluginSelected == false){ + } catch (err) { + console.log(err) + + // err = JSON.stringify(err) + processFile = false preset = '' @@ -2844,11 +2978,30 @@ function main() { handBrakeMode = '' FFmpegMode = '' reQueueAfter = '' - cliLogAdd += '☒No pre-processing plugins selected! \n' - - + cliLogAdd += `☒Plugin error! ${err} \n` + + TranscodeDecisionMaker = "Transcode error" + + break + } + } + + + if (preProcPluginSelected == false) { + + processFile = false + preset = '' + container = '' + handBrakeMode = '' + FFmpegMode = '' + reQueueAfter = '' + cliLogAdd += '☒No pre-processing plugins selected! \n' + + + + } // @@ -3083,19 +3236,19 @@ function main() { if (settings[0].decisionMaker.pluginFilter == true) { - try { + try { - var pluginsSelected = settings[0].pluginIDs + var pluginsSelected = settings[0].pluginIDs - pluginsSelected = pluginsSelected.sort(function (a, b) { - return a.priority - b.priority; - }); + pluginsSelected = pluginsSelected.sort(function (a, b) { + return a.priority - b.priority; + }); - pluginsSelected = pluginsSelected.filter(row => row.checked); + pluginsSelected = pluginsSelected.filter(row => row.checked); - var postProcPluginSelected = false + var postProcPluginSelected = false for (var i = 0; i < pluginsSelected.length; i++) { @@ -3131,7 +3284,7 @@ function main() { Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) Meteor.call('modifyFileDB', 'removeOne', originalID, (error, result) => { }) - + } if (response && response.updateDB == true) { Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) @@ -3146,22 +3299,22 @@ function main() { console.log('final post processing failed' + i) } } - - } catch (err) { - console.log(err) - console.log('final post processing failed') + + } catch (err) { + console.log(err) + console.log('final post processing failed') + } } - } - if (preProcPluginSelected == false && postProcPluginSelected == false ) { + if (preProcPluginSelected == false && postProcPluginSelected == false) { cliLogAdd += '☒No pre or post-processing plugins selected! \n' TranscodeDecisionMaker = "Transcode error" } - + //TranscodeDecisionMaker status first depends on if error encountered during plugins, else depends on @@ -3354,7 +3507,7 @@ function main() { var response = plugin.onTranscodeError(file, librarySettings, pluginInputs, otherArguments); - if (response && response.removeFromDB == true) { + if (response && response.removeFromDB == true) { Meteor.call('modifyFileDB', 'removeOne', response.file._id, (error, result) => { }) } if (response && response.updateDB == true) { @@ -4292,7 +4445,7 @@ function main() { try { if ((settings[i].schedule[timeIdx] !== undefined && settings[i].schedule[timeIdx].checked === false) || settings[i].processLibrary === false) { - libNotice += (i+1)+',' + libNotice += (i + 1) + ',' generalFiles = generalFiles.filter(row => row.DB != settings[i]._id); transcodeFiles = transcodeFiles.filter(row => row.DB != settings[i]._id); @@ -4311,18 +4464,18 @@ function main() { //old - if(libNotice == ' -Libraries OFF:'){ + if (libNotice == ' -Libraries OFF:') { libNotice = '' } StatisticsDB.upsert('statistics', - { - $set: { - table1Count: tab1Length +libNotice, + { + $set: { + table1Count: tab1Length + libNotice, + } } - } - ); + ); @@ -4453,7 +4606,7 @@ function main() { } - + setTimeout(Meteor.bindEnvironment(() => { addFilesToDB = true }), 1000); From 3afbfe5d5a9e9c116df3b3dbf38909c1aa71c6fe Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 03:43:52 +0000 Subject: [PATCH 26/31] Various UI changes --- imports/ui/libraries/Plugin.jsx | 5 ++--- imports/ui/libraries/tab_Libraries.jsx | 3 +++ imports/ui/libraries/tab_Libraries_Folder.jsx | 17 +++++++++++----- .../plugins/pluginTemplates/PluginGuide.jsx | 1 - imports/ui/plugins/tab_Plugins.jsx | 4 ++-- imports/ui/styles/main.scss | 20 +++++++++++++++---- imports/ui/transcoding/tab_Transcoding.jsx | 9 +++++---- .../ui/transcoding/tab_Transcoding_Worker.jsx | 8 +++++--- 8 files changed, 45 insertions(+), 22 deletions(-) diff --git a/imports/ui/libraries/Plugin.jsx b/imports/ui/libraries/Plugin.jsx index 1d0c06ba..6c2663e9 100644 --- a/imports/ui/libraries/Plugin.jsx +++ b/imports/ui/libraries/Plugin.jsx @@ -136,11 +136,10 @@ export default class Plugin extends Component { var stack = [
{this.props.pluginItem.source != undefined ? this.props.pluginItem.source : "-"}
,
, -
{this.props.pluginItem._id}
, -
{this.props.pluginItem.Stage}
, +
{this.props.pluginItem._id}
{this.props.pluginItem.Name != undefined ? this.props.pluginItem.Name : "-"}
, +
{this.props.pluginItem.Stage == 'Pre-processing' ? 'Pre' : this.props.pluginItem.Stage == 'Post-processing' ? 'Post' : ''}
,
{this.props.pluginItem.Type}
,
{this.props.pluginItem.Operation != undefined ? this.props.pluginItem.Operation : "-"}
, -
{this.props.pluginItem.Name != undefined ? this.props.pluginItem.Name : "-"}
,
{this.props.pluginItem.Description != undefined ? this.props.pluginItem.Description : "-"}
,
{this.props.pluginItem.Inputs != undefined ? this.renderInputs(this.props.pluginItem.Inputs) : "-"}
,
diff --git a/imports/ui/libraries/tab_Libraries.jsx b/imports/ui/libraries/tab_Libraries.jsx index 44d647f5..bc10b2c7 100644 --- a/imports/ui/libraries/tab_Libraries.jsx +++ b/imports/ui/libraries/tab_Libraries.jsx @@ -815,6 +815,9 @@ class App extends Component { +

Make sure to set a transcode cache folder

+

+

'Scan (Find new)' does 2 things - it removes files from the database which don't exist anymore, and adds newly detected files. Turn on 'Folder watch' to automate this process. New files will be scanned for every 30 seconds or so.

All new files will be added to both the transcode queues and the health check queues. If you're not interested in using one or the other, then just make sure not to fire up any workers for that respective queue.

diff --git a/imports/ui/libraries/tab_Libraries_Folder.jsx b/imports/ui/libraries/tab_Libraries_Folder.jsx index 56d154a8..c74cc73d 100644 --- a/imports/ui/libraries/tab_Libraries_Folder.jsx +++ b/imports/ui/libraries/tab_Libraries_Folder.jsx @@ -419,7 +419,7 @@ class Folder extends Component {

Enabled

-

id

+

id/Name

Stage

@@ -427,8 +427,6 @@ class Folder extends Component {

Operation

-

Name

-

Description

Inputs

@@ -1098,7 +1096,7 @@ class Folder extends Component { : 'unselectedNav' } > - Transcode + Transcode options

{ @@ -2055,7 +2053,7 @@ class Folder extends Component {

Schedule:

-

Server time:

+

Server clock:

diff --git a/imports/ui/transcoding/tab_Transcoding_Worker.jsx b/imports/ui/transcoding/tab_Transcoding_Worker.jsx index e17c7464..6a0eff0a 100644 --- a/imports/ui/transcoding/tab_Transcoding_Worker.jsx +++ b/imports/ui/transcoding/tab_Transcoding_Worker.jsx @@ -162,7 +162,8 @@ export default class Worker extends Component {
- + - +
100 ? '' : 'd-none'}> +
+ />

Frame: {this.props.worker.percentage / 100}

From bdb54524dc0895aafb22a15d1f54249399f23c92 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 04:25:48 +0000 Subject: [PATCH 27/31] Easier result horizontal scroll + worker UI changes --- imports/ui/searchResults.jsx | 4 +++- imports/ui/styles/main.scss | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/imports/ui/searchResults.jsx b/imports/ui/searchResults.jsx index c8fdd204..d919c8cc 100644 --- a/imports/ui/searchResults.jsx +++ b/imports/ui/searchResults.jsx @@ -211,6 +211,7 @@ class App extends Component { style: { color: "#e1e1e1", fontSize: "14px", + }, } } @@ -606,7 +607,7 @@ class App extends Component { } - return
+ return

@@ -667,6 +668,7 @@ class App extends Component { pageSizeOptions={[10, 100, 1000, 10000]} filterable={true} defaultFilterMethod={(filter, row) => filterMethod(filter, row)} + />
diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index 3a605394..c3f4bef0 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -411,18 +411,14 @@ input[type="text"] width: 100%; min-height:150px; - - - top:0; - bottom: 0; - left: 0; - right: 0; margin: auto; display: 'inline-block'; display: flex; flex-wrap: wrap; + align-items: center; + justify-content: center; } .workerItemsGrid{ @@ -1044,6 +1040,15 @@ table.sliderTable { table-layout: auto; white-space: normal; +} + +.searchResults{ + + word-wrap: break-word; + background:#373737; + display: inline-block; + + } table.searchResultsTable th { @@ -1068,7 +1073,6 @@ table.searchResultsTable td { display: grid; grid-template-columns: max-content max-content auto max-content max-content max-content 200px max-content max-content max-content; - //grid-template-columns:repeat( 11, max-content ); word-wrap: break-word; @@ -1241,6 +1245,8 @@ table.workerDetailTable td { color: black; vertical-align: text-top; + word-wrap: break-word; + word-break: break-all; } From 206371dd6027246e72714746dd564a2b122bae22 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 04:57:19 +0000 Subject: [PATCH 28/31] Use component instead of useEffect --- imports/ui/Local_Image.jsx | 47 ++++++++++++++----- .../plugins/pluginTemplates/PluginGuide.jsx | 6 +-- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/imports/ui/Local_Image.jsx b/imports/ui/Local_Image.jsx index 3b5def62..0ef7f07d 100644 --- a/imports/ui/Local_Image.jsx +++ b/imports/ui/Local_Image.jsx @@ -3,32 +3,55 @@ import React, { Component } from 'react'; import { GlobalSettingsDB } from '../api/tasks.js'; -export default LocalImage = (props) => { +export default class LocalImage extends Component { - const [link, setLink] = React.useState(''); + constructor(props) { + super(props); - React.useEffect(() => { + this.state = { + link: '', + } + + + } + + componentDidMount() { Meteor.subscribe('GlobalSettingsDB', () => { + this.setImgLink() + + }) + - const basePath = GlobalSettingsDB.find({}).fetch()[0].basePath; + } - var updatedLink = basePath + props.link - - setLink(updatedLink); - }); + setImgLink = () => { - }); + var basePath = GlobalSettingsDB.find({}).fetch()[0].basePath; - return ( + if (basePath != undefined) { + var updatedLink = basePath + this.props.link + } else { + var updatedLink = this.props.link + } - {props.alt - ); + this.setState({ + link: updatedLink + }) + console.log(updatedLink) + + } + + render() { + + return {this.props.alt + } } + diff --git a/imports/ui/plugins/pluginTemplates/PluginGuide.jsx b/imports/ui/plugins/pluginTemplates/PluginGuide.jsx index 01182012..3a6a9e67 100644 --- a/imports/ui/plugins/pluginTemplates/PluginGuide.jsx +++ b/imports/ui/plugins/pluginTemplates/PluginGuide.jsx @@ -67,9 +67,9 @@ class App extends Component {
-

- -

+
+ +

From 0a1a012b2f3228b34995442a83f18ec4fd3e09aa Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 05:17:56 +0000 Subject: [PATCH 29/31] 1.105 release notes --- imports/ui/App.jsx | 2 +- imports/ui/tab_Dev.jsx | 55 ++++++++++++++++++++++++++++++++--- imports/ui/tab_Dev_latest.jsx | 41 ++++++-------------------- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/imports/ui/App.jsx b/imports/ui/App.jsx index e47a6b7d..d1050f2c 100644 --- a/imports/ui/App.jsx +++ b/imports/ui/App.jsx @@ -44,7 +44,7 @@ export default AppRouter = () => { const [currentVersion, setVersion] = React.useState(''); - const [newVersion, setNewVersion] = React.useState(1.104); + const [newVersion, setNewVersion] = React.useState(1.105); diff --git a/imports/ui/tab_Dev.jsx b/imports/ui/tab_Dev.jsx index 626d4056..e2b656f7 100644 --- a/imports/ui/tab_Dev.jsx +++ b/imports/ui/tab_Dev.jsx @@ -55,11 +55,11 @@ export default class App extends Component {
-

+

-

+

Welcome to Tdarr Beta

@@ -86,9 +86,9 @@ export default class App extends Component {

-

+

-

+

@@ -127,6 +127,53 @@ export default class App extends Component { + +

Beta v1.104 release [7th Feb 2020]: + +
Changes: + +
-[New] Option to copy/paste plugin stack +
-[New] Option to rescan individual files +
-[New] Server time added to dashboard/schedule tab to help with schedule debugging +
+ +
-[New] Current plugins now referred to as 'Pre-processing' plugins +
-[New] onTranscodeError, onTranscodeSuccess availability added to Pre-processing plugins +
-[New]'Post-processing' plugins now possible - execute at very end of plugin stack + +
+ +
-[New] More information passed to plugins (custom inputs configurable from plugin stack UI, library settings) + +
+ +
-[New] Plugins can update/remove files in database +
-[New] Workers now show that a file is being copied after transcoding has finished +
-[New] Plugin stack progress added to workers. E.g (3/5) +
-[New] Cache cleaner run on startup +
-[New] HandBrakeCLI updated to 1.3.1 on Windows and tdarr_aio +
-[New] FFmpeg 4.2 is now default on tdarr_aio +
+ +
-[New][TESTING]Tdarr_Plugin_075a_Transcode_Customisable +
-[New][TESTING]Tdarr_Plugin_076a_re_order_audio_streams +
-[New][TESTING]Tdarr_Plugin_076b_re_order_subtitle_streams +
-[New][TESTING]Tdarr_Plugin_z18s_rename_files_based_on_codec +
-[New][TESTING]Tdarr_Plugin_43az_add_to_radarr +
-[New][TESTING]Tdarr_Plugin_e5c3_CnT_Keep_Preferred_Audio + + + +
+
-[Fix] Prevent file scanner crashing on certain files +
-[Fix] Prevent problem with one database collection stopping other collection backups + + +
+
+ +

+

Beta v1.103 release [27th Jan 2020]:
Changes: diff --git a/imports/ui/tab_Dev_latest.jsx b/imports/ui/tab_Dev_latest.jsx index c11733a2..e7e3c6f9 100644 --- a/imports/ui/tab_Dev_latest.jsx +++ b/imports/ui/tab_Dev_latest.jsx @@ -29,46 +29,23 @@ export default class App extends Component {

-

Beta v1.104 release [7th Feb 2020]: +

Beta v1.105 release [20th Feb 2020]:
Changes: -
-[New] Option to copy/paste plugin stack -
-[New] Option to rescan individual files -
-[New] Server time added to dashboard/schedule tab to help with schedule debugging -
- -
-[New] Current plugins now referred to as 'Pre-processing' plugins -
-[New] onTranscodeError, onTranscodeSuccess availability added to Pre-processing plugins -
-[New]'Post-processing' plugins now possible - execute at very end of plugin stack - -
- -
-[New] More information passed to plugins (custom inputs configurable from plugin stack UI, library settings) +
-[New] Categorised plugin browser +
-[New] Set backup limit (Options tab - default 30) +
-[New] Alert on Tdarr tab if libraries unchecked/out of schedule -
-
-[New] Plugins can update/remove files in database -
-[New] Workers now show that a file is being copied after transcoding has finished -
-[New] Plugin stack progress added to workers. E.g (3/5) -
-[New] Cache cleaner run on startup -
-[New] HandBrakeCLI updated to 1.3.1 on Windows and tdarr_aio -
-[New] FFmpeg 4.2 is now default on tdarr_aio -
+
-[Improvement] Git not required on host OS +
-[Improvement] File scanner fails more rarely +
-[Improvement] Snappier plugin stack UI +
-[Improvement] Numerous other UI changes (workers, schedule, plugin stack, search results, backups etc) -
-[New][TESTING]Tdarr_Plugin_075a_Transcode_Customisable -
-[New][TESTING]Tdarr_Plugin_076a_re_order_audio_streams -
-[New][TESTING]Tdarr_Plugin_076b_re_order_subtitle_streams -
-[New][TESTING]Tdarr_Plugin_z18s_rename_files_based_on_codec -
-[New][TESTING]Tdarr_Plugin_43az_add_to_radarr -
-[New][TESTING]Tdarr_Plugin_e5c3_CnT_Keep_Preferred_Audio - +
-[Fix] Local images show when using base path -
-
-[Fix] Prevent file scanner crashing on certain files -
-[Fix] Prevent problem with one database collection stopping other collection backups -

From d018bc54037a131288b8085a14caa54533ef6acc Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 07:28:28 +0000 Subject: [PATCH 30/31] Remove unneeded packages, fix pie label bug, small styling changes --- imports/ui/libraries/tab_Libraries_Folder.jsx | 3 +- imports/ui/styles/main.scss | 14 +- imports/ui/tab_Statistics.jsx | 6 + package-lock.json | 2327 +---------------- package.json | 10 +- 5 files changed, 42 insertions(+), 2318 deletions(-) diff --git a/imports/ui/libraries/tab_Libraries_Folder.jsx b/imports/ui/libraries/tab_Libraries_Folder.jsx index c74cc73d..038816cd 100644 --- a/imports/ui/libraries/tab_Libraries_Folder.jsx +++ b/imports/ui/libraries/tab_Libraries_Folder.jsx @@ -2087,9 +2087,8 @@ class Folder extends Component {

-

+ {this.renderScheduleBlocks()} -
diff --git a/imports/ui/styles/main.scss b/imports/ui/styles/main.scss index c3f4bef0..caa001a2 100644 --- a/imports/ui/styles/main.scss +++ b/imports/ui/styles/main.scss @@ -1071,7 +1071,7 @@ table.searchResultsTable td { .pluginStackGrid{ display: grid; - grid-template-columns: max-content max-content auto max-content max-content max-content 200px max-content max-content max-content; + grid-template-columns: max-content max-content max-content max-content max-content max-content auto max-content max-content max-content; word-wrap: break-word; @@ -1227,9 +1227,19 @@ table.searchResultsTable td { + + + table.scheduleTable { - width: 100%; + + background:#373737; + + left:2em; + position: absolute; + width:96%; + + } table.scheduleTable tr:hover { diff --git a/imports/ui/tab_Statistics.jsx b/imports/ui/tab_Statistics.jsx index 2e738856..694e8363 100644 --- a/imports/ui/tab_Statistics.jsx +++ b/imports/ui/tab_Statistics.jsx @@ -102,6 +102,7 @@ try{ { data.map((entry, index) => =2.2.7 <3" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "acorn": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", @@ -528,51 +480,11 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, "all": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/all/-/all-0.0.0.tgz", "integrity": "sha1-+yqnXUdZ1A457LsRj6vwzBH/VU8=" }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, "ansi-escapes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", @@ -603,55 +515,6 @@ "picomatch": "^2.0.4" } }, - "app-builder-bin": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz", - "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==", - "dev": true - }, - "app-builder-lib": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz", - "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.1.0", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "21.2.0", - "builder-util-runtime": "8.3.0", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.1.1", - "ejs": "^2.6.2", - "electron-publish": "21.2.0", - "fs-extra": "^8.1.0", - "hosted-git-info": "^2.7.1", - "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.2", - "js-yaml": "^3.13.1", - "lazy-val": "^1.0.4", - "minimatch": "^3.0.4", - "normalize-package-data": "^2.5.0", - "read-config-file": "5.0.0", - "sanitize-filename": "^1.6.2", - "semver": "^6.3.0", - "temp-file": "^3.3.4" - }, - "dependencies": { - "isbinaryfile": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.4.tgz", - "integrity": "sha512-pEutbN134CzcjlLS1myKX/uxNjwU5eBVSprvkpv3+3dqhBHUZLIWJQowC40w5c0Zf19vBY8mrZl88y5J4RAPbQ==", - "dev": true - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "archiver": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.11.0.tgz", @@ -732,15 +595,6 @@ } } }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -749,12 +603,6 @@ "sprintf-js": "~1.0.2" } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-includes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", @@ -774,11 +622,6 @@ "es-abstract": "^1.17.0-next.1" } }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -802,12 +645,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -929,81 +766,11 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - }, - "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - } - } - }, "bootstrap": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1026,36 +793,11 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "buffer-indexof-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", @@ -1066,100 +808,11 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, - "builder-util": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz", - "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@types/debug": "^4.1.4", - "app-builder-bin": "3.4.3", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.3.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^8.1.0", - "is-ci": "^2.0.0", - "js-yaml": "^3.13.1", - "source-map-support": "^0.5.13", - "stat-mode": "^0.3.0", - "temp-file": "^3.3.4" - } - }, - "builder-util-runtime": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", - "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "sax": "^1.2.4" - } - }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1218,34 +871,11 @@ "readdirp": "~3.3.0" } }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "classnames": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1259,61 +889,11 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "clsx": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1373,37 +953,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", @@ -1519,12 +1068,6 @@ } } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, "css-vendor": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", @@ -1539,15 +1082,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", @@ -1636,42 +1170,16 @@ "ms": "^2.1.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "decimal.js-light": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.0.tgz", "integrity": "sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg==" }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "deferential": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/deferential/-/deferential-1.0.0.tgz", @@ -1693,47 +1201,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dmg-builder": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz", - "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==", - "dev": true, - "requires": { - "app-builder-lib": "~21.2.0", - "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "fs-extra": "^8.1.0", - "iconv-lite": "^0.5.0", - "js-yaml": "^3.13.1", - "sanitize-filename": "^1.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", - "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1750,27 +1222,6 @@ "@babel/runtime": "^7.1.2" } }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -1779,12 +1230,6 @@ "readable-stream": "^2.0.2" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1794,104 +1239,6 @@ "safer-buffer": "^2.1.0" } }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-6.1.7.tgz", - "integrity": "sha512-QhBA/fcYJit2XJGkD2xEfxlWTtTaWYu7qkKVohtVWXpELFqkpel2DCDxet5BTo0qs8ukuZHxlQPnIonODnl2bw==", - "dev": true, - "requires": { - "@types/node": "^10.12.18", - "electron-download": "^4.1.0", - "extract-zip": "^1.0.3" - } - }, - "electron-builder": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.2.0.tgz", - "integrity": "sha512-x8EXrqFbAb2L3N22YlGar3dGh8vwptbB3ovo3OF6K7NTpcsmM2zEoJv7GhFyX73rNzSG2HaWpXwGAtOp2JWiEw==", - "dev": true, - "requires": { - "app-builder-lib": "21.2.0", - "bluebird-lst": "^1.0.9", - "builder-util": "21.2.0", - "builder-util-runtime": "8.3.0", - "chalk": "^2.4.2", - "dmg-builder": "21.2.0", - "fs-extra": "^8.1.0", - "is-ci": "^2.0.0", - "lazy-val": "^1.0.4", - "read-config-file": "5.0.0", - "sanitize-filename": "^1.6.2", - "update-notifier": "^3.0.1", - "yargs": "^13.3.0" - } - }, - "electron-download": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", - "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", - "dev": true, - "requires": { - "debug": "^3.0.0", - "env-paths": "^1.0.0", - "fs-extra": "^4.0.1", - "minimist": "^1.2.0", - "nugget": "^2.0.1", - "path-exists": "^3.0.0", - "rc": "^1.2.1", - "semver": "^5.4.1", - "sumchecker": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "electron-publish": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz", - "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==", - "dev": true, - "requires": { - "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "builder-util-runtime": "8.3.0", - "chalk": "^2.4.2", - "fs-extra": "^8.1.0", - "lazy-val": "^1.0.4", - "mime": "^2.4.4" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1905,12 +1252,6 @@ "once": "^1.4.0" } }, - "env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", - "dev": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2302,50 +1643,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "exiftool-vendored": { "version": "8.22.0", "resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-8.22.0.tgz", @@ -2385,35 +1682,6 @@ "tmp": "^0.0.33" } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2439,15 +1707,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "ffprobe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ffprobe/-/ffprobe-1.1.0.tgz", @@ -2540,11 +1799,6 @@ "mime-types": "^2.1.12" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2555,14 +1809,6 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2605,71 +1851,11 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2699,60 +1885,11 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", @@ -2795,17 +1932,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -2832,12 +1958,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" }, - "http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2866,14 +1986,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -2883,26 +1995,11 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2917,11 +2014,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, "inquirer": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", @@ -2993,15 +2085,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", @@ -3017,12 +2100,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3041,16 +2118,6 @@ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, "is-nan": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", @@ -3059,32 +2126,11 @@ "define-properties": "^1.1.1" } }, - "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -3098,12 +2144,6 @@ "has": "^1.0.3" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", @@ -3122,18 +2162,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3173,12 +2201,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -3204,14 +2226,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -3327,30 +2341,6 @@ "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true - }, "lazystream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", @@ -3459,22 +2449,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", @@ -3485,29 +2459,6 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.18.0.tgz", "integrity": "sha512-PDaY57G9k1yN46IRdt7M6I55yGd9NFBQYFvNsxLdOtapMfujJICPNdOIvCtYIq67W8hLdK3Zy8HJps+RRbIoAA==" }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "material-tabs": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/material-tabs/-/material-tabs-0.0.8.tgz", @@ -3524,108 +2475,6 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, "meteor-node-stubs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.4.1.tgz", @@ -4153,12 +3002,6 @@ } } }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, "mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", @@ -4177,12 +3020,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "mini-create-react-context": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", @@ -4201,28 +3038,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -4285,11 +3100,6 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, "nanoid": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.6.tgz", @@ -4305,105 +3115,11 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", - "requires": { - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^4.4.8", - "which": "1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-pre-gyp": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", - "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "node-schedule": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.2.tgz", @@ -4414,60 +3130,15 @@ "sorted-array-functions": "^1.0.0" } }, - "nodegit": { - "version": "0.26.4", - "resolved": "https://registry.npmjs.org/nodegit/-/nodegit-0.26.4.tgz", - "integrity": "sha512-HbGdk6zqI+3u3HhRLoOigut/Ns0Bm04WL0JPwsxJKalvpihOevrdTj7461wofANu/Vn5sdaq//VpeHLZTJQrlQ==", + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { - "fs-extra": "^7.0.0", - "json5": "^2.1.0", - "lodash": "^4.17.14", - "nan": "^2.14.0", - "node-gyp": "^4.0.0", - "node-pre-gyp": "^0.13.0", - "promisify-node": "~0.3.0", - "ramda": "^0.25.0", - "request-promise-native": "^1.0.5", - "tar-fs": "^1.16.3" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "nodegit-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz", - "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=", - "requires": { - "asap": "~2.0.3" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" }, "dependencies": { "semver": { @@ -4487,91 +3158,6 @@ "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nugget": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", - "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", - "dev": true, - "requires": { - "debug": "^2.1.3", - "minimist": "^1.1.0", - "pretty-bytes": "^1.0.2", - "progress-stream": "^1.1.0", - "request": "^2.45.0", - "single-line-log": "^1.1.2", - "throttleit": "0.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -4665,11 +3251,6 @@ "word-wrap": "~1.2.3" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -4680,27 +3261,6 @@ "resolved": "https://registry.npmjs.org/os-utils/-/os-utils-0.0.14.tgz", "integrity": "sha1-KeURaXsZgrjGJ3Ihdf45eX72QVY=" }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4722,18 +3282,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4770,12 +3318,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -4806,12 +3348,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, "performance-now": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", @@ -4827,21 +3363,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -4860,12 +3381,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -4879,24 +3394,6 @@ "fast-diff": "^1.1.2" } }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } - } - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4907,75 +3404,6 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, - "progress-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", - "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "dev": true, - "requires": { - "speedometer": "~0.1.2", - "through2": "~0.2.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", - "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "promisify-node": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.3.0.tgz", - "integrity": "sha1-tLVaz5D6p9K4uQyjlomQhsAwYM8=", - "requires": { - "nodegit-promise": "~4.0.0" - } - }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -4995,26 +3423,11 @@ "warning": "^4.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5040,29 +3453,6 @@ } } }, - "ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, "react": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", @@ -5378,20 +3768,6 @@ "resolved": "https://registry.npmjs.org/reactjs-popup/-/reactjs-popup-1.5.0.tgz", "integrity": "sha512-9uoxUAcUomnNoBtdYXBmgsF4w46llsogE3tOvLb5IkR5MMrD6UZJK20ip9kDKXCYubSxNkdfQKqSb/c95rf/qA==" }, - "read-config-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", - "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", - "dev": true, - "requires": { - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0", - "fs-extra": "^8.1.0", - "js-yaml": "^3.13.1", - "json5": "^2.1.0", - "lazy-val": "^1.0.4" - } - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -5484,16 +3860,6 @@ "resolve": "^1.1.6" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -5538,37 +3904,10 @@ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, - "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -5577,7 +3916,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -5587,7 +3926,7 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, @@ -5605,45 +3944,8 @@ "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", "requires": { "throttleit": "^1.0.0" - }, - "dependencies": { - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - } } }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -5688,15 +3990,6 @@ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5740,15 +4033,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -5758,11 +4042,6 @@ "sparse-bitfield": "^3.0.3" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "scheduler": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", @@ -5777,28 +4056,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5854,60 +4111,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "simple-git": { - "version": "1.131.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.131.0.tgz", - "integrity": "sha512-z/art7YYtmPnnLItT/j+nKwJt6ap6nHZ4D8sYo9PdCKK/ug56SN6m/evfxJk7uDV3e9JuCa8qIyDU2P3cxmiNQ==", - "requires": { - "debug": "^4.0.1" - } - }, - "single-line-log": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", - "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -5935,24 +4138,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -5990,12 +4175,6 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, - "speedometer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6017,17 +4196,6 @@ "tweetnacl": "~0.14.0" } }, - "stat-mode": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", - "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -6114,60 +4282,11 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } - } - }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, - "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6209,74 +4328,15 @@ } } }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp-file": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.6.tgz", - "integrity": "sha512-7TPldi8QJqRlPIF/Y33mVvo8+xDfi6+aVTCK4CrCaLqCoaOnVtf3SA4hCU0T5nhYDdOC7erw7o2uWfvijlk4Ug==", - "dev": true, - "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^8.1.0" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throttleit": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" }, "through": { "version": "2.3.8", @@ -6301,22 +4361,11 @@ "os-tmpdir": "~1.0.2" } }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6331,19 +4380,12 @@ "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "traverse": { @@ -6351,21 +4393,6 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -6397,12 +4424,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "tz-lookup": { "version": "6.1.24", "resolved": "https://registry.npmjs.org/tz-lookup/-/tz-lookup-6.1.24.tgz", @@ -6419,15 +4440,6 @@ "react-lifecycles-compat": "^3.0.4" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -6450,26 +4462,6 @@ "setimmediate": "~1.0.4" } }, - "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", - "dev": true, - "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -6478,26 +4470,11 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6561,132 +4538,11 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6700,39 +4556,11 @@ "mkdirp": "^0.5.1" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "yaml": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", @@ -6741,119 +4569,6 @@ "@babel/runtime": "^7.6.3" } }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, "zip-folder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/zip-folder/-/zip-folder-1.0.0.tgz", diff --git a/package.json b/package.json index a50863d4..9943c3d5 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha", "visualize": "meteor --production --extra-packages bundle-visualizer", "lint": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}}", - "lint:fix": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}} --fix", - "desktop": "meteor-desktop" + "lint:fix": "eslint {imports,tests}/**/* --ext .{{t,j}s{,x}} --fix" }, "dependencies": { "@babel/runtime": "^7.8.4", @@ -46,7 +45,6 @@ "meteor-node-stubs": "^0.4.1", "mongodb": "^3.5.2", "node-schedule": "^1.3.2", - "nodegit": "^0.26.4", "os-utils": "0.0.14", "prettier": "^1.19.1", "react": "^16.12.0", @@ -67,11 +65,11 @@ "react-toggle-button": "^2.2.0", "reactjs-popup": "^1.5.0", "recharts": "^1.8.5", + "request": "^2.88.2", "request-progress": "^3.0.0", "rimraf": "^3.0.1", "shelljs": "^0.8.3", "shortid": "^2.2.15", - "simple-git": "^1.131.0", "unzipper": "^0.10.8", "zip-folder": "^1.0.0" }, @@ -81,9 +79,5 @@ "server": "server/main.js" }, "testModule": "tests/main.js" - }, - "devDependencies": { - "electron": "6.1.7", - "electron-builder": "21.2.0" } } From 8d988df7fbd36494a6bf27c73cd9465750d6e617 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Thu, 20 Feb 2020 07:46:48 +0000 Subject: [PATCH 31/31] package updates --- package-lock.json | 44 +++++++++++++++++++------------------------- package.json | 10 +++++----- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a237ca4..abd2aa40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -297,20 +297,19 @@ "optional": true }, "@material-ui/core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.1.tgz", - "integrity": "sha512-wehQI0ahHDsZjK+uA8Q5Cs1K1/1HXYe2icwTqARaRCt7d9bTp0bJN/C9TLe/+sRWfRIkx6OIk7ABSJT1jBqxRg==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.3.tgz", + "integrity": "sha512-EQrhN7XHdCfBCMiCTHmiHSn/H1tj2qCt5W/kSDhr1gaYAtBTTiQ29j2xR1NcHT1siVQqAtgIkPephqbTEgQLwA==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.9.0", - "@material-ui/system": "^4.9.1", + "@material-ui/system": "^4.9.3", "@material-ui/types": "^5.0.0", "@material-ui/utils": "^4.7.1", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", "convert-css-length": "^2.0.1", "hoist-non-react-statics": "^3.3.2", - "normalize-scroll-left": "^0.2.0", "popper.js": "^1.14.1", "prop-types": "^15.7.2", "react-is": "^16.8.0", @@ -351,9 +350,9 @@ } }, "@material-ui/system": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.1.tgz", - "integrity": "sha512-CLrJK2aKNWNwruGVTRf+rLz96P4jmozpY2UaCE6hBTa1oGsQ396YXOQQABQ4c0igawmdyf5iQb0zs9j5zsAf1w==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.3.tgz", + "integrity": "sha512-DBGsTKYrLlFpHG8BUp0X6ZpvaOzef+GhSwn/8DwVTXUdHitphaPQoL9xucrI8X9MTBo//El+7nylko7lo7eJIw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.7.1", @@ -1563,9 +1562,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz", - "integrity": "sha512-gLKCa52G4ee7uXzdLiorca7JIQZPPXRAQDXV83J4bUEeUuc5pIEyZYAZ45Xnxe5IuupxEqHS+hUhSLIimK1EMw==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.4.0.tgz", + "integrity": "sha512-bH5DOCP6WpuOqNaux2BlaDCrSgv8s5BitP90bTgtZ1ZsRn2bdIfeMDY5F2RnJVnyKDy6KRQRDbipPLZ1y77QtQ==" }, "eslint-plugin-simple-import-sort": { "version": "4.0.0", @@ -2050,9 +2049,9 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" }, "interweave": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/interweave/-/interweave-12.2.0.tgz", - "integrity": "sha512-3EZv6ipccU1NvhjVncupH6PcFjKoNDuFEJ4mKMaImBqwZHXjE9OpU2rTC2Ac3g8mXqKACRrhwv3HAtTHqiEN6A==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/interweave/-/interweave-12.2.1.tgz", + "integrity": "sha512-bwEM42pds2FopRUtNLbhsPUqBNQIAfa/mCBQBpTG4/oR3g7iHeKzHSV+0hrJjqaZUdCtF5wVTtyWxtImM3fHNw==", "requires": { "@types/react": "*", "escape-html": "^1.0.3", @@ -3067,9 +3066,9 @@ } }, "mongodb": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.2.tgz", - "integrity": "sha512-Lxt4th2tK2MxmkDBR5cMik+xEnkvhwg0BC5kGcHm9RBwaNEsrIryvV5istGXOHbnif5KslMpY1FbX6YbGJ/Trg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.3.tgz", + "integrity": "sha512-II7P7A3XUdPiXRgcN96qIoRa1oesM6qLNZkzfPluNZjVkgQk3jnQwOT6/uDk4USRDTTLjNFw2vwfmbRGTA7msg==", "requires": { "bl": "^2.2.0", "bson": "^1.1.1", @@ -3153,11 +3152,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "normalize-scroll-left": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", - "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -4000,9 +3994,9 @@ } }, "rimraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.1.tgz", - "integrity": "sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } diff --git a/package.json b/package.json index 9943c3d5..b203639e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@babel/runtime": "^7.8.4", "@emotion/core": "^10.0.27", "@ffmpeg-installer/ffmpeg": "^1.0.20", - "@material-ui/core": "^4.9.1", + "@material-ui/core": "^4.9.3", "@trendmicro/react-sidenav": "^0.4.5", "all": "0.0.0", "babel-eslint": "^10.0.3", @@ -31,7 +31,7 @@ "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "^7.18.3", - "eslint-plugin-react-hooks": "^2.3.0", + "eslint-plugin-react-hooks": "^2.4.0", "eslint-plugin-simple-import-sort": "^4.0.0", "eslint-plugin-standard": "^4.0.1", "exiftool-vendored": "^8.22.0", @@ -39,11 +39,11 @@ "ffprobe-static": "^3.0.0", "fs-extra": "^8.1.0", "import-fresh": "^3.2.1", - "interweave": "^12.2.0", + "interweave": "^12.2.1", "is-docker": "^2.0.0", "material-tabs": "0.0.8", "meteor-node-stubs": "^0.4.1", - "mongodb": "^3.5.2", + "mongodb": "^3.5.3", "node-schedule": "^1.3.2", "os-utils": "0.0.14", "prettier": "^1.19.1", @@ -67,7 +67,7 @@ "recharts": "^1.8.5", "request": "^2.88.2", "request-progress": "^3.0.0", - "rimraf": "^3.0.1", + "rimraf": "^3.0.2", "shelljs": "^0.8.3", "shortid": "^2.2.15", "unzipper": "^0.10.8",