1
0
mirror of https://github.com/kmein/niveum synced 2026-03-28 23:31:07 +01:00

4 Commits

5 changed files with 136 additions and 46 deletions

View File

@@ -3,11 +3,39 @@ let
streams = import <niveum/lib/streams.nix> {
di-fm-key = lib.strings.fileContents <secrets/di.fm/key>;
};
multi-room-audio-port = 8000;
in
{
imports = [ <niveum/modules/mpd-fm.nix> ];
imports = [
<niveum/modules/mpd-fm.nix>
];
environment.systemPackages = [ pkgs.ncmpcpp pkgs.mpc_cli ];
services.mpd = {
enable = true;
extraConfig = ''
log_level "default"
auto_update "yes"
audio_output {
type "alsa"
name "zaatar single room audio system"
}
audio_output {
type "httpd"
name "zaatar multi room audio system"
encoder "vorbis" # optional
port "${toString multi-room-audio-port}"
quality "5.0" # do not define if bitrate is defined
# bitrate "128" # do not define if quality is defined
format "44100:16:2"
always_on "yes" # prevent MPD from disconnecting all listeners when playback is stopped.
tags "yes" # httpd supports sending tags to listening streams.
}
'';
};
environment.systemPackages = [ pkgs.mpc_cli ];
services.mpd-fm = {
enable = true;
@@ -15,7 +43,7 @@ in
webPort = 8080;
};
systemd.services.antenne-asb =
systemd.services.mpd-fm-stations =
let
stations = lib.lists.imap0 (id: {desc ? "", logo ? "https://picsum.photos/seed/${builtins.hashString "md5" stream}/300", stream, station}: { inherit id desc logo stream station; }) streams;
stationsJson = pkgs.writeText "stations.json" (builtins.toJSON stations);
@@ -33,44 +61,22 @@ in
'';
};
services.mpd.enable = true;
networking.firewall.allowedTCPPorts = [ 80 ];
services.nginx = {
upstreams."mpd-fm-socket" = {
extraConfig = ''
server 127.0.0.1:${toString config.services.mpd-fm.webPort};
'';
};
appendHttpConfig = ''
map $http_upgrade $connection_upgrade {
default upgrade;
''' close;
}
'';
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts.default = {
basicAuth.dj = lib.strings.fileContents <system-secrets/mpd-web.key>;
locations."~ ^/listen" = {
proxyPass = "http://127.0.0.1:${toString multi-room-audio-port}";
};
locations."/" = {
proxyPass = "http://mpd-fm-socket";
extraConfig = ''
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
''; # generate password hash with `openssl passwd -apr1`
proxyPass = "http://127.0.0.1:${toString config.services.mpd-fm.webPort}";
proxyWebsockets = true;
};
};
};
/*
# dont let anyone outside localhost or local network in
networking.firewall.extraCommands =
let
mpd-fm-port = toString config.services.mpd-fm.webPort;
in ''
${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 192.168.0.0/16 -j ACCEPT
${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 10.243.2.4 -j ACCEPT
${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 127.0.0.0/8 -j ACCEPT
${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -j DROP
'';
*/
}

View File

@@ -23,6 +23,9 @@ let
radiosai-name = name: "${name} | Radiosai";
radiosai = name: "https://stream.sssmediacentre.org/${name}";
royal-name = name: "${name} | RoyalRadio";
royal = name: "http://193.33.170.218:8000/${name}";
caster-fm = subdomain: port: "http://${subdomain}.caster.fm:${toString port}/listen.mp3?authn0b0236758bd0e178156d0787327a055d";
in [
{
@@ -880,7 +883,7 @@ in [
{
desc = "Dance & Pop";
logo = "https://www.housetime.fm/content/images/site/logo-housetime.fm.png";
station = we-are-one-name "HousTime.FM";
station = we-are-one-name "HouseTime.FM";
stream = we-are-one "housetime";
}
{
@@ -1001,7 +1004,7 @@ in [
}
{
station = rautemusik-name "Wacken Radio";
desc = "Metal, Heavy MetaL";
desc = "Metal, Heavy Metal";
stream = rautemusik "wackenradio";
}
{
@@ -1170,7 +1173,7 @@ in [
desc = "HandsUp, Dance, Hard Dance";
}
{
station = rautemusik-name "charthits";
station = rautemusik-name "ChartHits";
stream = rautemusik "ChartHits";
desc = "House, RnB, Dance, Electro";
}
@@ -1261,7 +1264,7 @@ in [
logo = "https://www.liveradio.ie/files/images/115731/resized/180x172c/rte_radio_1_extra.jpg";
station = rte-name "Radio 1 Extra";
stream = rte "radio1extra";
desc = "RTE Radio 1 Extra (aka RTE Radio 1xtra) - Quality speech radio from home and abroad.";
desc = "RTE Radio 1 Extra (aka RTE Radio 1xtra) Quality speech radio from home and abroad.";
}
{
logo = "https://cdn-profiles.tunein.com/s96877/images/logoq.png";
@@ -1303,9 +1306,43 @@ in [
stream = radiosai "ameri";
desc = "The voice of pure love.";
}
{
stream = royal "RoyalPopsa";
station = royal-name "Popsa";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyalTrance";
station = royal-name "Trance";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyalDrum";
station = royal-name "Drum";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyalTrap";
station = royal-name "Trap";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyalRock";
station = royal-name "Rock";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyalLounge";
station = royal-name "Lounge";
desc = "из Санкт-Петербурга";
}
{
stream = royal "RoyaLove";
station = royal-name "Love";
desc = "из Санкт-Петербурга";
}
]
/*
(caster-fm "Antenne-ASB.ga" "shaincast" 17656)
(caster-fm "TODO" "noasrv" 10182) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u
(caster-fm "TODO" "shaincast" 20866) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u
*/

View File

@@ -4,8 +4,8 @@ mkYarnPackage rec {
src = fetchFromGitHub {
owner = "kmein";
repo = "MPD.FM";
rev = "c7cbaa4ce3b350f26cad54378db22c8ec58d987b";
sha256 = "1iklzbaji7ls01jfi1r0frhjq2i1w29kmar7vgw32f5mgj19cyvd";
rev = "5f309c2579a9cbbbc4f7eb6a2e2f3993cc177630";
sha256 = "0ladh96s656i7yd9qxrpqq4x513r88zas7112rqn5sgxxaccbh72";
};
packageJSON = "${src}/package.json";
yarnLock = ./yarn.lock;

View File

@@ -1,12 +1,30 @@
#!/bin/sh
send_irc() {
echo "
USER $USER $(hostname) tolmoon $USER
NICK musikkritiker
JOIN #the_playlist
PRIVMSG #the_playlist $*
QUIT
" | nc irc.freenode.net 6667 >/dev/null
}
endpoint=prism.r:8001
case "$1" in
good|like|cool|nice|yes|+)
curl -sS -XPOST "$endpoint/good";;
send_irc 'nice!' &
curl -sS -XPOST "$endpoint/good"
;;
skip|next|bad|sucks|no|nope|-)
curl -sS -XPOST "$endpoint/skip";;
send_irc 'sucks' &
curl -sS -XPOST "$endpoint/skip"
;;
*)
curl -sS -XGET "$endpoint/current" | jq;;
curl -sS -XGET "$endpoint/current" | jq
;;
esac
wait

View File

@@ -27,6 +27,35 @@
];
}
{
users.extraUsers.kiosk = {
isNormalUser = true;
password = "";
extraGroups = [ "audio" ];
};
services.cage = {
enable = true;
user = config.users.extraUsers.kiosk.name;
extraArguments = [ "-s" ]; # allow vt switching
program =
let startUrl = "http://localhost:${toString config.services.mpd-fm.webPort}";
in pkgs.writers.writeDash "kiosk-browser" ''
while true; do
${pkgs.chromium}/bin/chromium \
--no-first-run --no-message-box --noerrdialogs \
--default-browser --no-default-browser-check \
--start-maximized ${startUrl}
sleep 0.5
done
'';
};
systemd.services.cage-tty1.environment.XKB_DEFAULT_LAYOUT = "de";
programs.chromium = {
enable = true;
extensions = [
"cjpalhdlnbpafiamejdnhcphjbkeiagm" # uBlock Origin
];
};
}{
environment.systemPackages = [ pkgs.tmux ];
systemd.services.turntables = {
description = "music controller session";