Minimal Squeezebox player for Lyrion Music Server
Project description
Squeezy
Minimal Squeezebox-compatible player for Lyrion Music Server (formerly Logitech Media Server). Advertises as a player on your network, receives streaming audio, and plays it back through your default audio output. Supports synchronized playback with other players.
Requirements
- macOS, Linux, or Windows
- Python 3.9+
- ffmpeg
Install
Pick whichever method suits you. All three result in a squeezy command on your PATH.
Option 1: pipx (recommended)
# macOS
brew install ffmpeg pipx
pipx install squeezy
# Debian/Ubuntu
sudo apt install ffmpeg pipx
pipx install squeezy
Option 2: Homebrew tap (macOS only)
brew tap catcatcatcatcatcatcatcatcatcat/tap
brew install squeezy
This installs ffmpeg automatically as a dependency.
Option 3: From source
git clone https://github.com/catcatcatcatcatcatcatcatcatcat/squeezy.git
cd squeezy
python3 -m venv .venv
source .venv/bin/activate
pip install .
For development (run directly without installing):
./run.sh -n "My Speaker" -vv
Squeezy checks for updates on startup and will notify you when a new version is available.
Usage
# Auto-discover server on local network
squeezy
# Specify server and player name
squeezy -s 192.168.1.100 -n "Kitchen Speaker"
# Custom MAC address (for persistent player identity)
squeezy -m aa:bb:cc:dd:ee:ff
# List available audio output devices
squeezy -l
# Use a specific audio output (substring match, case-insensitive)
squeezy -d "HDMI" -n "Living Room"
# Verbose logging (connection, playback events, volume changes)
squeezy -v
# Debug logging (protocol-level detail: strm commands, STAT packets)
squeezy -vv
# Check installed version
squeezy --version
Your player will appear in the Lyrion Music Server web UI. Select it from the player dropdown to start streaming.
Project Structure
src/squeezy/
├── squeezy.py # Main player orchestrator
├── audio/ # Audio playback & streaming
│ ├── player.py # miniaudio device, mixing, crossfade
│ └── stream_decoder.py # HTTP streaming & FFmpeg
├── protocol/ # SlimProto protocol & LMS communication
│ ├── handler.py # Message dispatch & parsing
│ ├── slimproto.py # Protocol constants & packet builders
│ └── lms_client.py # LMS message operations
├── network/ # Network connectivity
│ └── server_connection.py # Socket management
└── config/ # Configuration & metadata
├── config.py # XDG-compliant config
└── metadata.py # ICY metadata parsing
Contributing
See DEVELOPER.md for a full walkthrough of the repo structure, how to set up a dev environment, and how to cut a release.
How it works
Squeezy implements the SlimProto protocol to communicate with Lyrion Music Server:
- Discovers the server via UDP broadcast on port 3483
- Registers as a player via TCP (HELO packet)
- Receives stream commands from the server
- Fetches audio via HTTP, decodes with ffmpeg, outputs via miniaudio
- Reports playback status back to the server for sync coordination
Uninstall
# If installed via pipx
pipx uninstall squeezy
# If installed via Homebrew
brew uninstall squeezy
brew untap catcatcatcatcatcatcatcatcatcat/tap
Releasing (for maintainers)
Version is defined in one place: pyproject.toml. To release:
# 1. Bump version in pyproject.toml
# 2. Commit, tag, and push
git add -A && git commit -m "Release vX.Y.Z"
git tag vX.Y.Z && git push origin main vX.Y.Z
# 3. Build and publish to PyPI
python -m build && twine upload dist/squeezy-X.Y.Z*
# 4. Update Homebrew tap (macOS formula)
# Get the SHA256 of the new tag tarball:
curl -sL https://github.com/catcatcatcatcatcatcatcatcatcat/squeezy/archive/refs/tags/vX.Y.Z.tar.gz | shasum -a 256
# Update url + sha256 in homebrew-tap/Formula/squeezy.rb, commit and push
All installed users will see an upgrade notice on next startup.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file squeezy-0.3.0.tar.gz.
File metadata
- Download URL: squeezy-0.3.0.tar.gz
- Upload date:
- Size: 59.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1303d8b38a821ba0de81acd3406cd57b546e13d8dbdc0a3f7150b6077c9c5938
|
|
| MD5 |
a78da07a54e0a13bc2cc12200ff29f90
|
|
| BLAKE2b-256 |
af028bd5d38257f5e33c9ccfa4e7729b9ad6c9cfedad46311197919db2329169
|
File details
Details for the file squeezy-0.3.0-py3-none-any.whl.
File metadata
- Download URL: squeezy-0.3.0-py3-none-any.whl
- Upload date:
- Size: 51.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
050935c1de208b4d1bec866b91db7260d695dcbb7877c841cc703c42072cb1a6
|
|
| MD5 |
68912cad5cb99d7c15ac28d0ad38b0e4
|
|
| BLAKE2b-256 |
f96c21ed9915a618a8c745eb6022641f8d662a78c46dfa6a799376521f5c266e
|