nix-da/home/terminal/beets.nix
2025-03-23 16:17:28 +01:00

151 lines
3.6 KiB
Nix

{
pkgs,
lib,
osConfig,
config,
...
}:
let
inherit (lib) concatStringsSep listToAttrs;
inherit (lib.my) getExe;
plugins = [
"convert"
"chroma"
"inline"
"fish"
"fetchart"
"lastgenre"
"scrub"
"duplicates"
"info"
"missing"
"unimported"
"badfiles"
"embedart"
"play"
];
mkConf =
a:
let
mkGroup = name: values: ''
${name} {
${lib.concatStringsSep "\n\t" values}
}'';
stringify = lib.mapAttrsToList (
name: value:
if lib.isAttrs value then
mkGroup name (stringify value)
else if (lib.isInt value || lib.isFloat value) then
''${name} "${toString value}"''
else
''${name} "${value}"''
);
in
concatStringsSep "\n" (stringify a);
mpdSocket = "/run/user/${toString osConfig.users.users.${config.home.username}.uid}/mpd/socket";
in
{
config = {
services.mpd = {
enable = true;
extraConfig = mkConf {
auto_update = "yes";
log_file = "syslog";
bind_to_address = mpdSocket;
audio_output = {
type = "pipewire";
name = "PipeWire Sound Server";
};
};
};
programs.beets = {
package = pkgs.beets.override {
pluginOverrides = listToAttrs (
map (name: {
value.enable = true;
inherit name;
}) plugins
);
};
settings = {
plugins = concatStringsSep " " plugins;
directory = "/mnt/music";
library = "/mnt/music/library.db";
per_disc_numbering = "yes";
asciify_paths = true;
convert = {
auto = "yes";
format = "flac";
never_convert_lossy_files = "yes";
};
play = {
command =
let
mpc = "${getExe pkgs.mpc} --host=\"${mpdSocket}\"";
ncmpcpp = getExe pkgs.ncmpcpp;
command = pkgs.writers.writeFishBin "play-command" ''
set playlist "$argv[1]";
${mpc} clear;
${mpc} load "$playlist";
rm "$playlist";
${mpc} play;
${ncmpcpp} $args;
'';
in
"${command}/bin/play-command";
};
embedart = {
maxwidth = 500;
};
fetchart = {
auto = true;
cover_format = "jpg";
minheight = 500;
minwidth = 500;
enforce_ratio = true;
high_resolution = true;
};
duplicates = {
count = true;
};
lastgenre = {
auto = "yes";
count = 5;
separator = ";";
};
replace = {
"[\\\\/]" = "_";
"^\\." = "_";
"[\\x00-\\x1f]" = "_";
"\\.$" = "_";
"\\s+$" = "";
"^\\s+" = "";
"^-" = "_";
};
import = {
incremental = "yes";
bell = "yes";
languages = "en";
};
item_fields = {
disc_and_track = # python
"u'%02i.%02i' % (disc, track) if disctotal > 1 else u'%02i' % (track)";
primary_albumartist = # python
''
if albumartist.lower().strip().startswith(albumartists[0].lower().strip()):
return albumartists[0]
else:
return None
'';
};
paths = {
default = "%ifdef{primary_albumartist, $primary_albumartist, $albumartist}/$album%aunique{}/$disc_and_track - $artist - $title";
};
};
};
};
}