mirror of
https://github.com/streamwall/streamwall.git
synced 2025-12-06 01:45:37 -05:00
Add TOML configuration and reorganize param names
This commit is contained in:
16
README.md
16
README.md
@@ -29,6 +29,22 @@ Under the hood, think of Streamwall as a specialized web browser for mosaicing v
|
|||||||
3. Use the browser window to load or control streams. The initial list will be populated from https://woke.net/#streams
|
3. Use the browser window to load or control streams. The initial list will be populated from https://woke.net/#streams
|
||||||
4. If you enter the same stream code in multiple cells, it will merge them together for a larger stream.
|
4. If you enter the same stream code in multiple cells, it will merge them together for a larger stream.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Streamwall has a growing number of configuration options. To get a summary run:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm start -- --help
|
||||||
|
```
|
||||||
|
|
||||||
|
For long-term installations, it's recommended to put your options into a configuration file. To use a config file, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm start -- --config="../streamwall.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
See `config.example.toml` for an example.
|
||||||
|
|
||||||
## Hotkeys
|
## Hotkeys
|
||||||
|
|
||||||
The following hotkeys are available with the "control" webpage focused:
|
The following hotkeys are available with the "control" webpage focused:
|
||||||
|
|||||||
32
example.config.toml
Normal file
32
example.config.toml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Set the background color (useful for chroma-keying)
|
||||||
|
#background-color = "#0f0"
|
||||||
|
|
||||||
|
[control]
|
||||||
|
# Address to serve control server from
|
||||||
|
address = "http://localhost:80"
|
||||||
|
|
||||||
|
# Override hostname and port
|
||||||
|
#hostname = "localhost"
|
||||||
|
#port = 80
|
||||||
|
|
||||||
|
# Username and password
|
||||||
|
password = "woke"
|
||||||
|
username = "woke"
|
||||||
|
|
||||||
|
[cert]
|
||||||
|
# SSL certificates (optional)
|
||||||
|
# If you specify an https:// URL for the "webserver" option, a certificate will be automatically generated and signed by Let's Encrypt.
|
||||||
|
# For this to work, Streamwall must be accessible from both ports 80 and 443.
|
||||||
|
|
||||||
|
# Uncomment to obtain a real certificate (otherwise a testing cert will be generated)
|
||||||
|
#production = true
|
||||||
|
|
||||||
|
# Email address to use when registering SSL certificate with Let's Encrypt
|
||||||
|
#email = "hi@streamwall.io"
|
||||||
|
|
||||||
|
# Directory to store certificate
|
||||||
|
#dir = "../streamwall-cert"
|
||||||
|
|
||||||
|
[streamdelay]
|
||||||
|
#endpoint = "http://localhost:8404"
|
||||||
|
#key = "super-secret"
|
||||||
5
package-lock.json
generated
5
package-lock.json
generated
@@ -1181,6 +1181,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
|
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
|
||||||
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
|
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
|
||||||
},
|
},
|
||||||
|
"@iarna/toml": {
|
||||||
|
"version": "2.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
|
||||||
|
"integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="
|
||||||
|
},
|
||||||
"@istanbuljs/load-nyc-config": {
|
"@istanbuljs/load-nyc-config": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
|
||||||
|
|||||||
@@ -6,12 +6,13 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack",
|
"build": "webpack",
|
||||||
"start": "npm run build -- --display=errors-only && electron dist",
|
"start": "npm run build -- --display=errors-only && electron dist",
|
||||||
"start-local": "npm run build -- --display=errors-only && electron dist --webserver=http://localhost:4444 --username=woke --password=woke",
|
"start-local": "npm run build -- --display=errors-only && electron dist --control.address=http://localhost:4444 --control.username=woke --control.password=woke",
|
||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"author": "Max Goodhart <c@chromakode.com>",
|
"author": "Max Goodhart <c@chromakode.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@iarna/toml": "^2.2.5",
|
||||||
"ejs": "^3.1.3",
|
"ejs": "^3.1.3",
|
||||||
"electron": "^9.0.4",
|
"electron": "^9.0.4",
|
||||||
"koa": "^2.12.1",
|
"koa": "^2.12.1",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import yargs from 'yargs'
|
import yargs from 'yargs'
|
||||||
|
import TOML from '@iarna/toml'
|
||||||
import { app, shell, session, BrowserWindow } from 'electron'
|
import { app, shell, session, BrowserWindow } from 'electron'
|
||||||
|
|
||||||
import { ensureValidURL } from '../util'
|
import { ensureValidURL } from '../util'
|
||||||
@@ -8,59 +9,80 @@ import StreamWindow from './StreamWindow'
|
|||||||
import StreamdelayClient from './StreamdelayClient'
|
import StreamdelayClient from './StreamdelayClient'
|
||||||
import initWebServer from './server'
|
import initWebServer from './server'
|
||||||
|
|
||||||
async function main() {
|
function parseArgs() {
|
||||||
const argv = yargs
|
return yargs
|
||||||
.config('config', (configPath) => {
|
.config('config', (configPath) => {
|
||||||
return JSON.parse(fs.readFileSync(configPath, 'utf-8'))
|
return TOML.parse(fs.readFileSync(configPath, 'utf-8'))
|
||||||
})
|
|
||||||
.group(
|
|
||||||
['webserver', 'cert-dir', 'cert-email', 'hostname', 'port'],
|
|
||||||
'Web Server Configuration',
|
|
||||||
)
|
|
||||||
.option('webserver', {
|
|
||||||
describe: 'Enable control webserver and specify the URL',
|
|
||||||
implies: ['username', 'password'],
|
|
||||||
})
|
|
||||||
.option('hostname', {
|
|
||||||
describe: 'Override hostname the control server listens on',
|
|
||||||
})
|
|
||||||
.option('port', {
|
|
||||||
describe: 'Override port the control server listens on',
|
|
||||||
number: true,
|
|
||||||
})
|
|
||||||
.option('cert-dir', {
|
|
||||||
describe: 'Private directory to store SSL certificate in',
|
|
||||||
implies: ['email'],
|
|
||||||
})
|
|
||||||
.option('cert-production', {
|
|
||||||
describe: 'Obtain a real SSL certificate using production servers',
|
|
||||||
})
|
|
||||||
.option('email', {
|
|
||||||
describe: 'Email for owner of SSL certificate',
|
|
||||||
})
|
|
||||||
.option('username', {
|
|
||||||
describe: 'Web control server username',
|
|
||||||
})
|
|
||||||
.option('password', {
|
|
||||||
describe: 'Web control server password',
|
|
||||||
})
|
|
||||||
.option('open', {
|
|
||||||
describe: 'After launching, open the control website in a browser',
|
|
||||||
boolean: true,
|
|
||||||
default: true,
|
|
||||||
})
|
})
|
||||||
.option('background-color', {
|
.option('background-color', {
|
||||||
describe: 'Background color of wall (useful for chroma-keying)',
|
describe: 'Background color of wall (useful for chroma-keying)',
|
||||||
default: '#000',
|
default: '#000',
|
||||||
})
|
})
|
||||||
.option('streamdelay-endpoint', {
|
.group(
|
||||||
|
[
|
||||||
|
'control.username',
|
||||||
|
'control.password',
|
||||||
|
'control.address',
|
||||||
|
'control.hostname',
|
||||||
|
'control.port',
|
||||||
|
'control.open',
|
||||||
|
],
|
||||||
|
'Control Webserver',
|
||||||
|
)
|
||||||
|
.option('control.username', {
|
||||||
|
describe: 'Web control server username',
|
||||||
|
})
|
||||||
|
.option('control.password', {
|
||||||
|
describe: 'Web control server password',
|
||||||
|
})
|
||||||
|
.option('control.open', {
|
||||||
|
describe: 'After launching, open the control website in a browser',
|
||||||
|
boolean: true,
|
||||||
|
default: true,
|
||||||
|
})
|
||||||
|
.option('control.address', {
|
||||||
|
describe: 'Enable control webserver and specify the URL',
|
||||||
|
implies: ['control.username', 'control.password'],
|
||||||
|
})
|
||||||
|
.option('control.hostname', {
|
||||||
|
describe: 'Override hostname the control server listens on',
|
||||||
|
})
|
||||||
|
.option('control.port', {
|
||||||
|
describe: 'Override port the control server listens on',
|
||||||
|
number: true,
|
||||||
|
})
|
||||||
|
.group(
|
||||||
|
['cert.dir', 'cert.production', 'cert.email'],
|
||||||
|
'Automatic SSL Certificate',
|
||||||
|
)
|
||||||
|
.option('cert.dir', {
|
||||||
|
describe: 'Private directory to store SSL certificate in',
|
||||||
|
implies: ['email'],
|
||||||
|
default: null,
|
||||||
|
})
|
||||||
|
.option('cert.production', {
|
||||||
|
describe: 'Obtain a real SSL certificate using production servers',
|
||||||
|
})
|
||||||
|
.option('cert.email', {
|
||||||
|
describe: 'Email for owner of SSL certificate',
|
||||||
|
})
|
||||||
|
.group(['streamdelay.endpoint', 'streamdelay.key'], 'Streamdelay')
|
||||||
|
.option('streamdelay.endpoint', {
|
||||||
describe: 'URL of Streamdelay endpoint',
|
describe: 'URL of Streamdelay endpoint',
|
||||||
default: 'http://localhost:8404',
|
default: 'http://localhost:8404',
|
||||||
})
|
})
|
||||||
.option('streamdelay-key', {
|
.option('streamdelay.key', {
|
||||||
describe: 'Streamdelay API key',
|
describe: 'Streamdelay API key',
|
||||||
|
default: null,
|
||||||
})
|
})
|
||||||
.help().argv
|
.help().argv
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const argv = parseArgs()
|
||||||
|
if (argv.help) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Reject all permission requests from web content.
|
// Reject all permission requests from web content.
|
||||||
session
|
session
|
||||||
@@ -132,28 +154,28 @@ async function main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv.webserver) {
|
if (argv.control.address) {
|
||||||
;({ broadcastState } = await initWebServer({
|
;({ broadcastState } = await initWebServer({
|
||||||
certDir: argv.certDir,
|
certDir: argv.cert.dir,
|
||||||
certProduction: argv.certProduction,
|
certProduction: argv.cert.production,
|
||||||
email: argv.email,
|
email: argv.cert.email,
|
||||||
url: argv.webserver,
|
url: argv.control.address,
|
||||||
hostname: argv.hostname,
|
hostname: argv.control.hostname,
|
||||||
port: argv.port,
|
port: argv.control.port,
|
||||||
username: argv.username,
|
username: argv.control.username,
|
||||||
password: argv.password,
|
password: argv.control.password,
|
||||||
getInitialState,
|
getInitialState,
|
||||||
onMessage,
|
onMessage,
|
||||||
}))
|
}))
|
||||||
if (argv.open) {
|
if (argv.control.open) {
|
||||||
shell.openExternal(argv.webserver)
|
shell.openExternal(argv.control.address)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv.streamdelayKey) {
|
if (argv.streamdelay.key) {
|
||||||
streamdelayClient = new StreamdelayClient({
|
streamdelayClient = new StreamdelayClient({
|
||||||
endpoint: argv.streamdelayEndpoint,
|
endpoint: argv.streamdelay.endpoint,
|
||||||
key: argv.streamdelayKey,
|
key: argv.streamdelay.key,
|
||||||
})
|
})
|
||||||
streamdelayClient.on('state', (state) => {
|
streamdelayClient.on('state', (state) => {
|
||||||
clientState.streamdelay = state
|
clientState.streamdelay = state
|
||||||
|
|||||||
Reference in New Issue
Block a user