The server hosts the web app and your media files, and can run on pretty much anything, including a Windows PC, Mac, or a dedicated server like a Raspberry Pi or Synology NAS.
Note that because the player is fully browser-based, it doesn’t need to run on the same system as the server, but it can.
The Releases page has the latest packages available for Windows and macOS. Once started, Karaoke Eternal Server will appear in the tray or menu bar:
See Getting Started if you’re new to Karaoke Eternal.
radrootllc/karaoke-eternal
image.Enable auto-restart
(if desired)8080
(or something else if desired)docker
and create a new karaoke-eternal
subfolder. Select that subfolder and click Select, then enter the mount path /config
. This path is used to store the database./mnt/karaoke
, etc. Once inside the app, you’ll add these mount paths as Media Folders.http://<your_synology_ip>:8080
.See Getting Started if you’re new to Karaoke Eternal.
The Karaoke Eternal docker image supports amd64
, arm64
and arm/v7
. It’s modeled after LinuxServer’s images:
/config
should be mapped to a host volume (the database will be stored here)8080
should be published to the desired host portPUID
, PGID
and TZ
environment variables are optionalExample CLI usage:
$ docker run \
--name=karaoke-eternal \
-v <path_to_database>:/config \
-v <path_to_media>:/mnt/karaoke \
-p <host_port>:8080 \
--restart unless-stopped \
radrootllc/karaoke-eternal
Example docker compose
usage:
services:
karaoke-eternal:
image: radrootllc/karaoke-eternal
container_name: karaoke-eternal
volumes:
- <path_to_database>:/config
- <path_to_media>:/mnt/karaoke
ports:
- <host_port>:8080
restart: unless-stopped
See Getting Started if you’re new to Karaoke Eternal.
Karaoke Eternal is available as an npm
package for systems running Node.js 16 or later.
npm
$ npm i -g karaoke-eternal
$ karaoke-eternal-server
See Getting Started if you’re new to Karaoke Eternal.
The following types are supported:
Your media files should be named in “Artist - Title” format by default (you can configure this). Media with filenames that couldn’t be parsed won’t appear in the library, so check the scanner log or console output for these.
The media metadata parser can be customized using a _kes.v1.js
file. When this file is encountered in a media folder it applies to all files and subfolders (if any subfolders have their own _kes.v1.js
, it will take precedence).
You can configure the default metadata parser by returning an object with the options you want to override. For example, if a folder has filenames in the format “Title - Artist”, you could add this _kes.v1.js
file:
return {
artistOnLeft: false, // override default
}
The default configuration is:
return {
articles: ['A', 'An', 'The'], // false disables article normalization
artistOnLeft: true,
delimiter: '-', // can also be a RegExp
}
Your _kes.v1.js
file can also return a parser creator instead of a configuration object. A parser creator returns a function that can be called for each media file. The default parser is still available so you don’t have to reinvent the wheel.
The following example creates a parser that removes the word ‘junk’ from each filename before handing off to the default parser:
return ({ compose, getDefaultParser, defaultMiddleware }) => {
function customMiddleware (ctx, next) {
ctx.name = ctx.name.replace('junk', '')
next()
}
return compose(
customMiddleware, // our custom pre-processing
getDefaultParser(), // everything else (optionally accepts a configuration object)
)
}
Your parser creator is passed an object with the following properties:
compose
(function) accepts functions (or arrays of functions) as arguments and returns a single composed function that can be used as a parsergetDefaultParser
(function) gets an instance of the default parser, which itself can be used as middleware. Note that the method must be called because you can optionally pass a configuration objectdefaultMiddleware
Map containing the default middleware in order. This can be used to recompose the middleware in your custom parserWhen a media file is scanned, the parser is called with a context object ctx
having the following properties:
dir
(string) full path of the containing folderdirSep
(string) path segment separator used by the current OS (/
or \
)name
(string) media filename (without extension)data
(object) media file’s metadata fieldsMiddleware may mutate ctx
as required. Once finished, the following properties on it will be used:
artist
(string) artist’s name as it will be shown in the libraryartistNorm
(string) normalized version of the artist’s name; used for matching and sorting (artist
if not set)title
(string) song’s title as it will be shown in the librarytitleNorm
(string) normalized version of the song’s title; used for matching and sorting (title
if not set)It’s important that each middleware call next
unless you’re done or don’t want the chain to continue.
Karaoke Eternal Server supports the following CLI options and environment variables. The numeric levels used for logs/console are: 0=off, 1=error, 2=warn, 3=info, 4=verbose, 5=debug
Option | ENV | Description | Default |
---|---|---|---|
--consoleLevel <number> |
KES_CONSOLE_LEVEL |
Web server console output level | 4 |
--data <string> |
KES_PATH_DATA |
Absolute path of folder for database files | |
--logLevel <number> |
KES_LOG_LEVEL |
Web server log file level | 3 |
-p, --port <number> |
KES_PORT |
Web server port | auto |
--rotateKey |
KES_ROTATE_KEY |
Rotate the session key at startup | |
--scan |
KES_SCAN |
Run the media scanner at startup | |
--scanConsoleLevel <number> |
KES_SCAN_CONSOLE_LEVEL |
Media scanner console output level (default=4) | 4 |
--scanLogLevel <number> |
KES_SCAN_LOG_LEVEL |
Media scanner log file level | 3 |
--urlPath <string> |
KES_URL_PATH |
Web server base URL path (must begin with a forward slash) | / |
-v, --version |
Show version and exit |
The default locations for the database (database.sqlite3
), web server log (server.log
) and media scanner log (scanner.log
) are as follows:
~/Library/Application Support/Karaoke Eternal Server
~/Library/Logs/Karaoke Eternal Server
%USERPROFILE%\AppData\Roaming\Karaoke Eternal Server
%USERPROFILE%\AppData\Roaming\Karaoke Eternal Server\logs
~/.config/Karaoke Eternal Server
~/.config/Karaoke Eternal Server/logs
©2023 RadRoot LLC