{ pkgs, config, ... }: { programs.beets = { enable = true; package = pkgs.beets.override { pluginOverrides = { beatport.enable = true; }; }; settings = { library = "${config.xdg.dataHome}/beets/library.db"; art_filename = "cover"; directory = "${config.xdg.userDirs.music}/beets"; ui = { color = true; }; import = { # link, instead of copying or moving the files copy = false; move = false; link = true; # Don't try to import already imported directories incremental = true; # Write the metadata to the files write = true; log = "beetslog.txt"; }; paths = { default = "$genre/$albumartist/$album/$track $title"; comp = "$genre/$album/$track $title"; singleton = "$genre/$artist/$title"; "albumtype:soundtrack" = "Soundtracks/$album/$track $title"; }; # Plugin config lastgenre = { prefer_specific = false; # Lookup the track, not the album source = "track"; }; fetchart = {}; lyrics = { # Always fetch lyrics (and update them, if some were found) force = true; }; hook = { hooks = [ { # Called, when `beet import` finishes event = "import"; command = "echo 'Import finished. Starting to calculate replay gain..'"; } { # Called, when `beet import` finishes event = "import"; command = "beet replaygain"; } ]; }; replaygain = { # Can't run in parallel in the import because of writing issues, thus we run it # after the import finishes (see the `hooks` config) auto = false; backend = "ffmpeg"; # Re-calculate the replay gain value even for files, that already have one set. overwrite = true; }; # scrub = { # auto = true; # }; plugins = [ # Remove all previous tags before import (this is useful to ensure, that # the metadata in the libary.db is synced with the tags on disk) # # FIXME: I think, that this also removes the baked-in images, which is not ideal # <2024-08-07> # "scrub" # Calculate replay gain "replaygain" # Generate fingerprints "chroma" # Download album art "fetchart" # Fetches tags from `last.fm` and adds them as genres to imported music "lastgenre" # Run commands on events "hook" # Fetch lyrics "lyrics" # Allow beets to understand deezer id's "deezer" "mpdstats" # Transfer MPD stats to beets "mpdupdate" # Update MPD database on import ]; musicbrainz = { # Search for deezer id's and use them in the autotagger external_ids = { deezer = true; }; }; # Log-on config # TODO: Add this, to upload the generated fingerprints (to help improve their # database) <2024-08-07> # acoustid = { # apikey = "TODO"; # }; }; mpdIntegration = { enableStats = true; enableUpdate = true; host = config.home.sessionVariables.MPD_HOST; }; }; }