Compare commits

...

4 Commits

Author SHA1 Message Date
02ba383ab0 update readme 2026-01-09 12:04:33 +11:00
20c341de98 update readme 2026-01-09 12:02:35 +11:00
5fbc51fba7 add readme 2026-01-09 11:57:55 +11:00
a09a007787 add snapo server file 2026-01-09 11:56:17 +11:00
2 changed files with 287 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
# Mopidy Music Server Configuration
This repository contains the configuration and setup for the local Mopidy instance. Mopidy acts as the primary music logic server (Radio, Local Files, Extensions) feeding into the Snapcast multi-room audio system.
This system ses snapweb which needs to be set to MainAudio for Piper Voice play http://192.168.20.13:1780/
## 🎵 System Architecture
* **Core:** Mopidy (Python-based music server).
* **Output:** Pipes audio to Snapserver via a Named Pipe (`/tmp/snapfifo`).
* **Frontend:** Iris Web Interface (Port 6680).
* **Extensions:** `mopidy-radionet`, `mopidy-local`, etc.
## 📂 Key Files
* **`mopidy.conf`**: The master configuration file. Controls enabled plugins, file paths, and GStreamer audio pipelines.
* **`requirements.txt`** (Optional): Python pip dependencies for installed plugins.
## ⚙️ Configuration Highlights
### Audio Output (Snapcast Link)
To ensure compatibility with Snapserver, the audio output is forced to **48kHz Stereo 16-bit** and written to the pipe:
```ini
[audio]
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! wavenc ! filesink location=/tmp/snapfifo
```
## 🚀 Management Commands
**Restart Service:**
```bash
sudo systemctl restart mopidy
```
**Check Status & Logs:**
```bash
sudo systemctl status mopidy
sudo journalctl -u mopidy -f
```
**Rescan Local Library:**
```bash
sudo mopidy local scan
```
**Config Location:**
* `/etc/mopidy/mopidy.conf` (System Service)
* `~/.config/mopidy/mopidy.conf` (User Mode)

238
snapserver.conf Normal file
View File

