2026-08-06 14:04:39 -06:00
2026-07-28 16:06:48 -06:00
2026-07-30 14:57:10 -06:00
2026-08-06 14:04:39 -06:00
2026-07-30 14:56:21 -06:00
2026-07-28 16:06:19 -06:00

Qotplayer

A lightweight, headless Python audio player designed as a fast drop-in replacement for mpv.

This player is specifically built to act as a backend player for Navidrome (in Jukebox mode) feeding into Snapcast. It avoids the overhead of full mpv while maintaining compatibility with its IPC protocol.

This removes about 5 seconds of audio playback lag and UI seeking lag.

What it does

  • Decodes and resamples common audio formats to 48000Hz, stereo, s16 PCM.
  • Outputs raw PCM audio directly to a FIFO pipe (/tmp/snapfifo).
  • Provides a JSON IPC server over a Unix socket for real-time playback control (pause, volume, seek, quit).
  • Maps 0-100 volume levels to 25-100 and applies log scale (for human hearing).

Setup

docker-compose.yml:

services:
  navidrome:
    build: .
    user: 1000:1000 # should be owner of volumes
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      ND_JUKEBOX_ENABLED: true
      ND_MPVCMDTEMPLATE: '/opt/qotplayer/env/bin/python /opt/qotplayer/main.py %f --input-ipc-server=%s'
      ND_LOGLEVEL: info
    volumes:
      - "./data:/data"
      - "/mnt/music-combined:/music:ro"
      - "/tmp/snapfifo:/tmp/snapfifo"

Dockerfile:

FROM deluan/navidrome:latest

RUN apk add --no-cache git curl && \
    curl -LsSf https://astral.sh/uv/install.sh | sh

ENV PATH="/root/.local/bin:$PATH"

WORKDIR /opt
RUN git clone https://git.tanner.vc/tanner/qotplayer.git

WORKDIR /opt/qotplayer
RUN uv venv --python=3.12 env && \
    . env/bin/activate && \
    uv pip install -r requirements.txt

RUN chmod 755 /root

Build and run with:

$ sudo docker compose build --no-cache
$ sudo docker compose up
S
Description
No description provided
Readme 76 KiB
Languages
Python 100%