{ config, pkgs, lib, ... }: let visualizer = false; in { services.mpd = { enable = true; musicDirectory = "${config.home.homeDirectory}/Music"; network.startWhenNeeded = true; playlistDirectory = "${config.services.mpd.musicDirectory}/.mpd/playlists"; extraConfig = '' restore_paused "yes" auto_update "yes" replaygain "auto" follow_outside_symlinks "yes" audio_output { type "pipewire" name "PipeWire Sound Server" } '' + lib.optionalString visualizer '' #for ncmpcpp visualizer audio_output { type "fifo" name "Visualizer feed" path "/tmp/mpd.fifo" format "44100:16:2" } ''; }; services.mpd-mpris.enable = true; programs.ncmpcpp = { enable = true; package = lib.mkIf visualizer (pkgs.ncmpcpp.override {visualizerSupport = true;}); settings = lib.mkIf visualizer { visualizer_data_source = "/tmp/mpd.fifo"; visualizer_output_name = "Visualizer feed"; visualizer_in_stereo = "yes"; visualizer_type = "spectrum"; visualizer_fps = 60; visualizer_autoscale = "no"; visualizer_look = "●▮"; visualizer_color = "blue, cyan, green, yellow, magenta, red"; ## ## Note: The next few visualization options apply to the spectrum visualizer. ## visualizer_spectrum_smooth_look = "yes"; ## A value between 1 and 5 inclusive. Specifying a larger value makes the ## visualizer look at a larger slice of time, which results in less jumpy ## visualizer output. visualizer_spectrum_dft_size = 2; visualizer_spectrum_gain = 10; visualizer_spectrum_hz_min = 20; visualizer_spectrum_hz_max = 20000; }; }; home.packages = with pkgs; [ mpc-cli playerctl rmpc ]; # rmpc config. home.file.".config/rmpc/config.ron".text = '' #![enable(implicit_some)] #![enable(unwrap_newtypes)] #![enable(unwrap_variant_newtypes)] ( address: "127.0.0.1:6600", password: None, theme: None, cache_dir: None, on_song_change: None, volume_step: 5, scrolloff: 0, wrap_navigation: false, enable_mouse: true, status_update_interval_ms: 1000, select_current_song_on_change: false, album_art: ( method: Auto, max_size_px: (width: 600, height: 600), ), keybinds: ( global: { ":": CommandMode, ",": VolumeDown, "s": Stop, ".": VolumeUp, "c": ToggleSingle, "": NextTab, "": PreviousTab, "1": SwitchToTab("Queue"), "2": SwitchToTab("Directories"), "3": SwitchToTab("Artists"), "4": SwitchToTab("Album Artists"), "5": SwitchToTab("Albums"), "6": SwitchToTab("Playlists"), "7": SwitchToTab("Search"), "q": Quit, "x": ToggleRandom, ">": NextTrack, "<": PreviousTrack, "f": SeekForward, "v": ToggleConsume, "p": TogglePause, "z": ToggleRepeat, "b": SeekBack, "~": ShowHelp, "I": ShowCurrentSongInfo, "O": ShowOutputs, }, navigation: { "k": Up, "j": Down, "h": Left, "l": Right, "": Up, "": Down, "": Left, "": Right, "": PaneUp, "": PaneDown, "": PaneLeft, "": PaneRight, "": UpHalf, "N": PreviousResult, "a": Add, "A": AddAll, "r": Rename, "n": NextResult, "g": Top, "": Select, "G": Bottom, "": Confirm, "i": FocusInput, "J": MoveDown, "": DownHalf, "/": EnterSearch, "": Close, "": Close, "K": MoveUp, "D": Delete, }, queue: { "D": DeleteAll, "": Play, "": Save, "a": AddToPlaylist, "d": Delete, "i": ShowInfo, }, ), search: ( case_sensitive: false, mode: Contains, tags: [ (value: "any", label: "Any Tag"), (value: "artist", label: "Artist"), (value: "album", label: "Album"), (value: "albumartist", label: "Album Artist"), (value: "title", label: "Title"), (value: "filename", label: "Filename"), (value: "genre", label: "Genre"), ], ), tabs: [ ( name: "Queue", border_type: None, pane: Split( direction: Horizontal, panes: [(size: "40%", pane: Pane(AlbumArt)), (size: "60%", pane: Pane(Queue))], ), ), ( name: "Directories", border_type: None, pane: Pane(Directories), ), ( name: "Artists", border_type: None, pane: Pane(Artists), ), ( name: "Album Artists", border_type: None, pane: Pane(AlbumArtists), ), ( name: "Albums", border_type: None, pane: Pane(Albums), ), ( name: "Playlists", border_type: None, pane: Pane(Playlists), ), ( name: "Search", border_type: None, pane: Pane(Search), ), ], ) ''; }