115 lines
3.2 KiB
Nix
115 lines
3.2 KiB
Nix
|
{
|
||
|
config,
|
||
|
pkgs,
|
||
|
tree,
|
||
|
...
|
||
|
}: let
|
||
|
alsaDevice = "sysdefault:CARD=BTR3K";
|
||
|
pipewireDevice = "alsa_output.usb-FiiO_FiiO_BTR3K_ABCDEF0123456789-00.analog-stereo";
|
||
|
hardwareVolume = 75;
|
||
|
|
||
|
startMusicPlayer = pkgs.writeShellScriptBin "startMusicPlayer" ''
|
||
|
exec ${pkgs.mpv}/bin/mpv \
|
||
|
"https://music:$(cat /secrets/music_stream_password)@mpd.owo.monster/flac" \
|
||
|
--cache=yes --cache-pause-initial=yes --cache-pause-wait=5 \
|
||
|
--vo=gpu --force-window --script-opts-append=osc-visibility=always \
|
||
|
--ao=pipewire --audio-device="pipewire/${pipewireDevice}"
|
||
|
'';
|
||
|
startMusicPlayerSession = pkgs.writeShellScriptBin "startMusicPlayerSession" ''
|
||
|
set -x
|
||
|
export XDG_RUNTIME_DIR=/run/user/$UID
|
||
|
|
||
|
dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
||
|
systemctl --user start dbus pipewire
|
||
|
|
||
|
${pkgs.alsa-utils}/bin/amixer -D ${alsaDevice} sset PCM "${toString hardwareVolume}%"
|
||
|
|
||
|
exec systemd-inhibit --what=sleep:idle:handle-lid-switch ${startMusicPlayer}/bin/startMusicPlayer
|
||
|
'';
|
||
|
in {
|
||
|
imports = with tree; [
|
||
|
profiles.connectivity.networkManager
|
||
|
profiles.wifiHardware
|
||
|
];
|
||
|
|
||
|
environment.systemPackages = [startMusicPlayer startMusicPlayerSession];
|
||
|
|
||
|
users.users.music-player = {
|
||
|
isNormalUser = true;
|
||
|
linger = true;
|
||
|
extraGroups = [
|
||
|
"video"
|
||
|
"input"
|
||
|
"audio"
|
||
|
"rtkit"
|
||
|
];
|
||
|
};
|
||
|
|
||
|
home-manager.users.music-player = {
|
||
|
programs.mpv.enable = true;
|
||
|
imports = with tree; [
|
||
|
home.base
|
||
|
home.apps.kitty
|
||
|
home.apps.pavucontrol
|
||
|
];
|
||
|
home.stateVersion = "23.05";
|
||
|
};
|
||
|
|
||
|
systemd.services."music-player" = {
|
||
|
enable = true;
|
||
|
after = [
|
||
|
"systemd-user-sessions.service"
|
||
|
"plymouth-start.service"
|
||
|
"plymouth-quit.service"
|
||
|
"systemd-logind.service"
|
||
|
"getty@tty1.service"
|
||
|
"network.target"
|
||
|
];
|
||
|
before = ["music-player.target"];
|
||
|
wants = ["dbus.socket" "network.target" "systemd-logind.service" "plymouth-quit.service"];
|
||
|
wantedBy = ["music-player.target"];
|
||
|
conflicts = ["getty@tty1.service"];
|
||
|
|
||
|
restartIfChanged = true;
|
||
|
unitConfig.ConditionPathExists = "/dev/tty1";
|
||
|
serviceConfig = {
|
||
|
ExecStart = ''
|
||
|
${pkgs.cage}/bin/cage -s ${startMusicPlayerSession}/bin/startMusicPlayerSession
|
||
|
'';
|
||
|
User = "music-player";
|
||
|
StandardOutput = "append:/var/log/music-player.log";
|
||
|
StandardError = "inherit";
|
||
|
IgnoreSIGPIPE = "no";
|
||
|
UtmpIdentifier = "%n";
|
||
|
UtmpMode = "user";
|
||
|
TTYPath = "/dev/tty1";
|
||
|
TTYReset = "yes";
|
||
|
TTYVHangup = "yes";
|
||
|
TTYVTDisallocate = "yes";
|
||
|
StandardInput = "tty-fail";
|
||
|
PAMName = "music-player";
|
||
|
};
|
||
|
environment = {
|
||
|
XDG_RUNTIME_DIR = "/run/user/1001";
|
||
|
XDG_SESSION_TYPE = "wayland";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
security.polkit.enable = true;
|
||
|
|
||
|
security.pam.services.music-player.text = ''
|
||
|
auth required pam_unix.so nullok
|
||
|
account required pam_unix.so
|
||
|
session required pam_unix.so
|
||
|
session required pam_env.so conffile=/etc/pam/environment readenv=0
|
||
|
session required ${config.systemd.package}/lib/security/pam_systemd.so
|
||
|
'';
|
||
|
|
||
|
hardware.opengl.enable = true;
|
||
|
|
||
|
systemd.targets.music-player = {
|
||
|
description = "Music player";
|
||
|
wants = ["music-player.service" "networkmanager.service"];
|
||
|
};
|
||
|
}
|