about summary refs log tree commit diff stats
path: root/modules/home.legacy/conf/beets
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-18 17:07:46 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-18 17:07:46 +0200
commitc52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c (patch)
treee8b947710b467b32740598ff574982097836f66c /modules/home.legacy/conf/beets
parentchore(pkgs/yt): 1.2.1 -> 1.3.0 (diff)
downloadnixos-config-c52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c.tar.gz
nixos-config-c52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c.zip
refactor(modules): Move all system modules to `by-name`
From now on all modules should be added to the new `by-name` directory.
This should help remove the (superficial and utterly useless)
distinction between `home-manager` and `NixOS` modules.
Diffstat (limited to 'modules/home.legacy/conf/beets')
-rw-r--r--modules/home.legacy/conf/beets/default.nix103
-rw-r--r--modules/home.legacy/conf/beets/plugins.nix67
-rw-r--r--modules/home.legacy/conf/beets/plugins/badfiles/default.nix13
-rw-r--r--modules/home.legacy/conf/beets/plugins/default.nix16
-rw-r--r--modules/home.legacy/conf/beets/plugins/duplicates/default.nix5
-rw-r--r--modules/home.legacy/conf/beets/plugins/fuzzy/default.nix6
-rw-r--r--modules/home.legacy/conf/beets/plugins/ihate/default.nix8
-rw-r--r--modules/home.legacy/conf/beets/plugins/inline/default.nix42
-rw-r--r--modules/home.legacy/conf/beets/plugins/lastgenre/default.nix7
-rw-r--r--modules/home.legacy/conf/beets/plugins/lyrics/default.nix6
-rw-r--r--modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/play/default.nix14
-rw-r--r--modules/home.legacy/conf/beets/plugins/replaygain/default.nix24
-rw-r--r--modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix33
-rw-r--r--modules/home.legacy/conf/beets/plugins/xtractor/default.nix95
-rw-r--r--modules/home.legacy/conf/beets/replace_override.yaml10
16 files changed, 458 insertions, 0 deletions
diff --git a/modules/home.legacy/conf/beets/default.nix b/modules/home.legacy/conf/beets/default.nix
new file mode 100644
index 00000000..8d6277b7
--- /dev/null
+++ b/modules/home.legacy/conf/beets/default.nix
@@ -0,0 +1,103 @@
+{
+  pkgs,
+  lib,
+  config,
+  ...
+}: let
+  plugins = import ./plugins.nix {};
+in {
+  imports = [
+    ./plugins
+  ];
+
+  programs.beets = {
+    enable = true;
+    package = pkgs.beets.override {
+      pluginOverrides = {
+        xtractor = {
+          enable = true;
+          propagatedBuildInputs = [pkgs.beetsExtraPlugins.xtractor];
+        };
+      };
+    };
+
+    settings = {
+      library = "${config.xdg.dataHome}/beets/library.db";
+      art_filename = "cover";
+      directory = "${config.xdg.userDirs.music}/beets";
+      ui = {
+        color = true;
+      };
+
+      include = [
+        "./replace_override.yaml"
+      ];
+
+      import = {
+        # move, instead of copying or linking the files
+        copy = false;
+        move = true;
+        link = false;
+
+        # Show more detail, when beet needs to ask for something
+        detail = true;
+
+        incremental = false;
+
+        # Write the metadata to the files
+        write = true;
+        log = "${config.xdg.dataHome}/beets/beetslog.txt";
+      };
+
+      paths = let
+        j = lib.strings.concatStringsSep "/";
+      in {
+        default = j ["[Default]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"];
+        "albumtype:live" = j ["[Live]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"];
+
+        "albumtype:album" = j ["Music" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"];
+        "albumtype::(Single|EP)" = j ["Music" "$genre" "$first_artist_singleton" "$album ($albumtype)" "$track $title"];
+        "albumtype:compilation" = j ["Complilations" "$genre" "Various Artists" "$album ($albumtype)" "$track $title"];
+        "albumtype:soundtrack" = j ["Soundtracks" "$genre" "$first_artist" "$album" "$track $title"];
+      };
+
+      inherit plugins;
+
+      # Plugin config
+      # scrub = {
+      #   auto = true;
+      # };
+
+      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;
+    };
+  };
+
+  xdg.configFile."beets/replace_override.yaml".source = ./replace_override.yaml;
+
+  # Use the json formatter instead of the YAML one, as the YAML formatter mangles the
+  # longer python inline strings.
+  # YAML is a superset of JSON.
+  xdg.configFile."beets/config.yaml".source =
+    lib.mkForce
+    ((pkgs.formats.json {}).generate
+      "beets-config"
+      config.programs.beets.settings);
+}
diff --git a/modules/home.legacy/conf/beets/plugins.nix b/modules/home.legacy/conf/beets/plugins.nix
new file mode 100644
index 00000000..bea2fefe
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins.nix
@@ -0,0 +1,67 @@
+{...}:
+# NOTE: This list is here and not split over the various plugin dirs, as we need a way to
+# specify the order plugins are loaded in. <2024-08-11>
+[
+  # 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 deezer id, which is not ideal
+  # <2024-08-07>
+  # "scrub"
+
+  # Help submitting stuff to music brainz
+  "mbsubmit"
+
+  # Extract things from the music file
+  "xtractor"
+
+  # Calculate replay gain
+  "replaygain"
+
+  # Check for bad files
+  "badfiles"
+
+  # Alows to use inline python for parsing tags
+  "inline"
+
+  # Support player integration
+  "play"
+
+  # Show tags on files/queries
+  "info"
+
+  # Create playlist from `play_count`/`skip_count` (gathered by the `mpdstats`
+  # plugin)
+  # Note that this should come _before_ the `mpdupdate` plugin, to ensure that
+  # `mpdupgate` can propagate changed playlist to `mpd`.
+  "smartplaylist"
+
+  # Warn, when importing a matching item
+  "ihate"
+
+  # Allow fuzzy searching
+  "fuzzy"
+
+  # Filter out duplicates
+  "duplicates"
+
+  # 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
+]
diff --git a/modules/home.legacy/conf/beets/plugins/badfiles/default.nix b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix
new file mode 100644
index 00000000..33884785
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix
@@ -0,0 +1,13 @@
+{
+  lib,
+  pkgs,
+  ...
+}: {
+  programs.beets.settings.badfiles = {
+    check_on_import = true;
+    commands = {
+      flac = "${lib.getExe' pkgs.flac "flac"} --test --warnings-as-errors --silent";
+      mp3 = "${lib.getExe pkgs.mp3val}";
+    };
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/default.nix b/modules/home.legacy/conf/beets/plugins/default.nix
new file mode 100644
index 00000000..3bea5ea8
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/default.nix
@@ -0,0 +1,16 @@
+{...}: {
+  imports = [
+    ./badfiles
+    ./duplicates
+    ./fuzzy
+    ./ihate
+    ./inline
+    ./lastgenre
+    ./lyrics
+    ./mbsubmit
+    ./play
+    ./replaygain
+    ./smartplaylist
+    ./xtractor
+  ];
+}
diff --git a/modules/home.legacy/conf/beets/plugins/duplicates/default.nix b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix
new file mode 100644
index 00000000..c8a6c108
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix
@@ -0,0 +1,5 @@
+{...}: {
+  programs.beets.settings.duplicates = {
+    keys = ["acoustid_fingerprint"];
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix
new file mode 100644
index 00000000..b86b3a20
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix
@@ -0,0 +1,6 @@
+{...}: {
+  programs.beets.settings.fuzzy = {
+    # The prefix denoting that a search should be run in fuzzy mode
+    prefix = ".";
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/ihate/default.nix b/modules/home.legacy/conf/beets/plugins/ihate/default.nix
new file mode 100644
index 00000000..145f5f8b
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/ihate/default.nix
@@ -0,0 +1,8 @@
+{...}: {
+  programs.beets.settings.ihate = {
+    warn = [
+      "title:commentary"
+      "albumtype:live"
+    ];
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/inline/default.nix b/modules/home.legacy/conf/beets/plugins/inline/default.nix
new file mode 100644
index 00000000..0dda8cfc
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/inline/default.nix
@@ -0,0 +1,42 @@
+{...}: {
+  programs.beets.settings = {
+    item_fields = {
+      # Taken from https://github.com/trapd00r/configs/blob/4f3dada5700846cca6c2869e6fa6b3c795b87b67/beets/config.yaml
+      first_artist =
+        /*
+        python
+        */
+        ''
+          # import an album to another artists directory, like:
+          # Tom Jones │1999│ Burning Down the House [Single, CD, FLAC]
+          # to The Cardigans/+singles/Tom Jones & the Cardigans │1999│ Burning Down the House [Single, CD, FLAC]
+          # https://github.com/beetbox/beets/discussions/4012#discussioncomment-1021414
+          # beet import --set myartist='The Cardigans'
+          # we must first check to see if myartist is defined, that is, given on
+          # import time, or we raise an NameError exception.
+          try:
+            myartist
+          except NameError:
+            import re
+            return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', albumartist, 1, flags=re.IGNORECASE)[0]
+          else:
+            return myartist
+        '';
+
+      first_artist_singleton =
+        /*
+        python
+        */
+        ''
+          try:
+            myartist
+          except NameError:
+            import re
+            return re.split(',|\\s+(feat(.?|uring)|&|(Vs|Ft).)', artist, 1, flags=re.IGNORECASE)[0]
+          else:
+            return myartist
+        '';
+    };
+    album_fields = {};
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix
new file mode 100644
index 00000000..d10ca49f
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix
@@ -0,0 +1,7 @@
+{...}: {
+  programs.beets.settings.lastgenre = {
+    prefer_specific = false;
+    # Lookup the track, not the album
+    source = "track";
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/lyrics/default.nix b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix
new file mode 100644
index 00000000..80544aea
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix
@@ -0,0 +1,6 @@
+{...}: {
+  programs.beets.settings.lyrics = {
+    # Always fetch lyrics (and update them, if some were found)
+    force = true;
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix
new file mode 100644
index 00000000..b70f1c63
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix
@@ -0,0 +1,9 @@
+{
+  lib,
+  pkgs,
+  ...
+}: {
+  programs.beets.settings.mbsubmit = {
+    picard_path = lib.getExe pkgs.picard;
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/play/default.nix b/modules/home.legacy/conf/beets/plugins/play/default.nix
new file mode 100644
index 00000000..f5bc3c9b
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/play/default.nix
@@ -0,0 +1,14 @@
+{
+  lib,
+  pkgs,
+  config,
+  ...
+}: {
+  programs.beets.settings.play = {
+    command = "${lib.getExe pkgs.mpc-cli} $args add";
+    relative_to = config.services.mpd.musicDirectory;
+
+    # Run the command with the returned paths as arguments
+    raw = true;
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/replaygain/default.nix b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix
new file mode 100644
index 00000000..611f3799
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix
@@ -0,0 +1,24 @@
+{...}: {
+  programs.beets.settings = {
+    replaygain = {
+      auto = true;
+      backend = "ffmpeg";
+
+      r128_targetlevel = 89;
+
+      # Re-calculate the replay gain value even for files, that already have one set.
+      overwrite = true;
+    };
+
+    hook = {
+      hooks = [
+        {
+          # Also generate the replaygain for the album variant (so selecting between
+          # track and album becomes possible)
+          event = "import";
+          command = "echo Remember to run 'beet replaygain --album' to generate the album replaygain values for the imported songs!";
+        }
+      ];
+    };
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix
new file mode 100644
index 00000000..b55c487c
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix
@@ -0,0 +1,33 @@
+{config, ...}: {
+  programs.beets.settings.smartplaylist = {
+    relative_to = config.services.mpd.musicDirectory;
+    playlist_dir = config.services.mpd.playlistDirectory;
+    forward_slash = false;
+
+    # Show the real m3u file paths, when running `--pretend`
+    pretend_paths = true;
+
+    playlists = [
+      {
+        name = "artists-$first_artist.m3u";
+        query = "";
+      }
+      {
+        name = "ratings-good.m3u";
+        query = "rating:0.7..1.0";
+      }
+      {
+        name = "ratings-mediocre.m3u";
+        query = "rating:0.4..0.7";
+      }
+      {
+        name = "ratings-bad.m3u";
+        query = "rating:0.0..0.4";
+      }
+      {
+        name = "not_played.m3u";
+        query = "-play_count: artist:";
+      }
+    ];
+  };
+}
diff --git a/modules/home.legacy/conf/beets/plugins/xtractor/default.nix b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix
new file mode 100644
index 00000000..d4582c5f
--- /dev/null
+++ b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix
@@ -0,0 +1,95 @@
+{
+  lib,
+  pkgs,
+  config,
+  ...
+}: {
+  programs.beets.settings = {
+    xtractor = {
+      # This option is not yet implemented, thus requiring the hook
+      auto = true;
+
+      dry-run = false;
+      # Writes the bpm key to the media files
+      write = true;
+      threads = 0;
+      # Also run for files, which already have the required keys
+      force = true;
+      quiet = false;
+      keep_output = true;
+      keep_profiles = true;
+      output_path = "${config.xdg.dataHome}/beets/xtactor";
+      essentia_extractor = "${lib.getExe pkgs.essentia-extractor}";
+      extractor_profile = {
+        highlevel = {
+          svm_models = let
+            m = pkgs.beetsExtraPlugins.xtractor.models;
+          in [
+            "${m}/danceability.history"
+            "${m}/danceability.history.param"
+            "${m}/danceability.history.results.html"
+            "${m}/gender.history"
+            "${m}/gender.history.param"
+            "${m}/gender.history.results.html"
+            "${m}/genre_dortmund.history"
+            "${m}/genre_dortmund.history.param"
+            "${m}/genre_dortmund.history.results.html"
+            "${m}/genre_electronic.history"
+            "${m}/genre_electronic.history.param"
+            "${m}/genre_electronic.history.results.html"
+            "${m}/genre_rosamerica.history"
+            "${m}/genre_rosamerica.history.param"
+            "${m}/genre_rosamerica.history.results.html"
+            "${m}/genre_tzanetakis.history"
+            "${m}/genre_tzanetakis.history.param"
+            "${m}/genre_tzanetakis.history.results.html"
+            "${m}/ismir04_rhythm.history"
+            "${m}/ismir04_rhythm.history.param"
+            "${m}/ismir04_rhythm.history.results.html"
+            "${m}/mood_acoustic.history"
+            "${m}/mood_acoustic.history.param"
+            "${m}/mood_acoustic.history.results.html"
+            "${m}/mood_aggressive.history"
+            "${m}/mood_aggressive.history.param"
+            "${m}/mood_aggressive.history.results.html"
+            "${m}/mood_electronic.history"
+            "${m}/mood_electronic.history.param"
+            "${m}/mood_electronic.history.results.html"
+            "${m}/mood_happy.history"
+            "${m}/mood_happy.history.param"
+            "${m}/mood_happy.history.results.html"
+            "${m}/mood_party.history"
+            "${m}/mood_party.history.param"
+            "${m}/mood_party.history.results.html"
+            "${m}/mood_relaxed.history"
+            "${m}/mood_relaxed.history.param"
+            "${m}/mood_relaxed.history.results.html"
+            "${m}/mood_sad.history"
+            "${m}/mood_sad.history.param"
+            "${m}/mood_sad.history.results.html"
+            "${m}/moods_mirex.history"
+            "${m}/moods_mirex.history.param"
+            "${m}/moods_mirex.history.results.html"
+            "${m}/timbre.history"
+            "${m}/timbre.history.param"
+            "${m}/timbre.history.results.html"
+            "${m}/tonal_atonal.history"
+            "${m}/tonal_atonal.history.param"
+            "${m}/tonal_atonal.history.results.html"
+            "${m}/voice_instrumental.history"
+            "${m}/voice_instrumental.history.param"
+            "${m}/voice_instrumental.history.results.html"
+          ];
+        };
+      };
+    };
+    hook = {
+      hooks = [
+        {
+          event = "import";
+          command = "echo Remember to run 'beet xtractor'!";
+        }
+      ];
+    };
+  };
+}
diff --git a/modules/home.legacy/conf/beets/replace_override.yaml b/modules/home.legacy/conf/beets/replace_override.yaml
new file mode 100644
index 00000000..23d6ea55
--- /dev/null
+++ b/modules/home.legacy/conf/beets/replace_override.yaml
@@ -0,0 +1,10 @@
+---
+replace:
+    '[\\/]': _
+    '^\.': _
+    '[\x00-\x1f]': _
+    '[<>:"\?\*\|]': _
+    '\.$': _
+    '\s+$': ''
+    '^\s+': ''
+    '^-': _