{ config, lib, pkgs, ... }: let inherit (lib) mkIf; cfg = config.pepe.services.navidrome; in { options.pepe.services.navidrome = with lib; { enable = mkEnableOption "Enable navidrome"; package = mkPackageOption pkgs "navidrome" { }; domain = mkOption { type = types.str; default = null; }; musicFolder = mkOption { type = types.str; default = "/media/Music"; description = "Path to the music library"; }; beetsConfig = mkOption { type = types.str; default = "/media/beets.conf"; description = "Path to the beets configuration file"; }; settings = mkOption { type = types.attrs; default = {}; description = "Additional settings for Navidrome"; }; }; config = mkIf cfg.enable { services.navidrome = { enable = true; package = cfg.package; settings = { MusicFolder = cfg.musicFolder; LastFM.enable = true; LastFM.ApiKey = "5cef5cb5f9d31326b97d0f929ca9cf20"; LastFM.Secret = "d1296896126f4caae47407aecf080b25"; Spotify.ID = "3900c029b4f34f3fb61d554dda64794d"; Spotify.Secret = "d931ce5575a9401aa5ff8d37558cca0a"; EnableGravatar = true; LogLevel = "WARN"; } // cfg.settings; }; pepe.core.vhost.hosts.${cfg.domain} = with config.pepe.core.network; { dnsInterfaces = [ interfaceTypes.lan interfaceTypes.vpn ]; locations."/" = { port = 4533; allowLan = true; allowWAN = true; }; }; systemd.services = { "beets-update" = { enable = true; before = [ "beets-import.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${pkgs.beets}/bin/beet -c ${cfg.beetsConfig} update"; }; }; "beets-import" = { enable = true; path = [ pkgs.imagemagick ]; requires = [ "beets-update.service" ]; after = [ "beets-update.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${pkgs.beets}/bin/beet -c ${cfg.beetsConfig} import --flat -q ${cfg.musicFolder}"; }; startAt = "weekly"; }; }; pepe.core.media.groupMembers = mkIf config.pepe.core.media.enable [ "navidrome" ]; }; }