nix-infra/modules/services/audio/shairport-sync.nix
jopejoe1 4fc8e31df0
Remove version lock for shairport-sync
The current version in nixpkgs is newer than the one we are currently locking, the nqptp fix was also already in nixpkgs.

Co-authored-by: c6ristian <c6ristian@christian.moe>
2024-11-04 23:35:22 +01:00

114 lines
4.1 KiB
Nix

# Sources for this configuration:
# - https://github.com/mikebrady/shairport-sync/blob/f5c4b51da827a7f8d9a72a1b6f986807aba47bfc/AIRPLAY2.md
# - https://github.com/mikebrady/nqptp
# - https://github.com/mikebrady/nqptp/blob/050a8c2de9f3e1f4859abf9b36d2f18afd4c34d7/nqptp.service.in
{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.ccchh.services.audio;
in
{
config = mkIf cfg.enable {
services.shairport-sync = {
enable = true;
arguments = "-o pw -v";
};
users.users.shairport.extraGroups = [ "pipewire" "audio" ];
environment.etc.shairport-sync-config = {
enable = true;
text = ''
// Config for MQTT and metadata.
// For reference see:
// https://github.com/mikebrady/shairport-sync/blob/8c607e2d61ea5fde8ed0b48b2471a543840c31e6/scripts/shairport-sync.conf
// https://github.com/mikebrady/shairport-sync/blob/0f0f65b67649d4a25d06f13b56a6077a90b0f6cc/MQTT.md
general =
{
name = "${cfg.name}";
}
metadata =
{
enabled = "yes"; // set this to yes to get Shairport Sync to solicit metadata from the source and to pass it on via a pipe
include_cover_art = "yes"; // set to "yes" to get Shairport Sync to solicit cover art from the source and pass it via the pipe. You must also set "enabled" to "yes".
cover_art_cache_directory = "/tmp/shairport-sync/.cache/coverart"; // artwork will be stored in this directory if the dbus or MPRIS interfaces are enabled or if the MQTT client is in use. Set it to "" to prevent caching, which may be useful on some systems
pipe_name = "/tmp/shairport-sync-metadata";
pipe_timeout = 5000; // wait for this number of milliseconds for a blocked pipe to unblock before giving up
};
mqtt =
{
enabled = "yes"; // set this to yes to enable the mqtt-metadata-service
hostname = "mqtt.ccchh.net"; // Hostname of the MQTT Broker
port = 1883; // Port on the MQTT Broker to connect to
// publish_raw = "no"; //whether to publish all available metadata under the codes given in the 'metadata' docs.
publish_parsed = "yes"; //whether to publish a small (but useful) subset of metadata under human-understandable topics
publish_cover = "yes"; //whether to publish the cover over mqtt in binary form. This may lead to a bit of load on the broker
// enable_remote = "yes"; //whether to remote control via MQTT. RC is available under `topic`/remote.
};
'';
target = "shairport-sync.conf";
};
systemd.services.shairport-sync = {
serviceConfig = {
Restart = "on-failure";
};
};
users.users.nqptp = {
isSystemUser = true;
group = "nqptp";
};
users.groups.nqptp = { };
systemd.services.nqptp = {
enable = true;
description = "NQPTP -- Not Quite PTP";
unitConfig = {
Wants = [ "network-online.target" ];
After = [ "network.target" "network-online.target" ];
Before = [ "shairport-sync.service" ];
};
serviceConfig = {
ExecStart = "${pkgs.nqptp}/bin/nqptp";
User = "nqptp";
Group = "nqptp";
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
Restart = "on-failure";
};
wantedBy = [ "multi-user.target" ];
};
# See here for docs:
# https://github.com/mikebrady/shairport-sync/blob/4ca5a15de2d53c69e6c3c23b0440c27978bb91df/TROUBLESHOOTING.md#ufw-firewall-blocking-ports-commonly-includes-raspberry-pi
# These docs seem like they also include the ports for AirPlay 1. Since we're
# doing just AirPlay 2, we can have a more restrictive firewall than
# documented there.
# This more restritive firewall also matches with a packet capture I did.
networking.firewall = {
allowedTCPPorts = [ 7000 ];
allowedUDPPorts = [ 319 320 5353 ];
allowedTCPPortRanges = [
{
from = 32768;
to = 60999;
}
];
allowedUDPPortRanges = [
{
from = 32768;
to = 60999;
}
];
};
};
}