summaryrefslogtreecommitdiffstats
path: root/usecases/desktop/music.nix
blob: c98279532db997bb110f02085a68c4ed9aad8eda (plain)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
_inputs: {
  config,
  lib,
  pkgs,
  ...
}: {
  assertions = [
    {
      assertion =
        config.home-manager.users.minijackson.programs.beets.settings
        ? acoustid
        && config.home-manager.users.minijackson.programs.beets.settings.acoustid ? apikey
        && config.home-manager.users.minijackson.programs.beets.settings.acoustid.apikey != null;
      message = "Please provide the API key for the Acoustid database";
    }
  ];

  services.mpd = {
    enable = true;
    musicDirectory = "/home/minijackson/Music";
    user = "minijackson";
    group = "users";

    extraConfig = ''
      audio_output {
        type   "pulse"
        name   "PulseAudio"
        server "127.0.0.1"
      }

      audio_output {
        type   "fifo"
        name   "Fifo"
        path   "/tmp/mpd.fifo"
        format "44100:16:2"
      }
    '';

    #startWhenNeeded = true;
  };

  users.extraUsers.minijackson.packages = [
    (pkgs.writeScriptBin
      "split-cue"
      (builtins.readFile ../../res/scripts/split-cue.sh))
  ];

  home-manager.users.minijackson = {config, ...}: {
    programs.beets = {
      enable = true;

      settings = {
        plugins = [
          "absubmit"
          "acousticbrainz"
          "badfiles"
          "chroma"
          "convert"
          "edit"
          "export"
          "fetchart"
          "fromfilename"
          "lastgenre"
          "mbsubmit"
          "mbsync"
          "missing"
          "mpdupdate"
          "parentwork"
          "random"
          "the"
          "zero"
        ];
        lastgenre = {
          canonical = true;
          # High count due to canonicalization which removes fetched genres
          count = 6;
        };
        paths = {
          default = "%the{$albumartist}/%the{$album}%aunique{}/$track $title";
          singleton = "Non-Album/%the{$artist}/%the{$title}";
          comp = "Compilations/%the{$album}%aunique{}/$track $title";
        };
        zero.fields = "comments";
      };
    };

    programs.ncmpcpp = {
      enable = true;
      package = pkgs.ncmpcpp.override {
        outputsSupport = true;
        visualizerSupport = true;
      };
      mpdMusicDir = "/home/minijackson/Music";
      settings = {
        visualizer_data_source = "/tmp/mpd.fifo";
        visualizer_output_name = "FIFO";
        visualizer_in_stereo = true;
        visualizer_type = "ellipse";
        visualizer_look = "▒▒";
        visualizer_color = "cyan, blue, magenta, red, yellow, green";

        user_interface = "alternative";

        media_library_primary_tag = "album_artist";

        display_bitrate = true;

        #----------------------------------------------------
        # file:     ~/.ncmpcpp/config
        # author:   jason ryan - http://jasonwryan.com/
        #----------------------------------------------------

        mpd_connection_timeout = "5";
        playlist_disable_highlight_delay = "3";
        message_delay_time = "4";
        header_visibility = true;
        statusbar_visibility = true;
        song_list_format = "{%a - }{%t}|{$5%f$9}$R{$7(%l)$9}";
        song_status_format = "$2%a $1• $3%t $1• $4%b {(Disc %d) }$1• $5%y$1";
        song_window_title_format = "Ncmpcpp: {%a - }{%t}|{%f}";
        song_columns_list_format = "(7f)[white]{n} (33)[cyan]{t} (20)[green]{a} (20)[magenta]{b} (10)[magenta]{y} (7f)[white]{l}";
        playlist_display_mode = "columns";
        browser_display_mode = "columns";
        titles_visibility = true;
        progressbar_look = "─╼·";
        # media_library_left_column = "a" (possible values: a,y,g,c,p, legend above)
        header_text_scrolling = true;
        # fancy_scrolling = true;
        display_remaining_time = true;
        ignore_leading_the = true;
        empty_tag_marker = "";
        enable_window_title = true;
        colors_enabled = true;
        header_window_color = "magenta";
        volume_color = "green";
        state_line_color = "yellow";
        state_flags_color = "blue";
        main_window_color = "cyan";
        color1 = "cyan";
        color2 = "blue";

        current_item_prefix = "$(cyan)$r";
        current_item_suffix = "$/r$(end)";

        progressbar_color = "yellow";
        statusbar_color = "cyan";

        # active_column_color = "cyan";
      };
    };

    wayland.windowManager.sway.config.keybindings = let
      inherit (config.wayland.windowManager.sway.config) modifier;
      mpc = "${pkgs.mpc_cli}/bin/mpc";
    in
      lib.mkOptionDefault {
        "XF86AudioPlay" = "exec ${mpc} toggle";
        "XF86AudioPrev" = "exec ${mpc} prev";
        "XF86AudioNext" = "exec ${mpc} next";

        "${modifier}+KP_5" = "exec ${mpc} toggle";
        "${modifier}+KP_4" = "exec ${mpc} prev";
        "${modifier}+KP_6" = "exec ${mpc} next";
        "${modifier}+KP_8" = "exec ${mpc} stop";
      };
  };
}