From d253b5f7c4aef92942dd3900c89ea020212afa36 Mon Sep 17 00:00:00 2001 From: "(Tim) Efthimis Kritikos" Date: Mon, 17 Jul 2023 04:59:40 +0100 Subject: [PATCH] Initial setup --- .gitignore | 3 + docker-compose.yml | 35 +++++ ledfx/config.json | 21 +++ mpd/Dockerfile | 22 +++ mpd/mpd.conf | 269 +++++++++++++++++++++++++++++++++++++ mpd/varlib/.keep | 0 snapserver/Dockerfile | 27 ++++ snapserver/snapserver.conf | 165 +++++++++++++++++++++++ 8 files changed, 542 insertions(+) create mode 100644 .gitignore create mode 100644 docker-compose.yml create mode 100644 ledfx/config.json create mode 100644 mpd/Dockerfile create mode 100644 mpd/mpd.conf create mode 100644 mpd/varlib/.keep create mode 100644 snapserver/Dockerfile create mode 100644 snapserver/snapserver.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c5995c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +ledfx/LedFx.log +mpd/varlib/* +!mpd/varlib/.keep diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a669c39 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,35 @@ +version: "3.8" + +services: + + mpd: + build: ./mpd + ports: + - "6600:6600" + volumes: + - /home/user/compressed:/var/lib/mpd/music/:ro + - ./mpd/varlib/:/var/lib/mpd/ + - streamfile:/tmp + + snapserver: + build: ./snapserver + ports: + - "1704:1704" + - "1705:1705" + - "1780:1780" + volumes: + - streamfile:/tmp + + ledfx: + image: shirom/ledfx:latest + container_name: ledfx + environment: + - HOST=snapserver + ports: + - 8888:8888 + volumes: + - ./ledfx/:/root/.ledfx:rw + +volumes: + streamfile: + name: streamfile diff --git a/ledfx/config.json b/ledfx/config.json new file mode 100644 index 0000000..c8d5235 --- /dev/null +++ b/ledfx/config.json @@ -0,0 +1,21 @@ +{ + "audio": {}, + "configuration_version": "2.1.0", + "dev_mode": false, + "devices": [], + "global_transitions": true, + "host": "0.0.0.0", + "integrations": [], + "melbanks": {}, + "port": 8888, + "port_s": 8443, + "scan_on_startup": false, + "scenes": {}, + "user_colors": {}, + "user_gradients": {}, + "user_presets": {}, + "virtuals": [], + "visualisation_fps": 30, + "visualisation_maxlen": 50, + "wled_preferences": {} +} diff --git a/mpd/Dockerfile b/mpd/Dockerfile new file mode 100644 index 0000000..9de86f6 --- /dev/null +++ b/mpd/Dockerfile @@ -0,0 +1,22 @@ +# +# Dockerfile for mpd +# + +#FROM alpine:3 +FROM vimagick/mpd + +#RUN set -xe \ +# && apk add --no-cache mpd mpc ncmpc ncmpcpp +# +#VOLUME ["/var/lib/mpd"] +#VOLUME ["/var/lib/mpd/music"] +#VOLUME ["/tmp"] +# +#ADD ["start.sh", "/start.sh"] +ADD ["mpd.conf", "/etc/mpd.conf"] + +EXPOSE 6600 + +#ENTRYPOINT ["/start.sh"] + +#CMD ["mpd", "--stdout", "--no-daemon", "/etc/mpd/mpd.conf"] diff --git a/mpd/mpd.conf b/mpd/mpd.conf new file mode 100644 index 0000000..e3c0825 --- /dev/null +++ b/mpd/mpd.conf @@ -0,0 +1,269 @@ + +# A configuration file for MPD. +# Read the user manual for documentation: http://www.musicpd.org/doc/user/ + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +#music_directory "~/music" +music_directory "/var/lib/mpd/music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +#playlist_directory "~/.mpd/playlists" +playlist_directory "/var/lib/mpd/playlists" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +#db_file "~/.mpd/database" +db_file "/var/lib/mpd/database" +# +# These settings are the locations for the daemon log files for the daemon. +# These logs are great for troubleshooting, depending on your log_level +# settings. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog. +# +log_file "syslog" +# +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +#pid_file "~/.mpd/pid" +# +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +#state_file "~/.mpd/state" +state_file "/var/lib/mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +#sticker_file "~/.mpd/sticker.sql" +sticker_file "/var/lib/mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +user "mpd" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other then the default, any. +# This setting can deny access to control of the daemon. Not effective if +# systemd socket activiation is in use. +# +# For network +#bind_to_address "any" +# +# And for Unix Socket +#bind_to_address "~/.mpd/socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +#port "6600" +# +# Suppress all messages below the given threshold. Use "verbose" for +# troubleshooting. +# +#log_level "notice" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +#restore_paused "no" +restore_paused "yes" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +#save_absolute_paths_in_playlists "no" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the user manual. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This example just enables the "comment" tag without disabling all +# the other supported tags: +#metadata_to_use "+comment" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +#auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +follow_outside_symlinks "no" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +#zeroconf_enabled "yes" +zeroconf_enabled "no" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. %h will be replaced with the hostname. +# +#zeroconf_name "Music Player @ %h" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Database ####################################################################### +# + +#database { +# plugin "proxy" +# host "other.mpd.host" +# port "6600" +#} + +# Input ####################################################################### +# + +input { + plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# + +audio_output { + type "fifo" + name "snapcast" + path "/tmp/snapfifo" + format "48000:16:2" + mixer_type "software" +} + +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album", "track" or "auto". "auto" is a special mode that +# chooses between "track" and "album" depending on the current state of +# random playback. If random playback is enabled then "track" mode is used. +# See for more details about ReplayGain. +# This setting is off by default. +# +#replaygain "album" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting sets the pre-amp used for files that do NOT have ReplayGain tags. +# By default this setting is disabled. +# +#replaygain_missing_preamp "0" +# +# This setting enables or disables ReplayGain limiting. +# MPD calculates actual amplification based on the ReplayGain tags +# and replaygain_preamp / replaygain_missing_preamp setting. +# If replaygain_limit is enabled MPD will never amplify audio signal +# above its original level. If replaygain_limit is disabled such amplification +# might occur. By default this setting is enabled. +# +#replaygain_limit "yes" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +#volume_normalization "no" +# +############################################################################### + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +#filesystem_charset "UTF-8" +# +############################################################################### diff --git a/mpd/varlib/.keep b/mpd/varlib/.keep new file mode 100644 index 0000000..e69de29 diff --git a/snapserver/Dockerfile b/snapserver/Dockerfile new file mode 100644 index 0000000..cf6e905 --- /dev/null +++ b/snapserver/Dockerfile @@ -0,0 +1,27 @@ +# make snapweb files +FROM ubuntu AS builder + +ENV TZ=Europe/Berlin +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN apt-get update && apt-get install -y git make node-typescript + +WORKDIR / +RUN git clone https://github.com/badaix/snapweb.git +WORKDIR /snapweb +RUN make + +# Install SnapServer on minimal OS +FROM alpine + +RUN apk add --no-cache snapcast + +ADD ["snapserver.conf", "/etc/snapserver.conf"] +COPY --from=builder snapweb/dist /usr/share/snapserver/snapweb +# stream port (1704) +EXPOSE 1704 +# control port (1705) +EXPOSE 1705 +# http port (1780) +EXPOSE 1780 + +ENTRYPOINT ["snapserver"] diff --git a/snapserver/snapserver.conf b/snapserver/snapserver.conf new file mode 100644 index 0000000..8a34b53 --- /dev/null +++ b/snapserver/snapserver.conf @@ -0,0 +1,165 @@ +############################################################################### +# ______ # +# / _____) # +# ( (____ ____ _____ ____ ___ _____ ____ _ _ _____ ____ # +# \____ \ | _ \ (____ || _ \ /___)| ___ | / ___)| | | || ___ | / ___) # +# _____) )| | | |/ ___ || |_| ||___ || ____|| | \ V / | ____|| | # +# (______/ |_| |_|\_____|| __/ (___/ |_____)|_| \_/ |_____)|_| # +# |_| # +# # +# Snapserver config file # +# # +############################################################################### + +# default values are commented +# uncomment and edit to change them + +# Settings can be overwritten on command line with: +# "--
.=", 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 +#pidfile = /var/run/snapserver/pid + +# the user to run as when daemonized +#user = snapserver +# the group to run as when daemonized +#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 = + +# +############################################################################### + + +# 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 = 0.0.0.0 + +# which port the server should listen to +#port = 1780 + +# serve a website from the doc_root location +# disabled if commented or empty +doc_root = /usr/share/snapserver/snapweb +# +############################################################################### + + +# 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 = 0.0.0.0 + +# 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 = 0.0.0.0 + +# 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: +# : 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=[&codec=][&sampleformat=][&chunk_ms=] +# 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 +# Non blocking sources support the dryout_ms parameter: when no new data is read from the source, send silence to the clients +# Available types are: +# pipe: pipe:///?name=[&mode=create][&dryout_ms=2000], mode can be "create" or "read" +# librespot: librespot:///?name=[&dryout_ms=2000][&username=&password=][&devicename=Snapcast][&bitrate=320][&wd_timeout=7800][&volume=100][&onevent=""][&nomalize=false][&autoplay=false][¶ms=] +# note that you need to have the librespot binary on your machine +# sampleformat will be set to "44100:16:2" +# file: file:///?name= +# process: process:///?name=[&dryout_ms=2000][&wd_timeout=0][&log_stderr=false][¶ms=] +# airplay: airplay:///?name=[&dryout_ms=2000][&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://:?name=[&mode=server] +# tcp client: tcp://:?name=&mode=client +# alsa: alsa://?name=&device=[&send_silence=false][&idle_threshold=100] +# meta: meta://///.../?name= +source = pipe:///tmp/snapfifo?name=default +#source = tcp://127.0.0.1?name=mopidy_tcp + +# Default sample format +#sampleformat = 48000:16:2 + +# Default transport codec +# (flac|ogg|opus|pcm)[:options] +# Type codec:? to get codec specific options +#codec = flac + +# Default source stream read chunk size [ms] +#chunk_ms = 20 + +# Buffer [ms] +#buffer = 1000 + +# Send audio to muted clients +#send_to_muted = false +# +############################################################################### + + +# Logging options ############################################################# +# +[logging] + +# log sink [null,system,stdout,stderr,file:] +# when left empty: if running as daemon "system" else "stdout" +#sink = + +# log filter :[,:]* +# with tag = * or and level = [trace,debug,info,notice,warning,error,fatal] +#filter = *:info +# +###############################################################################