Merge branch 'main' of https://github.com/stagehacks/Cue-View
@@ -1,11 +1,7 @@
|
||||
name: release
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- '**/README.md'
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Cue View</title>
|
||||
<link rel="stylesheet" href="src/index.css" />
|
||||
<link rel="stylesheet" href="src/assets/css/index.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="main">
|
||||
@@ -22,12 +22,14 @@
|
||||
<div id="device-tools">
|
||||
<select class="left button" id="add-device-button" title="Add Device..."></select>
|
||||
<button class="left" id="search-button" title="Search network for devices">
|
||||
<img src="src/img/outline_search_white_18dp.png" />
|
||||
<img src="src/assets/img/outline_search_white_18dp.png" />
|
||||
</button>
|
||||
<button class="left" id="refresh-device-button" title="Refresh Device" disabled>
|
||||
<img src="src/img/outline_refresh_white_18dp.png" />
|
||||
<img src="src/assets/img/outline_refresh_white_18dp.png" />
|
||||
</button>
|
||||
<button class="right" id="network-info-button">
|
||||
<img src="src/assets/img/outline_info_white_18dp.png" />
|
||||
</button>
|
||||
<button class="right" id="network-info-button"><img src="src/img/outline_info_white_18dp.png" /></button>
|
||||
</div>
|
||||
|
||||
<div id="device-settings">
|
||||
|
||||
@@ -4,6 +4,7 @@ const path = require('path');
|
||||
|
||||
const isMac = process.platform === 'darwin';
|
||||
const isWin = process.platform === 'win32';
|
||||
const isLinux = process.platform === 'linux';
|
||||
|
||||
let autoUpdate = false;
|
||||
let manualUpdateCheck = false;
|
||||
@@ -192,6 +193,10 @@ const createWindow = () => {
|
||||
mainWindow = new BrowserWindow(windowWin);
|
||||
}
|
||||
|
||||
if (isLinux) {
|
||||
mainWindow.setIcon(path.join(__dirname, 'src', 'assets', 'img', 'icon.png'));
|
||||
}
|
||||
|
||||
mainWindow.loadFile('index.html');
|
||||
|
||||
mainWindow.on('ready-to-show', () => {
|
||||
|
||||
@@ -21,18 +21,18 @@
|
||||
"repository": "https://github.com/stagehacks/Cue-View",
|
||||
"devDependencies": {
|
||||
"@electron/notarize": "^1.2.3",
|
||||
"electron": "^21.3.0",
|
||||
"electron": "^21.3.3",
|
||||
"electron-builder": "^23.6.0",
|
||||
"eslint": "^8.27.0",
|
||||
"eslint": "^8.31.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-config-prettier": "^8.6.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"prettier": "^2.7.1"
|
||||
"prettier": "^2.8.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"bonjour": "^3.5.0",
|
||||
"electron-updater": "^5.3.0",
|
||||
"lodash": "^4.17.20",
|
||||
"lodash": "^4.17.21",
|
||||
"md5": "^2.3.0",
|
||||
"netmask": "^2.0.2",
|
||||
"osc": "^2.4.3",
|
||||
@@ -40,12 +40,12 @@
|
||||
},
|
||||
"build": {
|
||||
"appId": "com.stagehacks.cueview",
|
||||
"icon": "./src/img/",
|
||||
"icon": "src/assets/img/",
|
||||
"artifactName": "${name}.${os}.v${version}.${ext}",
|
||||
"afterSign": "notarize.js",
|
||||
"mac": {
|
||||
"category": "Utilities",
|
||||
"icon": "./src/img/icon.icns",
|
||||
"icon": "src/assets/img/icon.icns",
|
||||
"hardenedRuntime": true,
|
||||
"electronLanguages": [
|
||||
"en"
|
||||
@@ -56,7 +56,7 @@
|
||||
},
|
||||
"win": {
|
||||
"target": "NSIS",
|
||||
"icon": "./src/img/icon.ico",
|
||||
"icon": "src/assets/img/icon.ico",
|
||||
"publish": [
|
||||
"github"
|
||||
]
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
const _ = require('lodash');
|
||||
|
||||
exports.config = {
|
||||
defaultName: 'Art-Net',
|
||||
connectionType: 'UDPsocket',
|
||||
@@ -43,7 +41,7 @@ exports.data = function data(_device, buf) {
|
||||
universe.slots = buf.slice(18);
|
||||
device.data.ip = device.addresses[0];
|
||||
|
||||
if (!_.includes(device.data.orderedUniverses, universeIndex)) {
|
||||
if (!device.data.orderedUniverses.includes(universeIndex)) {
|
||||
device.data.orderedUniverses.push(universeIndex);
|
||||
device.data.orderedUniverses.sort();
|
||||
universe.slotElems = [];
|
||||
@@ -77,10 +75,10 @@ exports.update = function update(_device, _document, updateType, updateData) {
|
||||
|
||||
if ($elem && data.universe.slotElemsSet) {
|
||||
for (let i = 0; i < 512; i++) {
|
||||
data.universe.slotElems[i].innerText = data.universe.slots[i];
|
||||
data.universe.slotElems[i].textContent = data.universe.slots[i];
|
||||
}
|
||||
|
||||
document.getElementById(`universe-${data.universeIndex}-sequence`).innerText = data.universe.sequence;
|
||||
document.getElementById(`universe-${data.universeIndex}-sequence`).textContent = data.universe.sequence;
|
||||
} else {
|
||||
device.draw();
|
||||
device.update('elementCache');
|
||||
|
||||
@@ -10,13 +10,10 @@ exports.config = {
|
||||
mayChangePort: false,
|
||||
searchOptions: {
|
||||
type: 'TCPport',
|
||||
searchBuffer: Buffer.from(
|
||||
'\xc0/eos/ping\x00\x00\x2c\x00\x00\x00\xc0',
|
||||
'ascii'
|
||||
),
|
||||
searchBuffer: Buffer.from('\xc0/eos/ping\x00\x00\x2c\x00\x00\x00\xc0', 'ascii'),
|
||||
testPort: 3032,
|
||||
validateResponse(msg, info) {
|
||||
return msg.toString().indexOf('/eos/out');
|
||||
return msg.toString().includes('/eos/out');
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -43,38 +40,19 @@ exports.data = function data(_device, osc) {
|
||||
for (let i = 0; i < osc.args[0]; i++) {
|
||||
device.send(`/eos/get/cuelist/index/${i}`);
|
||||
}
|
||||
} else if (
|
||||
match(addressParts, ['eos', 'out', 'get', 'cuelist', '*', 'list', '*', '*'])
|
||||
) {
|
||||
} else if (match(addressParts, ['eos', 'out', 'get', 'cuelist', '*', 'list', '*', '*'])) {
|
||||
device.data.EOS.cueLists[addressParts[4]] = {};
|
||||
device.send(`/eos/get/cue/${addressParts[4]}/count`);
|
||||
} else if (match(addressParts, ['eos', 'out', 'get', 'cue', '*', 'count'])) {
|
||||
for (let i = 0; i < osc.args[0]; i++) {
|
||||
device.send(`/eos/get/cue/${addressParts[4]}/index/${i}`);
|
||||
}
|
||||
} else if (
|
||||
match(addressParts, [
|
||||
'eos',
|
||||
'out',
|
||||
'get',
|
||||
'cue',
|
||||
'*',
|
||||
'*',
|
||||
'*',
|
||||
'list',
|
||||
'*',
|
||||
'*',
|
||||
])
|
||||
) {
|
||||
} else if (match(addressParts, ['eos', 'out', 'get', 'cue', '*', '*', '*', 'list', '*', '*'])) {
|
||||
this.deviceInfoUpdate(device, 'status', 'ok');
|
||||
if (
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]] === undefined
|
||||
) {
|
||||
if (device.data.EOS.cueLists[addressParts[4]][addressParts[5]] === undefined) {
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]] = {};
|
||||
}
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]][
|
||||
addressParts[6]
|
||||
] = new Cue(osc.args);
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]][addressParts[6]] = new Cue(osc.args);
|
||||
|
||||
device.update('cueData', {
|
||||
cue: device.data.EOS.cueLists[addressParts[4]][addressParts[5]],
|
||||
@@ -86,36 +64,17 @@ exports.data = function data(_device, osc) {
|
||||
// So: we should fetch all the parts of a cue somehow every time there's an update to a cue.
|
||||
delete device.data.EOS.cueLists[addressParts[4]][addressParts[5]];
|
||||
device.draw();
|
||||
} else if (
|
||||
match(addressParts, [
|
||||
'eos',
|
||||
'out',
|
||||
'get',
|
||||
'cue',
|
||||
'*',
|
||||
'*',
|
||||
'*',
|
||||
'actions',
|
||||
'list',
|
||||
'*',
|
||||
'*',
|
||||
])
|
||||
) {
|
||||
} else if (match(addressParts, ['eos', 'out', 'get', 'cue', '*', '*', '*', 'actions', 'list', '*', '*'])) {
|
||||
if (osc.args.length === 3) {
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]][0].extLinks =
|
||||
osc.args[2];
|
||||
device.data.EOS.cueLists[addressParts[4]][addressParts[5]][0].extLinks = osc.args[2];
|
||||
}
|
||||
} else if (
|
||||
match(addressParts, ['eos', 'out', 'event', 'cue', '*', '*', 'fire'])
|
||||
) {
|
||||
} else if (match(addressParts, ['eos', 'out', 'event', 'cue', '*', '*', 'fire'])) {
|
||||
device.data.EOS.activeCue = addressParts[5];
|
||||
device.draw();
|
||||
device.update('activeCue', {
|
||||
uid: device.data.EOS.cueLists[addressParts[4]][addressParts[5]][0].uid,
|
||||
});
|
||||
} else if (
|
||||
match(addressParts, ['eos', 'out', 'notify', 'cue', '*', '*', '*', '*'])
|
||||
) {
|
||||
} else if (match(addressParts, ['eos', 'out', 'notify', 'cue', '*', '*', '*', '*'])) {
|
||||
const cueList = addressParts[4];
|
||||
const cueNumber = osc.args[1];
|
||||
device.send(`/eos/get/cue/${cueList}/${cueNumber}`);
|
||||
@@ -126,9 +85,7 @@ exports.data = function data(_device, osc) {
|
||||
}
|
||||
};
|
||||
|
||||
const cueTemplate = _.template(
|
||||
fs.readFileSync(path.join(__dirname, `cue.ejs`))
|
||||
);
|
||||
const cueTemplate = _.template(fs.readFileSync(path.join(__dirname, `cue.ejs`)));
|
||||
|
||||
exports.update = function update(device, doc, updateType, data) {
|
||||
if (updateType === 'cueData') {
|
||||
|
||||
@@ -13,7 +13,7 @@ exports.config = {
|
||||
devicePort: 4352,
|
||||
listenPort: 4352,
|
||||
validateResponse(msg, info) {
|
||||
return msg.toString().indexOf('%2ACKN=') >= 0;
|
||||
return msg.toString().includes('%2ACKN=');
|
||||
},
|
||||
},
|
||||
fields: [
|
||||
|
||||
@@ -93,18 +93,18 @@ exports.update = function update(_device, doc, updateType, updateData) {
|
||||
if ($elem && data.universe.slotElemsSet) {
|
||||
if (data.universe.priority > 0) {
|
||||
for (let i = 0; i < 512; i++) {
|
||||
data.universe.slotElems[i].innerText = data.universe.slots[i];
|
||||
data.universe.slotElems[i].textContent = data.universe.slots[i];
|
||||
}
|
||||
|
||||
const $code = doc.getElementById(`universe-${data.universeIndex}-code`);
|
||||
if (data.startCode === 0xdd) {
|
||||
$code.innerText = 'Net3';
|
||||
$code.textContent = 'Net3';
|
||||
} else if (data.startCode === 0x17) {
|
||||
$code.innerText = 'Text';
|
||||
$code.textContent = 'Text';
|
||||
} else if (data.startCode === 0xcf) {
|
||||
$code.innerText = 'SIP';
|
||||
$code.textContent = 'SIP';
|
||||
} else if (data.startCode === 0xcc) {
|
||||
$code.innerText = 'RDM';
|
||||
$code.textContent = 'RDM';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -10,9 +10,9 @@ exports.config = {
|
||||
searchOptions: {
|
||||
type: 'TCPport',
|
||||
searchBuffer: Buffer.from('< GET DEVICE_ID >', 'ascii'),
|
||||
testPort: 3032,
|
||||
testPort: 2202,
|
||||
validateResponse(msg, info) {
|
||||
return msg.toString().indexOf('DEVICE_ID');
|
||||
return msg.toString().includes('DEVICE_ID');
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ exports.config = {
|
||||
devicePort: 10023,
|
||||
listenPort: 0,
|
||||
validateResponse(msg, info) {
|
||||
return msg.toString().indexOf('/xinfo') === 0;
|
||||
return msg.toString().includes('/xinfo') === 0;
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -69,9 +69,7 @@ exports.data = function data(device, oscData) {
|
||||
for (let i = 0; i < 70; i++) {
|
||||
if (i >= 0 && i < 32) {
|
||||
// These are channel meters
|
||||
d.data.X32.inputs.channels[i].meter = Console.getBehringerDB(
|
||||
buf.readFloatLE(offset)
|
||||
);
|
||||
d.data.X32.inputs.channels[i].meter = Console.getBehringerDB(buf.readFloatLE(offset));
|
||||
}
|
||||
|
||||
offset += 4;
|
||||
@@ -84,14 +82,10 @@ exports.data = function data(device, oscData) {
|
||||
for (let i = 0; i < 49; i++) {
|
||||
if (i === 22) {
|
||||
// STEREO LEFT METER
|
||||
d.data.X32.main.stereo.meter[0] = Console.getBehringerDB(
|
||||
buf.readFloatLE(offset)
|
||||
);
|
||||
d.data.X32.main.stereo.meter[0] = Console.getBehringerDB(buf.readFloatLE(offset));
|
||||
} else if (i === 23) {
|
||||
// STEREO RIGHT METER
|
||||
d.data.X32.main.stereo.meter[1] = Console.getBehringerDB(
|
||||
buf.readFloatLE(offset)
|
||||
);
|
||||
d.data.X32.main.stereo.meter[1] = Console.getBehringerDB(buf.readFloatLE(offset));
|
||||
}
|
||||
offset += 4;
|
||||
}
|
||||
@@ -101,9 +95,7 @@ exports.data = function data(device, oscData) {
|
||||
if (addr[0] === 'ch') {
|
||||
const channel = Number(addr[1]);
|
||||
d.data.X32.inputs.channels[channel - 1].fader = oscData.args[0];
|
||||
d.data.X32.inputs.channels[channel - 1].faderDB = Console.getBehringerDB(
|
||||
oscData.args[0]
|
||||
);
|
||||
d.data.X32.inputs.channels[channel - 1].faderDB = Console.getBehringerDB(oscData.args[0]);
|
||||
} else if (addr[0] === 'main') {
|
||||
d.data.X32.main.stereo.fader = oscData.args[0];
|
||||
d.data.X32.main.stereo.faderDB = Console.getBehringerDB(oscData.args[0]);
|
||||
|
||||
@@ -10,7 +10,7 @@ exports.config = {
|
||||
devicePort: 10024,
|
||||
listenPort: 0,
|
||||
validateResponse(msg, info) {
|
||||
return msg.toString().indexOf('/xinfo') === 0;
|
||||
return msg.toString().startWith('/xinfo');
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -74,31 +74,25 @@ exports.data = function data(device, buf) {
|
||||
d.send('/lr/mix/on\x00\x00\x00\x00');
|
||||
|
||||
for (let i = 0; i <= 32; i++) {
|
||||
d.send(
|
||||
Buffer.from(
|
||||
`/ch/${i.toString().padStart(2, '0')}/config/name\x00\x00\x00\x00`
|
||||
)
|
||||
);
|
||||
d.send(Buffer.from(`/ch/${i.toString().padStart(2, '0')}/config/name\x00\x00\x00\x00`));
|
||||
}
|
||||
d.draw();
|
||||
} else if (msg[0] === '/meters/0') {
|
||||
// console.log(msg)
|
||||
} else if (msg[0].indexOf('/mix/fader') >= 0) {
|
||||
} else if (msg[0].includes('/mix/fader')) {
|
||||
const addr = parseAddress(msg[0]);
|
||||
const channel = Number(addr[1]);
|
||||
|
||||
if (addr[0] === 'ch') {
|
||||
d.data.channelFaders[channel - 1] = buf.readFloatBE(24);
|
||||
d.data.channelFadersDB[channel - 1] = convertToDBTheBehringerWay(
|
||||
buf.readFloatBE(24)
|
||||
);
|
||||
d.data.channelFadersDB[channel - 1] = convertToDBTheBehringerWay(buf.readFloatBE(24));
|
||||
} else if (addr[0] === 'lr') {
|
||||
d.data.stereoFader = buf.readFloatBE(20);
|
||||
d.data.stereoFaderDB = convertToDBTheBehringerWay(buf.readFloatBE(20));
|
||||
}
|
||||
|
||||
d.draw();
|
||||
} else if (msg[0].indexOf('/mix/on') >= 0) {
|
||||
} else if (msg[0].includes('/mix/on')) {
|
||||
const addr = parseAddress(msg[0]);
|
||||
const channel = Number(addr[1]);
|
||||
|
||||
@@ -109,13 +103,13 @@ exports.data = function data(device, buf) {
|
||||
}
|
||||
device.draw();
|
||||
device.send(`/ch/${addr[1]}/mix/fader\x00\x00\x00\x00`);
|
||||
} else if (msg[0].indexOf('/config/name') > 0) {
|
||||
} else if (msg[0].includes('/config/name')) {
|
||||
const addr = parseAddress(msg[0]);
|
||||
const channel = Number(addr[1]);
|
||||
d.data.channelNames[channel - 1] = msg[4];
|
||||
d.draw();
|
||||
d.send(`/ch/${addr[1]}/config/color\x00\x00\x00\x00`);
|
||||
} else if (msg[0].indexOf('/config/color') > 0) {
|
||||
} else if (msg[0].includes('/config/color')) {
|
||||
const addr = parseAddress(msg[0]);
|
||||
const channel = Number(addr[1]);
|
||||
d.data.channelColors[channel - 1] = buf.readInt8(27);
|
||||
|
||||
@@ -317,8 +317,8 @@ select.button:focus {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('img/Material Icons'), local('img/MaterialIcons-Regular'),
|
||||
url(img/MaterialIcons-Regular.ttf) format('truetype');
|
||||
src: local('Material Icons'), local('MaterialIcons-Regular'),
|
||||
url(../font/MaterialIcons-Regular.ttf) format('truetype');
|
||||
}
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
|
Before Width: | Height: | Size: 401 KiB After Width: | Height: | Size: 401 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
|
Before Width: | Height: | Size: 138 B After Width: | Height: | Size: 138 B |
|
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |
|
Before Width: | Height: | Size: 212 B After Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 171 B After Width: | Height: | Size: 171 B |
|
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |
|
Before Width: | Height: | Size: 415 B After Width: | Height: | Size: 415 B |
|
Before Width: | Height: | Size: 383 B After Width: | Height: | Size: 383 B |
@@ -118,7 +118,7 @@ function searchBonjour(pluginType, pluginConfig) {
|
||||
bonjour.find({ type: pluginConfig.searchOptions.bonjourName }, (e) => {
|
||||
const validAddresses = [];
|
||||
e.addresses.forEach((address) => {
|
||||
if (address.indexOf(':') === -1) {
|
||||
if (!address.includes(':')) {
|
||||
validAddresses.push(address);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -33,7 +33,7 @@ function drawDeviceFrame(id) {
|
||||
str += '::-webkit-scrollbar-button {display:none;}';
|
||||
str += 'body{visibility: hidden;}';
|
||||
str += '</style>';
|
||||
str += "<link href='src/defaultPlugin.css' rel='stylesheet' type='text/css'>";
|
||||
str += "<link href='src/assets/css/plugin_default.css' rel='stylesheet' type='text/css'>";
|
||||
str += '</head><body>';
|
||||
|
||||
str += generateBodyHTML(d);
|
||||
@@ -144,7 +144,7 @@ function switchDevice(id) {
|
||||
if (pinnedDevices.length > 0) {
|
||||
cols += pinnedDevices.length;
|
||||
}
|
||||
if (pinnedDevices.indexOf(activeDevice) >= 0 || id === undefined) {
|
||||
if (pinnedDevices.includes(activeDevice) || id === undefined) {
|
||||
cols--;
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ function switchDevice(id) {
|
||||
let $deviceWrapper = document.getElementById(`device-${i}`);
|
||||
|
||||
if (!$deviceWrapper) {
|
||||
const html = `<div class="col device-wrapper" id="device-${i}"><img id="device-${i}-pinned" class="device-pin" src="src/img/outline_push_pin_white_18dp.png"><iframe id="device-${i}-draw-area" class="draw-area"></iframe></div>`;
|
||||
const html = `<div class="col device-wrapper" id="device-${i}"><img id="device-${i}-pinned" class="device-pin" src="src/assets/img/outline_push_pin_white_18dp.png"><iframe id="device-${i}-draw-area" class="draw-area"></iframe></div>`;
|
||||
document.getElementById('all-devices').insertAdjacentHTML('afterbegin', html);
|
||||
|
||||
$deviceWrapper = document.getElementById(`device-${i}`);
|
||||
@@ -229,7 +229,7 @@ module.exports.pinActiveDevice = function pinActiveDevice() {
|
||||
if (activeDevice === undefined) {
|
||||
return;
|
||||
}
|
||||
if (pinnedDevices.indexOf(DEVICE.all[activeDevice.id]) === -1) {
|
||||
if (!pinnedDevices.includes(DEVICE.all[activeDevice.id])) {
|
||||
pinnedDevices.push(DEVICE.all[activeDevice.id]);
|
||||
}
|
||||
DEVICE.changeActivePinIndex(true);
|
||||
|
||||