LMS - Lightweight Music Server

Build Status GitHub release (latest by date) CodeFactor

LMS is a self-hosted music streaming software: access your music collection from anywhere using a web interface!

A demo instance is available. Note the administration panel is not available.

Main features

  • Low memory requirements: the demo instance runs on a Raspberry Pi3B+
  • Recommendation engine
  • Audio transcode for maximum interoperability and low bandwith requirements
  • Multi-value tags: artists, genres, ...
  • Custom tags support: mood, genre, albummood, albumgrouping, ...
  • Compilation support
  • MusicBrainz Identifier support to handle duplicated artist and release names
  • Disc subtitles support
  • ReplayGain support
  • Persistent play queue across sessions
  • Systemd integration
  • User management
    • with optional PAM authentication backend
  • Subsonic API, with the following additional features:
    • Playlists
    • Bookmarks

Music discovery

LMS provides several ways to help you find the music you like:

  • Tag-based filters (ex: Rock, Metal and Aggressive, Electronic and Relaxed, ...)
  • Recommendations for similar artists and albums
  • Radio mode, based on what is in the current playqueue
  • Searches in album, artist and track names (including sort names)
  • Starred Albums/Artists/Tracks
  • Random/Starred/Most played/Recently played/Recently added for Artist/Albums/Tracks, allowing you to search for things like:
    • Recently added Electronic artists
    • Random Metal and Aggressive albums
    • Most played Relaxed tracks
    • Starred Jazz albums
    • ...

The recommendation engine uses two different sources:

  1. Tags that are present in the audio files
  2. Acoustic similarities of the audio files, using a trained Self-Organizing Map

Notes on the self-organizing map:

  • training the map requires significant computation time on large collections (ex: half an hour for 40k tracks)
  • audio acoustic data is pulled from AcousticBrainz. Therefore your audio files must contain the MusicBrainz Identifier.
  • to enable the audio similarity source, you have to enable it first in the administration panel.

Subsonic API

The API version implemented is 1.12.0 and has been tested on Android using the official application, Ultrasonic and DSub.

Since LMS uses metadata tags to organize music, a compatibility mode is used to navigate through the collection using the directory browsing commands.

The Subsonic API is enabled by default.

Note: since LMS stores hashed and salted passwords, it cannot handle the token authentication method defined from version 1.13.0.

Keyboard shortcuts

  • Play/pause: Space
  • Previous track: Ctrl + Left
  • Next track: Ctrl + Right

Installation

Docker

Docker images are available, please see detailed instructions on https://hub.docker.com/r/epoupon/lms.

Debian Buster packages

Buster packages are provided for amd64 and armhf architectures.

As root, trust the following debian package provider and add it in your list of repositories:

wget -O - https://debian.poupon.io/apt/debian/epoupon.gpg.key | apt-key add -
echo "deb https://debian.poupon.io/apt/debian buster main" > /etc/apt/sources.list.d/epoupon.list

To install or upgrade LMS:

apt update
apt install lms

The lms service is started just after the package installation, run by a dedicated lms system user.
Please refer to Deployment for further configuration options.

From source

Note: this installation process and the default values of the configuration files have been written for Debian Buster. Therefore, you may have to adapt commands and/or paths in order to fit to your distribution.

Build dependencies

Notes:

  • a C++17 compiler is needed
  • ffmpeg version 4 minimum is required
apt-get install g++ cmake libboost-system-dev libavutil-dev libavformat-dev libstb-dev libconfig++-dev libpstreams-dev ffmpeg libtag1-dev libpam0g-dev

Notes:

  • libpam0g-dev is optional (only for using PAM authentication)
  • libstb-dev can be replaced by libgraphicsmagick++1-dev (the latter will likely use more RAM)

You also need Wt4, which is not packaged yet on Debian. See installation instructions.
No optional requirement is needed, except openSSL if you plan not to deploy behind a reverse proxy (which is not recommended).

Build

Get the latest stable release and build it:

git clone https://github.com/epoupon/lms.git lms
cd lms
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

Notes:

  • you can customize the installation directory using -DCMAKE_INSTALL_PREFIX=path (defaults to /usr/local).
  • you can customize the image library using -DIMAGE_LIBRARY=<STB|GraphicksMagick++>
make

Note: you can use make -jN to speed up compilation time (N is the number of compilation workers to spawn).

Installation

Note: the commands of this section require root privileges.

make install

Create a dedicated system user:

useradd --system --group lms

Copy the configuration files:

cp /usr/share/lms/lms.conf /etc/lms.conf
cp /usr/share/lms/lms.service /lib/systemd/system/lms.service

Create the working directory and give it access to the lms user:

mkdir /var/lms
chown lms:lms /var/lms

To make LMS run automatically during startup:

systemctl enable lms

Upgrade

To upgrade LMS from sources, you need to update the master branch and rebuild/install it:

cd build
git pull
make

Then using root privileges:

make install
systemctl restart lms

Deployment

Note: don't forget to give the lms user read access to the music directory you want to scan.

Configuration

LMS uses a configuration file, installed by default in /etc/lms.conf. It is recommended to edit this file and change relevant settings (listen address, listen port, working directory, Subsonic API activation, deployment path, ...).

All other settings are set using the web interface (user management, scan settings, transcode settings, ...).

If a setting is not present in the configuration file, a hardcoded default value is used (the same as in the default.conf file)

Deploy on non root path

If you want to deploy on non root path (e.g. https://mydomain.com/newroot/), you have to set the deploy-path option accordingly in lms.conf.

As static resources are not related to the deploy-path option, you have to perform the following steps if you want them to be on a non root path too:

  • Create a new intermediary newroot directory in /usr/share/lms/docroot and move everything in it.
  • Symlink /usr/share/lms/docroot/newroot/resources to /usr/share/Wt/resources.
  • Edit lms.conf and set:
wt-resources = "" # do not comment the whole line
docroot = "/usr/share/lms/docroot/;/newroot/resources,/newroot/css,/newroot/images,/newroot/js,/newroot/favicon.ico";`
deploy-path = "/newroot/"; # ending slash is important

If you use nginx as a reverse proxy, you can simply replace location / with location /newroot/ to achieve the same result.

Reverse proxy settings

LMS is shipped with an embedded web server, but it is recommended to deploy behind a reverse proxy. You have to set the behind-reverse-proxy option to true in the lms.conf configuration file.

Here is an example to make LMS properly work on myserver.org using nginx:

server {
    listen 80;

    server_name myserver.org;

    access_log            /var/log/nginx/myserver.access.log;

    proxy_request_buffering off;
    proxy_buffering off;
    proxy_buffer_size 4k;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      proxy_pass          http://localhost:5082/;
      proxy_read_timeout  120;
    }
}

Run

systemctl start lms

Log traces can be accessed using journactl:

journalctl -u lms.service

To connect to LMS, just open your favorite browser and go to http://localhost:5082

Credits

S
Description
Lightweight Music Server. Access your self-hosted music using a web interface.
http://lms-demo.poupon.dev
Readme
16 MiB
Languages
C++ 98.7%
CMake 0.7%
JavaScript 0.3%
Python 0.2%