about summary refs log tree commit diff stats
path: root/modules/home/conf/beets/default.nix
blob: b5063b246615e56b6736a1cda2c77edc6141e9e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{
  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;

        # 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 = {
        # force = false;
        prefer_specific = true;
      };
      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
      ];

      # Log-on config
      # musicbrainz:
      #     external_ids:
      #         deezer: true
      # 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;
    };
  };
}