{ config, lib, pkgs, ... }: let spotifyd_cache_dir = "/tmp/spotifyd"; inherit (config.grimmShared) enable spotify; spotifyd-dbus = pkgs.writeTextDir "share/dbus-1/system.d/org.mpris.MediaPlayer2.spotifyd.conf" '' ''; in { config = lib.mkIf (enable && spotify.spotifyd.enable) { environment.systemPackages = [ pkgs.spotifyd spotifyd-dbus ]; systemd.services.init-spotifyd-cache-dir = { description = "Create the spotifyd cache dir"; wantedBy = [ "multi-user.target" ]; serviceConfig.Type = "oneshot"; script = '' mkdir -p ${spotifyd_cache_dir} chown spotifyd:spotifyd -R ${spotifyd_cache_dir} ''; }; grimmShared = { sound.enable = true; network = true; }; services.pipewire.systemWide = true; # required for spotifyd as spotifyd runs as the spotifyd user # spotifyd config services.spotifyd = { enable = true; settings.global = { bitrate = 320; username = spotify.spotifyd.username; device_name = "grimm_laptop"; password_cmd = let pass = spotify.spotifyd.pass; inherit (lib) isPath isString getExe getExe'; in if (isPath pass || isString pass) then "${getExe' pkgs.coreutils-full "cat"} ${pass}" else (getExe pass); device_type = "computer"; dbus_type = "system"; device = "default"; control = "default"; volume_controller = "softvol"; # no_audio_cache = true; spotifyd_cache_dir = spotifyd_cache_dir; max_cache_size = 10000000000; initial_volume = "90"; backend = "alsa"; # fixme }; }; services.dbus.packages = [ spotifyd-dbus ]; # spotifyd has access to global pipewire users.users.spotifyd = { isSystemUser = true; group = "spotifyd"; extraGroups = [ "audio" "pipewire" ]; }; # spotifyd is also a group users.groups.spotifyd = { }; }; options.grimmShared.spotify.spotifyd = with lib; { enable = mkEnableOption "grimm-spotify-tui"; username = mkOption { type = types.nonEmptyStr; description = "spotify username"; }; pass = mkOption { type = types.either types.nonEmptyStr (types.either types.package types.path); description = "command to execute to obtain login information or readable path to a file containing them"; }; }; }