Skip to main content

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:

  1. Discovers the server via UDP broadcast on port 3483
  2. Registers as a player via TCP (HELO packet)
  3. Receives stream commands from the server
  4. Fetches audio via HTTP, decodes with ffmpeg, outputs via miniaudio
  5. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

squeezy-0.3.0.tar.gz (59.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

squeezy-0.3.0-py3-none-any.whl (51.9 kB view details)

Uploaded Python 3

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

Hashes for squeezy-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1303d8b38a821ba0de81acd3406cd57b546e13d8dbdc0a3f7150b6077c9c5938
MD5 a78da07a54e0a13bc2cc12200ff29f90
BLAKE2b-256 af028bd5d38257f5e33c9ccfa4e7729b9ad6c9cfedad46311197919db2329169

See more details on using hashes here.

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

Hashes for squeezy-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 050935c1de208b4d1bec866b91db7260d695dcbb7877c841cc703c42072cb1a6
MD5 68912cad5cb99d7c15ac28d0ad38b0e4
BLAKE2b-256 f96c21ed9915a618a8c745eb6022641f8d662a78c46dfa6a799376521f5c266e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page