This commit is contained in:
Tobias Reisinger 2023-08-08 19:29:03 +02:00
commit 39073d8f3a
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
15 changed files with 297 additions and 0 deletions

23
README.md Normal file
View file

@ -0,0 +1,23 @@
# Home Assistant add-on repository
Add-on documentation: <https://developers.home-assistant.io/docs/add-ons>
[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgit.serguzim.me%2Fserguzim%2Fhome-assistant-addons)
## Add-ons
This repository contains the following add-ons
### [Snapcast](./snapcast)
![Supports aarch64 Architecture][aarch64-shield]
![Supports amd64 Architecture][amd64-shield]
![Supports armhf Architecture][armhf-shield]
![Supports armv7 Architecture][armv7-shield]
![Supports i386 Architecture][i386-shield]
[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg
[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg
[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg
[armv7-shield]: https://img.shields.io/badge/armv7-yes-green.svg
[i386-shield]: https://img.shields.io/badge/i386-yes-green.svg

4
repository.yml Normal file
View file

@ -0,0 +1,4 @@
# https://developers.home-assistant.io/docs/add-ons/repository#repository-configuration
name: serguzim.net Home Assistant Addons
url: 'https://git.serguzim.me/serguzim/home-assistant-addons'
maintainer: Tobias Reisinger <tobias@msrg.cc>

1
snapcast/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.env

39
snapcast/Dockerfile Normal file
View file

@ -0,0 +1,39 @@
ARG BUILD_FROM
FROM $BUILD_FROM
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \
apk update && \
apk add \
gst-plugins-good \
gst-plugins-bad \
librespot \
mopidy \
nginx \
py3-pip \
snapcast-server \
supervisor && \
python3 -m pip install Mopidy-Mobile && \
echo "daemon off;" >> /etc/nginx/nginx.conf
COPY data/supervisord.conf /etc/supervisord.conf
COPY data/snapserver.conf /etc/snapserver.conf
COPY data/config.js /usr/share/snapserver/snapweb/config.js
COPY data/mopidy-extra.conf /etc/mopidy/extra.conf
COPY data/Radios.m3u8.gtpl /templates/Radios.m3u8.gtpl
COPY data/nginx-site.gtpl /templates/nginx-site.gtpl
COPY data/run.sh /run.sh
RUN chmod a+x /run.sh
EXPOSE 1704 1705 6680
ENV LIBRESPOT_BACKEND=pipe
ENV LIBRESPOT_DEVICE=/tmp/snapfifo_librespot
ENV LIBRESPOT_NAME=Snapcast
ENV LIBRESPOT_AUTOPLAY=true
ENV LIBRESPOT_VOLUME=100
CMD [ "/run.sh" ]

31
snapcast/config.yaml Normal file
View file

@ -0,0 +1,31 @@
name: "Snapcast"
description: "Snapcast server with librespot and mopidy"
version: "0.0.8"
slug: "snapcast"
init: false
ingress: true
startup: application
panel_icon: mdi:cast-audio
arch:
- aarch64
- amd64
- armhf
- armv7
- i386
ports:
1704/tcp: 1704
1705/tcp: 1705
6680/tcp: 6680
options:
spotify_username: null
spotify_password: null
radios:
- name: null
url: null
schema:
spotify_username: str
spotify_password: password
radios:
- name: str
url: str

View file

@ -0,0 +1,5 @@
#EXTM3U
{{- range fromJson .radios}}
#EXTINF:-1,{{.name}}
{{.url}}
{{- end}}

18
snapcast/data/config.js Normal file
View file

@ -0,0 +1,18 @@
"use strict";
let base_url = window.location.pathname.replace(/\/$/, '');
let config = {
baseUrl: (window.location.protocol === 'https:' ? 'wss://' : 'ws://') + window.location.host + base_url,
};
window.addEventListener("DOMContentLoaded", (event) => {
let mopidy_link = document.createElement('a');
//mopidy_link.href = window.location.protocol + '//' + window.location.host + base_url + '/mobile/';
mopidy_link.href = window.location.protocol + '//' + window.location.hostname + ':6680/mobile/';
mopidy_link.target = '_blank';
mopidy_link.innerHTML = 'Mopidy';
document.getElementById('show').parentNode.appendChild(mopidy_link);
});

View file

@ -0,0 +1,9 @@
[audio]
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! wavenc ! tcpclientsink host=127.0.0.1 port=4953
[http]
enabled = true
hostname = 0.0.0.0
port = 6680
csrf_protection = true
default_app = mobile

View file

@ -0,0 +1,39 @@
server {
listen {{ .interface }}:8099 default_server;
allow 172.30.32.2;
deny all;
absolute_redirect off;
location /mobile/ {
if ($request_uri ~ ^([^.\?]*[^/])$) {
return 301 {{ .entry }}$1/;
}
proxy_pass http://localhost:6680;
sub_filter_once off;
sub_filter_types *;
sub_filter '/mobile/' '{{ .entry }}/mobile/';
sub_filter '/mopidy/ws' '{{ .entry }}/mopidy/ws';
}
location /mopidy/ws {
proxy_pass http://localhost:6680;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
}
location / {
proxy_pass http://localhost:1780;
}
location ~ ^/(jsonrpc|stream) {
proxy_pass http://localhost:1780;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
}
}

20
snapcast/data/run.sh Normal file
View file

@ -0,0 +1,20 @@
#!/usr/bin/with-contenv bashio
_librespot_username=$(bashio::config 'spotify_username')
export LIBRESPOT_USERNAME="$_librespot_username"
_librespot_password=$(bashio::config 'spotify_password')
export LIBRESPOT_PASSWORD="$_librespot_password"
bashio::var.json \
interface "$(bashio::addon.ip_address)" \
entry "$(bashio::addon.ingress_entry)" \
| tempio \
-template "/templates/nginx-site.gtpl" \
-out "/etc/nginx/http.d/default.conf"
bashio::var.json radios "$(bashio::config 'radios' | jq -cMs .)" \
| tempio \
-template "/templates/Radios.m3u8.gtpl" \
-out "/var/lib/mopidy/playlists/Radios.m3u8"
supervisord -c /etc/supervisord.conf

View file

@ -0,0 +1,14 @@
[stream]
source = pipe:///tmp/snapfifo?name=Default
source = tcp://127.0.0.1:4953?name=Mopidy
#source = librespot:///usr/bin/librespot?name=Spotify&devicename=Snapcast&autoplay=true&volume=90
source = pipe:///tmp/snapfifo_librespot?name=Spotify&sampleformat=44100:16:2
[logging]
filter = debug
[http]
doc_root = /usr/share/snapserver/snapweb/
[streaming_client]
initial_volume = 10

View file

@ -0,0 +1,58 @@
[supervisord]
nodaemon=true
logfile=/dev/null
logfile_maxbytes=0
pidfile=/run/supervisord.pid
user=root
[program:nginx]
command=nginx
priority=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true
autorestart=true
user=root
[program:snapcast-server]
command=snapserver
priority=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true
autorestart=true
user=root
[program:mopidy]
command=mopidy --config /etc/mopidy/
priority=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true
autorestart=true
user=root
[program:librespot]
command=librespot
priority=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
killasgroup=true
stopasgroup=true
autostart=true
autorestart=true
user=root

22
snapcast/docker-bake.hcl Normal file
View file

@ -0,0 +1,22 @@
variable "REG" {
default = "registry.serguzim.me"
}
variable "REPO" {
default = "smarthome/audio"
}
variable "TAG" {
default = "latest"
}
group "default" {
targets = ["production"]
}
target "production" {
dockerfile = "./Dockerfile"
output = ["type=docker"]
tags = ["${REG}/${REPO}:latest", "${REG}/${REPO}:${TAG}"]
args = {
BUILD_FROM = "ghcr.io/home-assistant/amd64-base"
}
}

View file

@ -0,0 +1,14 @@
services:
app:
build:
context: .
image: registry.serguzim.me/smarthome/audio
restart: always
env_file:
- .env
ports:
- "8099:8099"
- "6680:6680"
- "1704:1704"
- "1705:1705"
- "1780:1780"

BIN
snapcast/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB