Karaoke Eternal is a modern mobile browser app that lets everyone join without having to install anything on their phones. It’s built for touch, but a mouse is supported in desktop browsers (click and drag to emulate swipe gestures).
The library view lists available songs organized by artist, with search and filtering options at the top.
Tap to expand an artist, then tap a song’s title to queue it. A glowing song and artist indicate they’re upcoming in the queue.
Swiping left on a song reveals the following options:
When a song has multiple versions (media files), admins see an italicized number after the title, and media in the folder highest in the Media Folders list will be used unless specifically set (see Song Info above).
The queue view shows your room’s previous, current and upcoming songs.
Karaoke Eternal automatically arranges the queue using a round-robin method for fairness, without penalizing those joining later in the party. For example, a latecomer will be able to sing right after the next-up singer regardless of how long the queue is.
Swiping left on a queued song reveals the following options:
Normal users can only manage their own queued songs, but admins can manage anyone’s.
The account view lets users manage their account, while admins will see additional panels.
The Rooms panel allows admins to create, edit or remove rooms.
Karaoke Eternal uses “rooms” to organize sessions by time and space (spacetime?) Users choose an open room when signing in, and each room has its own queue.
Rooms can have one of the following statuses:
open
Can be signed in to and have songs queued.closed
Can no longer be signed in to or have more songs queued. When closing, current occupants are unaffected and can continue playing through the existing queue.It’s best to create a new room before each session so that you start with an empty queue, then set the room to closed
when finished.
Blah blah
The Preferences panel allows admins to set these global preferences:
The My Account panel allows users to change their username, password, display name or picture as well as sign out.
The player is a part of the app that’s designed to run fullscreen on the system handling audio/video for a room. The latest versions of these browsers are officially supported:
To start a player, sign in to the desired room as an admin and a player link will appear at the top. If you don’t see a link that means fullscreen support wasn’t detected, but you can still manually navigate to /player
.
Once a player is in the room, playback and display controls will appear. Admins always see these, as well as the current singer during their turn.
The server hosts the app and your media files, and can run on relatively minimal hardware (Raspberry Pi 3B+). Note that players don’t need to run on the same system as the server.
Download and install the latest release. Karaoke Eternal Server runs in the menu bar or tray:
See Quick Start 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 Quick Start if you’re new to Karaoke Eternal.Official Docker images are available for x64. Support for additional architectures is planned.
These images are modeled after LinuxServer’s:
/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
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:
---
version: "2.1"
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 Quick Start 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
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
Install and run Karaoke Eternal Server on the system that will serve the app and your media. Note that players don’t need to run on the same system as the server.
Browse to the server URL. In macOS or Windows you can open the URL using the Karaoke Eternal Server menu bar or tray icon.
Create your admin account at the welcome page.
In the account view you’ll see Preferences. Expand the Media Folders section and add your supported media.
Once the media scanner finishes, head to the library and add some songs by tapping an artist, then tapping a song title. A glowing song means it’s upcoming in the queue.
Now we just need a player. On the system that will output audio/video, browse to the server URL, sign in with your admin account, and tap the Start Player link at the top. If you don’t see a link, your current browser doesn’t support fullscreen mode, but you can still navigate to /player
.
In the player, press play and party!
Now that there’s a player in the room, playback and display controls will appear on all your devices. Admins always see these, as well as the current singer during their turn.
©2022 RadRoot LLC