Thumbnail (MusicPly)

logo MusicPly

A simple web-ui to show local music playlists and play audio files.
Also it looks like Win98, for whatever reason ¯\_(ツ)_/¯

Installation (via git clone && make)

$> git clone
$> make build-quick
$> SOURCE=".." ./build/musicply

Installation (via docker)

$> docker pull mikescher/musicply
$> docker run                   \
          --volume "..."        \
          --publish "8000:8000" \
          --env "SOURCE=..."    \
          --name=musicply       \

Usage / Configuration

MusicPly is configured via environment variables. The most important config is SOURCE, which specified the source directories.
You can either

  • supply a single (json5) array in the SOURCE environment variable, which contains a list of all sources in the schema:
    {name: "...", path: "...", recursive: ...}
  • supplying a single path to a json5 file in the SOURCE environment variable
  • supply multiple SOURCE variables by appending indizes (aka SOURCE_01, SOURCE_02, SOURCE_03, ...) to the environment variable, where each variable contains a single source-object

An example config file (config.json) could look like:

  {name: "Back in Black",    path: "/data/ACDC/BackInBlack", recursive: true}, // with recursive:true we also iterate through all subfolders.
  {name: "Hotel California", path: "/data/Eagles/HotelCalifornia"},            // if recursive is not specified, teh default value ist false

  // values are shown in the here specified order in the web UI 

This config can be used by supplying the filepath:

$> SOURCE="/config.json" ./build/musicply

# or 

$> docker run                                             \
          --volume "/home/user/music:/data:ro"            \
          --volume "$(pwd)/config.json:/config.json:ro"   \
          --publish "8000:8000"                           \
          --env "SOURCE=/config.json"                     \

Or you can provide the json5 directly in the environment variable:

$> SOURCE="$(cat /config.json)" ./build/musicply

# or 

$> docker run                                             \
          --volume "/home/user/music:/data:ro"            \
          --publish "8000:8000"                           \
          --env "SOURCE=$(cat /config.json)"              \

Or you can provide the sources individually:

$> SOURCE_1='{name: "Back in Black",    path: "/data/ACDC/BackInBlack", recursive: true}' \
   SOURCE_2='{name: "Hotel California", path: "/data/Eagles/HotelCalifornia"}' \

# or 

$> docker run                                                                                          \
          --volume "/home/user/music:/data:ro"                                                         \
          --publish "8000:8000"                                                                        \
          --env 'SOURCE_1={name: "Back in Black",    path: "/data/ACDC/BackInBlack", recursive: true}' \
          --env 'SOURCE_2={name: "Hotel California", path: "/data/Eagles/HotelCalifornia"}'            \

Additional Configuration

The following environment variables can also be used to configure the application:

  • SERVER_IP The interface the webserver binds to (default:
  • SERVER_PORT The webserver port (default: 8000)
  • CORS Enable CORS headers (default: true)
  • LOGLEVEL, CUSTOM_404, GIN_DEBUG, RETURN_RAW_ERRORS Enable more logoutput (default: 'WARN', false, false, false)

Additional Configuration (Footer Links)

You can also show additional buttons under the playlist-control by supplying /FOOTERLINK_[0-9]/ env variables.
The variables must contain 3, semicolon-seperated values: ${icon-path};${Tooltip};${Link}

Additional Configuration (Track sort)

You can manually override the sort order of tracks in a playlist by specifying an sort array in your source:

             name: "Hotel California", 
             path: "/data/Eagles/HotelCalifornia", 
             sort: ["artist", "album", "trackindex", "filename"], 

In the above case we first sort by artist, then by album, then track-index and lastly by filename (this is also the default if no sort is specified).
The possible values are:

  • filename
  • filepath
  • title
  • artist
  • album
  • trackindex
  • year
  • cdate
  • mdate

Additional Configuration (Deduplication)

You can specify a deduplication strategy per-source. This removes duplicate tracks from the enumerated playlists:

             name: "Hotel California", 
             path: "/data/Eagles/HotelCalifornia", 
             deduplicate: { keys: ["title", "artist"], use: "newest" 

The keys field specifies which track-data are used to identify duplicates (tracks where all keys are equal will be duplicates).
The possible values are:

  • title
  • artist
  • album
  • year
  • track_index
  • track_total
  • filename

The use field specifies which track will be used (the other ones will be discarded).
The possible values are:

  • any: Use any track without a specific strategy
  • newest: Use the newest track (by file creation-time)
  • oldest: Use the oldest track (by file creation-time)
  • biggest: Use the track with the largest file-size

made with vanilla PHP and MySQL, no frameworks, no bootstrap, no unnecessary* javascript