@@ -0,0 +1,238 @@
###############################################################################
# ______ #
# / _____) #
# ( (____ ____ _____ ____ ___ _____ ____ _ _ _____ ____ #
# \____ \ | _ \ (____ || _ \ /___)| ___ | / ___)| | | || ___ | / ___) #
# _____) )| | | |/ ___ || |_| ||___ || ____|| | \ V / | ____|| | #
# (______/ |_| |_|\_____|| __/ (___/ |_____)|_| \_/ |_____)|_| #
# |_| #
# #
# Snapserver config file #
# #
###############################################################################
# default values are commented
# uncomment and edit to change them
# Settings can be overwritten on command line with:
# "--<section>.<name>=<value>", e.g. --server.threads=4
# General server settings #####################################################
#
[server]
# Number of additional worker threads to use
# - For values < 0 the number of threads will be 2 (on single and dual cores)
# or 4 (for quad and more cores)
# - 0 will utilize just the processes main thread and might cause audio drops
# in case there are a couple of longer running tasks, such as encoding
# multiple audio streams
#threads = -1
# the pid file when running as daemon (-d or --daemon)
#pidfile = /var/run/snapserver/pid
# the user to run as when daemonized (-d or --daemon)
#user = snapserver
# the group to run as when daemonized (-d or --daemon)
#group = snapserver
# directory where persistent data is stored (server.json)
# if empty, data dir will be
# - "/var/lib/snapserver/" when running as daemon
# - "$HOME/.config/snapserver/" when not running as daemon
#datadir =
#
###############################################################################
# Secure Socket Layer #########################################################
#
[ssl]
# Certificate files are either specified by their full or relative path. Certificates with
# relative path are searched for in the current path and in "/etc/snapserver/certs"
# Certificate file in PEM format
#certificate =
# Private key file in PEM format
#certificate_key =
# Password for decryption of the certificate_key (only needed for encrypted certificate_key file)
#key_password =
# Verify client certificates
#verify_clients = false
# List of client CA certificate files, can be configured multiple times
#client_cert =
#client_cert =
#
###############################################################################
# HTTP RPC ####################################################################
#
[http]
# enable HTTP Json RPC (HTTP POST and websockets)
#enabled = true
# address to listen on, can be specified multiple times
# use "0.0.0.0" to bind to any IPv4 address or :: to bind to any IPv6 address
# or "127.0.0.1" or "::1" to bind to localhost IPv4 or IPv6, respectively
# use the address of a specific network interface to just listen to and accept
# connections from that interface
#bind_to_address = ::
# which port the server should listen to
#port = 1780
# enable HTTPS Json RPC (HTTPS POST and ssl websockets)
#ssl_enabled = false
# same as 'bind_to_address' but for SSL
#ssl_bind_to_address = ::
# same as 'port' but for SSL
#ssl_port = 1788
# serve a website from the doc_root location
# disabled if commented or empty
doc_root = /usr/share/snapserver/snapweb
# Hostname or IP under which clients can reach this host
# used to serve cached cover art
# use <hostname> as placeholder for your actual host name
#host = <hostname>
# Optional custom URL prefix for generated URLs where clients can reach
# cached album art, to e.g. match scheme behind a reverse proxy.
#url_prefix = https://<hostname>
#
###############################################################################
# TCP RPC #####################################################################
#
[tcp]
# enable TCP Json RPC
#enabled = true
# address to listen on, can be specified multiple times
# use "0.0.0.0" to bind to any IPv4 address or :: to bind to any IPv6 address
# or "127.0.0.1" or "::1" to bind to localhost IPv4 or IPv6, respectively
# use the address of a specific network interface to just listen to and accept
# connections from that interface
#bind_to_address = ::
# which port the server should listen to
#port = 1705
#
###############################################################################
# Stream settings #############################################################
#
[stream]
# address to listen on, can be specified multiple times
# use "0.0.0.0" to bind to any IPv4 address or :: to bind to any IPv6 address
# or "127.0.0.1" or "::1" to bind to localhost IPv4 or IPv6, respectively
# use the address of a specific network interface to just listen to and accept
# connections from that interface
#bind_to_address = ::
# which port the server should listen to
#port = 1704
# source URI of the PCM input stream, can be configured multiple times
# The following notation is used in this paragraph:
# <angle brackets>: the whole expression must be replaced with your specific setting
# [square brackets]: the whole expression is optional and can be left out
# [key=value]: if you leave this option out, "value" will be the default for "key"
#
# Format: TYPE://host/path?name=<name>[&codec=<codec>][&sampleformat=<sampleformat>][&chunk_ms=<chunk ms>][&controlscript=<control script filename>[&controlscriptparams=<control script command line arguments>]]
# parameters have the form "key=value", they are concatenated with an "&" character
# parameter "name" is mandatory for all sources, while codec, sampleformat and chunk_ms are optional
# and will override the default codec, sampleformat or chunk_ms settings
# Available types are:
# pipe: pipe:///<path/to/pipe>?name=<name>[&mode=create], mode can be "create" or "read"
# librespot: librespot:///<path/to/librespot>?name=<name>[&username=<my username>&password=<my password>][&devicename=Snapcast][&bitrate=320][&wd_timeout=7800][&volume=100][&onevent=""][&normalize=false][&autoplay=false][&params=<generic librepsot process arguments>]
# note that you need to have the librespot binary on your machine
# sampleformat will be set to "44100:16:2"
# file: file:///<path/to/PCM/file>?name=<name>
# process: process:///<path/to/process>?name=<name>[&wd_timeout=0][&log_stderr=false][&params=<process arguments>]
# airplay: airplay:///<path/to/airplay>?name=<name>[&port=5000]
# note that you need to have the airplay binary on your machine
# sampleformat will be set to "44100:16:2"
# tcp server: tcp://<listen IP, e.g. 127.0.0.1>:<port>?name=<name>[&mode=server]
# tcp client: tcp://<server IP, e.g. 127.0.0.1>:<port>?name=<name>&mode=client
# alsa: alsa:///?name=<name>&device=<alsa device>[&send_silence=false][&idle_threshold=100][&silence_threshold_percent=0.0]
# meta: meta:///<name of source#1>/<name of source#2>/.../<name of source#N>?name=<name>
#source = pipe:///tmp/snapfifo?name=default
source = meta:///Announcements/default?name=MainAudio
source = tcp://0.0.0.0:4953?name=Announcements&sampleformat=48000:16:2&codec=pcm
source = pipe:///run/snapserver/snapfifo?name=default
#source = spotify:///librespot?name=Spotify&username=guzzbinkles&password=Finn05092013&devicename=Snapcast&bitrate=320
#announcements
#source = tcp://0.0.0.0:4953?name=Announcements&sampleformat=22050:16:1&codec=pcm
#source = spotify:///librespot?name=Spotify&devicename=Snapcast&bitrate=320
# Plugin directory, containing scripts, referred by "controlscript"
#plugin_dir = /usr/share/snapserver/plug-ins
# Default sample format: <sample rate>:<bits per sample>:<channels>
#sampleformat = 48000:16:2
# Default transport codec
# (flac|ogg|opus|pcm)[:options]
# Start Snapserver with "--stream:codec=<codec>:?" to get codec specific options
#codec = flac
# Default source stream read chunk size [ms].
# The server will continously read this number of milliseconds from the source into buffer and pass this buffer to the encoder.
# The encoded buffer is sent to the clients. Some codecs have a higher latency and will need more data, e.g. Flac will need ~26ms chunks
#chunk_ms = 20
# Buffer [ms]
# The end-to-end latency, from capturing a sample on the server until the sample is played-out on the client
#buffer = 1000
# Send audio to muted clients
#send_to_muted = false
#
# Streaming client options ####################################################
#
[streaming_client]
# Volume assigned to new snapclients [percent]
# Defaults to 100 if unset
#initial_volume = 100
#
###############################################################################
# Logging options #############################################################
#
[logging]
# log sink [null,system,stdout,stderr,file:<filename>]
# when left empty: if running as daemon "system" else "stdout"
#sink =
# log filter <tag>:<level>[,<tag>:<level>]*
# with tag = * or <log tag> and level = [trace,debug,info,notice,warning,error,fatal]
#filter = *:info
#
###############################################################################