summaryrefslogtreecommitdiff
path: root/.config
diff options
context:
space:
mode:
authorSam Nystrom <sam@samnystrom.dev>2026-01-12 21:46:44 -0500
committerSam Nystrom <sam@samnystrom.dev>2026-01-12 21:46:44 -0500
commitcfa85684d648c8a3b1417ab01cb9acb8dd7f15c6 (patch)
tree7f30d7c7ceb57d461faf6cd18d046ecae3165b4e /.config
parent7c614992bb8f37c652d3770e68a690a45ec4402b (diff)
set up mpd and rmpc
Diffstat (limited to '.config')
-rw-r--r--.config/mpd/mpd.conf400
-rwxr-xr-x.config/river/init6
-rw-r--r--.config/rmpc/config.ron184
-rw-r--r--.config/rmpc/themes/flexoki.ron171
4 files changed, 758 insertions, 3 deletions
diff --git a/.config/mpd/mpd.conf b/.config/mpd/mpd.conf
new file mode 100644
index 0000000..1a20eb4
--- /dev/null
+++ b/.config/mpd/mpd.conf
@@ -0,0 +1,400 @@
+# An example configuration file for MPD.
+# Read the user manual for documentation: http://www.musicpd.org/doc/user/
+
+
+# Files and directories #######################################################
+#
+# This setting controls the top directory which MPD will search to discover the
+# available audio files and add them to the daemon's online database. This
+# setting defaults to the XDG directory, otherwise the music directory will be
+# be disabled and audio files will only be accepted over ipc socket (using
+# file:// protocol) or streaming files over an accepted protocol.
+#
+#music_directory "$XDG_MUSIC_DIR"
+music_directory "~/Music"
+#
+# This setting sets the MPD internal playlist directory. The purpose of this
+# directory is storage for playlists created by MPD. The server will use
+# playlist files not created by the server but only if they are in the MPD
+# format. This setting defaults to playlist saving being disabled.
+#
+playlist_directory "$XDG_CONFIG_HOME/mpd/playlists"
+#playlist_directory "~/.mpd/playlists"
+#
+# This setting sets the location of the MPD database. This file is used to
+# load the database at server start up and store the database while the
+# server is not up. This setting defaults to disabled which will allow
+# MPD to accept files over ipc socket (using file:// protocol) or streaming
+# files over an accepted protocol.
+#
+db_file "$XDG_CACHE_HOME/mpd/database"
+#db_file "~/.mpd/database"
+
+# These settings are the locations for the daemon log files for the daemon.
+#
+# The special value "syslog" makes MPD use the local syslog daemon. This
+# setting defaults to logging to syslog.
+#
+# If you use systemd, do not configure a log_file. With systemd, MPD
+# defaults to the systemd journal, which is fine.
+#
+
+# This setting sets the location of the file which stores the process ID
+# for use of mpd --kill and some init scripts. This setting is disabled by
+# default and the pid file will not be stored.
+#
+# If you use systemd, do not configure a pid_file.
+#
+#pid_file "$XDG_RUNTIME_DIR/mpd/mpd.pid"
+#pid_file "~/.mpd/pid"
+
+# This setting sets the location of the file which contains information about
+# most variables to get MPD back into the same general shape it was in before
+# it was brought down. This setting is disabled by default and the server
+# state will be reset on server start up.
+#
+state_file "$XDG_RUNTIME_DIR/mpd/state"
+#state_file "~/.mpd/state"
+#
+# The location of the sticker database. This is a database which
+# manages dynamic information attached to songs.
+#
+#sticker_file "$XDG_CACHE_HOME/sticker.sql"
+#sticker_file "~/.mpd/sticker.sql"
+#
+###############################################################################
+
+
+# General music daemon options ################################################
+#
+# This setting specifies the user that MPD will run as. MPD should never run as
+# root and you may use this setting to make MPD change its user ID after
+# initialization. This setting is disabled by default and MPD is run as the
+# current user.
+#
+#user "mpd"
+#
+# This setting specifies the group that MPD will run as. If not specified
+# primary group of user specified with "user" setting will be used (if set).
+# This is useful if MPD needs to be a member of group such as "audio" to
+# have permission to use sound card.
+#
+#group "nogroup"
+#
+# This setting sets the address for the daemon to listen on. Careful attention
+# should be paid if this is assigned to anything other than the default, any.
+# This setting can deny access to control of the daemon. Not effective if
+# systemd socket activation is in use.
+#
+# For network
+#bind_to_address "any"
+#
+# And for Unix Socket
+#bind_to_address "$XDG_RUNTIME_DIR/mpd/socket"
+#bind_to_address "~/.mpd/socket"
+#
+# This setting is the TCP port that is desired for the daemon to get assigned
+# to.
+#
+#port "6600"
+#
+# Suppress all messages below the given threshold. Use "verbose" for
+# troubleshooting. Available setting arguments are "notice", "info", "verbose",
+# "warning" and "error".
+#
+#log_level "notice"
+#
+# Setting "restore_paused" to "yes" puts MPD into pause mode instead
+# of starting playback after startup.
+#
+#restore_paused "no"
+#
+# This setting enables MPD to create playlists in a format usable by other
+# music players.
+#
+#save_absolute_paths_in_playlists "no"
+#
+# This setting defines a list of tag types that will be extracted during the
+# audio file discovery process. The complete list of possible values can be
+# found in the user manual.
+#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
+#
+# This example just enables the "comment" tag without disabling all
+# the other supported tags:
+#metadata_to_use "+comment"
+#
+# This setting enables automatic update of MPD's database when files in
+# music_directory are changed. (Linux only)
+#
+#auto_update "yes"
+#
+# Limit the depth of the directories being watched, 0 means only watch
+# the music directory itself. There is no limit by default.
+#
+#auto_update_depth "3"
+#
+###############################################################################
+
+
+# Symbolic link behavior ######################################################
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links outside of the configured music_directory.
+#
+#follow_outside_symlinks "yes"
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links inside of the configured music_directory.
+#
+#follow_inside_symlinks "yes"
+#
+###############################################################################
+
+
+# Zeroconf / Avahi Service Discovery ##########################################
+#
+# If this setting is set to "yes", service information will be published with
+# Zeroconf / Avahi.
+#
+#zeroconf_enabled "yes"
+#
+# The argument to this setting will be the Zeroconf / Avahi unique name for
+# this MPD server on the network. %h will be replaced with the hostname.
+#
+#zeroconf_name "Music Player @ %h"
+#
+###############################################################################
+
+
+# Permissions #################################################################
+#
+# If this setting is set, MPD will require password authorization. The password
+# setting can be specified multiple times for different password profiles.
+#
+#password "password@read,add,control,admin"
+#
+# This setting specifies the permissions a user has who has not yet logged in.
+#
+#default_permissions "read,add,control,admin"
+#
+###############################################################################
+
+
+# Database #######################################################################
+#
+# An example of a database section instead of the old 'db_file' setting.
+# It enables mounting other storages into the music directory.
+#
+#database {
+# plugin "simple"
+# path "~/.local/share/mpd/db"
+# cache_directory "~/.local/share/mpd/cache"
+#}
+#
+# An example of database config for a satellite setup
+#
+#music_directory "nfs://fileserver.local/srv/mp3"
+#database {
+# plugin "proxy"
+# host "other.mpd.host"
+# port "6600"
+#}
+
+# Input #######################################################################
+#
+input {
+ plugin "curl"
+# proxy "proxy.isp.com:8080"
+# proxy_user "user"
+# proxy_password "password"
+}
+
+#
+###############################################################################
+
+# Audio Output ################################################################
+#
+# MPD supports various audio output types, as well as playing through multiple
+# audio outputs at the same time, through multiple audio_output settings
+# blocks. Setting this block is optional, though the server will only attempt
+# autodetection for one sound card.
+#
+# An example of an ALSA output:
+#
+#audio_output {
+# type "alsa"
+# name "My ALSA Device"
+## device "hw:0,0" # optional
+## mixer_type "hardware" # optional
+## mixer_device "default" # optional
+## mixer_control "PCM" # optional
+## mixer_index "0" # optional
+#}
+#
+# An example of an OSS output:
+#
+#audio_output {
+# type "oss"
+# name "My OSS Device"
+## device "/dev/dsp" # optional
+## mixer_type "hardware" # optional
+## mixer_device "/dev/mixer" # optional
+## mixer_control "PCM" # optional
+#}
+#
+# An example of a shout output (for streaming to Icecast):
+#
+#audio_output {
+# type "shout"
+# encoder "vorbis" # optional
+# name "My Shout Stream"
+# host "localhost"
+# port "8000"
+# mount "/mpd.ogg"
+# password "hackme"
+# quality "5.0"
+# bitrate "128"
+# format "44100:16:1"
+## protocol "icecast2" # optional
+## user "source" # optional
+## description "My Stream Description" # optional
+## url "http://example.com" # optional
+## genre "jazz" # optional
+## public "no" # optional
+## timeout "2" # optional
+## mixer_type "software" # optional
+#}
+#
+# An example of a recorder output:
+#
+#audio_output {
+# type "recorder"
+# name "My recorder"
+# encoder "vorbis" # optional, vorbis or lame
+# path "/var/lib/mpd/recorder/mpd.ogg"
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+#}
+#
+# An example of a httpd output (built-in HTTP streaming server):
+#
+#audio_output {
+# type "httpd"
+# name "My HTTP Stream"
+# encoder "vorbis" # optional, vorbis or lame
+# port "8000"
+# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+# max_clients "0" # optional 0=no limit
+#}
+#
+# An example of a pulseaudio output (streaming to a remote pulseaudio server)
+#
+#audio_output {
+# type "pulse"
+# name "My Pulse Output"
+## server "remote_server" # optional
+## sink "remote_server_sink" # optional
+## media_role "media_role" #optional
+#}
+#
+# An example of a winmm output (Windows multimedia API).
+#
+#audio_output {
+# type "winmm"
+# name "My WinMM output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+# or
+## device "0" # optional
+## mixer_type "hardware" # optional
+#}
+#
+# An example of a wasapi output (Windows multimedia API).
+#
+#audio_output {
+# type "wasapi"
+# name "My WASAPI output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+# or
+## device "0" # optional
+## mixer_type "hardware" # optional
+## Exclusive mode blocks all other audio source, and get best audio quality without resampling.
+## exclusive "no" # optional
+## Enumerate all devices in log.
+## enumerate "no" # optional
+#}
+#
+# An example of an openal output.
+#
+#audio_output {
+# type "openal"
+# name "My OpenAL output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+#}
+#
+# An example of an sndio output.
+#
+#audio_output {
+# type "sndio"
+# name "sndio output"
+# mixer_type "hardware"
+#}
+#
+# An example of an OS X output:
+#
+#audio_output {
+# type "osx"
+# name "My OS X Device"
+## device "Built-in Output" # optional
+## channel_map "-1,-1,0,1" # optional
+#}
+#
+## Example "pipe" output:
+#
+#audio_output {
+# type "pipe"
+# name "my pipe"
+# command "aplay -f cd 2>/dev/null"
+## Or if you're want to use AudioCompress
+# command "AudioCompress -m | aplay -f cd 2>/dev/null"
+## Or to send raw PCM stream through PCM:
+# command "nc example.org 8765"
+# format "44100:16:2"
+#}
+#
+## An example of a null output (for no audio output):
+#
+#audio_output {
+# type "null"
+# name "My Null Output"
+# mixer_type "none" # optional
+#}
+#
+###############################################################################
+
+
+# Normalization automatic volume adjustments ##################################
+#
+# This setting specifies the type of ReplayGain to use. This setting can have
+# the argument "off", "album", "track" or "auto". "auto" is a special mode that
+# chooses between "track" and "album" depending on the current state of
+# random playback. If random playback is enabled then "track" mode is used.
+# See <https://wiki.hydrogenaud.io/index.php?title=Replaygain> for
+# more details about ReplayGain.
+# This setting is off by default.
+#
+#replaygain "album"
+#
+###############################################################################
+
+# Character Encoding ##########################################################
+#
+# If file or directory names do not display correctly for your locale then you
+# may need to modify this setting.
+#
+#filesystem_charset "UTF-8"
+#
+###############################################################################
diff --git a/.config/river/init b/.config/river/init
index 9f1172a..4dd0b18 100755
--- a/.config/river/init
+++ b/.config/river/init
@@ -114,9 +114,9 @@ for mode in normal locked; do
# Control MPRIS aware media players with playerctl (https://github.com/altdesktop/playerctl)
# riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
- # riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause'
- # riverctl map $mode None XF86AudioPrev spawn 'playerctl previous'
- # riverctl map $mode None XF86AudioNext spawn 'playerctl next'
+ riverctl map $mode None XF86AudioPlay spawn 'rmpc togglepause'
+ riverctl map $mode None XF86AudioPrev spawn 'rmpc prev'
+ riverctl map $mode None XF86AudioNext spawn 'rmpc next'
riverctl map $mode None XF86MonBrightnessUp spawn 'brightctl +5'
riverctl map $mode None XF86MonBrightnessDown spawn 'brightctl -5'
diff --git a/.config/rmpc/config.ron b/.config/rmpc/config.ron
new file mode 100644
index 0000000..734a492
--- /dev/null
+++ b/.config/rmpc/config.ron
@@ -0,0 +1,184 @@
+#![enable(implicit_some)]
+#![enable(unwrap_newtypes)]
+#![enable(unwrap_variant_newtypes)]
+(
+ address: "127.0.0.1:6600",
+ password: None,
+ theme: Some("flexoki"),
+ cache_dir: None,
+ on_song_change: None,
+ volume_step: 5,
+ max_fps: 30,
+ scrolloff: 0,
+ wrap_navigation: false,
+ enable_mouse: true,
+ enable_config_hot_reload: true,
+ status_update_interval_ms: 1000,
+ rewind_to_start_sec: None,
+ keep_state_on_song_change: true,
+ reflect_changes_to_playlist: false,
+ select_current_song_on_change: false,
+ ignore_leading_the: false,
+ browser_song_sort: [Disc, Track, Artist, Title],
+ directories_sort: SortFormat(group_by_type: true, reverse: false),
+ album_art: (
+ method: Auto,
+ max_size_px: (width: 1200, height: 1200),
+ disabled_protocols: ["http://", "https://"],
+ vertical_align: Center,
+ horizontal_align: Center,
+ ),
+ keybinds: (
+ global: {
+ ":": CommandMode,
+ ",": VolumeDown,
+ "s": Stop,
+ ".": VolumeUp,
+ "<Tab>": NextTab,
+ "<S-Tab>": 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,
+ ">": NextTrack,
+ "p": TogglePause,
+ "<": PreviousTrack,
+ "f": SeekForward,
+ "z": ToggleRepeat,
+ "x": ToggleRandom,
+ "c": ToggleConsume,
+ "v": ToggleSingle,
+ "b": SeekBack,
+ "~": ShowHelp,
+ "u": Update,
+ "U": Rescan,
+ "I": ShowCurrentSongInfo,
+ "O": ShowOutputs,
+ "P": ShowDecoders,
+ "R": AddRandom,
+ },
+ navigation: {
+ "k": Up,
+ "j": Down,
+ "h": Left,
+ "l": Right,
+ "<Up>": Up,
+ "<Down>": Down,
+ "<Left>": Left,
+ "<Right>": Right,
+ "<C-k>": PaneUp,
+ "<C-j>": PaneDown,
+ "<C-h>": PaneLeft,
+ "<C-l>": PaneRight,
+ "<C-u>": UpHalf,
+ "N": PreviousResult,
+ "a": Add,
+ "A": AddAll,
+ "r": Rename,
+ "n": NextResult,
+ "g": Top,
+ "<Space>": Select,
+ "<C-Space>": InvertSelection,
+ "G": Bottom,
+ "<CR>": Confirm,
+ "i": FocusInput,
+ "J": MoveDown,
+ "<C-d>": DownHalf,
+ "/": EnterSearch,
+ "<C-c>": Close,
+ "<Esc>": Close,
+ "K": MoveUp,
+ "D": Delete,
+ "B": ShowInfo,
+ "<C-z>": ContextMenu(),
+ "<C-s>": Save(kind: Modal(all: false, duplicates_strategy: Ask)),
+ },
+ queue: {
+ "D": DeleteAll,
+ "<CR>": Play,
+ "a": AddToPlaylist,
+ "d": Delete,
+ "C": JumpToCurrent,
+ "X": Shuffle,
+ },
+ ),
+ search: (
+ case_sensitive: false,
+ ignore_diacritics: false,
+ search_button: 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"),
+ ],
+ ),
+ artists: (
+ album_display_mode: SplitByDate,
+ album_sort_by: Date,
+ album_date_tags: [Date],
+ ),
+ tabs: [
+ (
+ name: "Queue",
+ pane: Split(
+ direction: Horizontal,
+ panes: [
+ (
+ size: "40%",
+ pane: Split(
+ direction: Vertical,
+ panes: [
+ (
+ size: "3",
+ pane: Pane(Lyrics)
+ ),
+ (
+ size: "100%",
+ pane: Pane(AlbumArt)
+ ),
+ ],
+ ),
+ ),
+ (
+ size: "60%",
+ pane: Pane(Queue)
+ ),
+ ],
+ ),
+ ),
+ (
+ name: "Directories",
+ pane: Pane(Directories),
+ ),
+ (
+ name: "Artists",
+ pane: Pane(Artists),
+ ),
+ (
+ name: "Album Artists",
+ pane: Pane(AlbumArtists),
+ ),
+ (
+ name: "Albums",
+ pane: Pane(Albums),
+ ),
+ (
+ name: "Playlists",
+ pane: Pane(Playlists),
+ ),
+ (
+ name: "Search",
+ pane: Pane(Search),
+ ),
+ ],
+)
+
diff --git a/.config/rmpc/themes/flexoki.ron b/.config/rmpc/themes/flexoki.ron
new file mode 100644
index 0000000..0667547
--- /dev/null
+++ b/.config/rmpc/themes/flexoki.ron
@@ -0,0 +1,171 @@
+#![enable(implicit_some)]
+#![enable(unwrap_newtypes)]
+#![enable(unwrap_variant_newtypes)]
+(
+ default_album_art_path: None,
+ show_song_table_header: true,
+ draw_borders: true,
+ format_tag_separator: " | ",
+ browser_column_widths: [20, 38, 42],
+ background_color: None,
+ text_color: None,
+ header_background_color: None,
+ modal_background_color: None,
+ modal_backdrop: false,
+ preview_label_style: (fg: "yellow"),
+ preview_metadata_group_style: (fg: "yellow", modifiers: "Bold"),
+ tab_bar: (
+ active_style: (fg: "black", bg: "blue", modifiers: "Bold"),
+ inactive_style: (),
+ ),
+ highlighted_item_style: (fg: "blue", modifiers: "Bold"),
+ current_item_style: (fg: "black", bg: "blue", modifiers: "Bold"),
+ borders_style: (fg: "blue"),
+ highlight_border_style: (fg: "blue"),
+ symbols: (
+ song: "S",
+ dir: "D",
+ playlist: "P",
+ marker: "M",
+ ellipsis: "...",
+ song_style: None,
+ dir_style: None,
+ playlist_style: None,
+ ),
+ level_styles: (
+ info: (fg: "blue", bg: "black"),
+ warn: (fg: "yellow", bg: "black"),
+ error: (fg: "red", bg: "black"),
+ debug: (fg: "light_green", bg: "black"),
+ trace: (fg: "magenta", bg: "black"),
+ ),
+ progress_bar: (
+ symbols: ["[", "-", ">", " ", "]"],
+ track_style: (fg: "#1e2030"),
+ elapsed_style: (fg: "blue"),
+ thumb_style: (fg: "blue", bg: "#1e2030"),
+ use_track_when_empty: false,
+ ),
+ scrollbar: (
+ symbols: ["│", "█", "▲", "▼"],
+ track_style: (),
+ ends_style: (),
+ thumb_style: (fg: "blue"),
+ ),
+ song_table_format: [
+ (
+ prop: (kind: Property(Artist),
+ default: (kind: Text("Unknown"))
+ ),
+ width: "20%",
+ ),
+ (
+ prop: (kind: Property(Title),
+ default: (kind: Text("Unknown"))
+ ),
+ width: "35%",
+ ),
+ (
+ prop: (kind: Property(Album), style: (fg: "white"),
+ default: (kind: Text("Unknown Album"), style: (fg: "white"))
+ ),
+ width: "30%",
+ ),
+ (
+ prop: (kind: Property(Duration),
+ default: (kind: Text("-"))
+ ),
+ width: "15%",
+ alignment: Right,
+ ),
+ ],
+ components: {},
+ layout: Split(
+ direction: Vertical,
+ panes: [
+ (
+ pane: Pane(Header),
+ size: "2",
+ ),
+ (
+ pane: Pane(Tabs),
+ size: "3",
+ ),
+ (
+ pane: Pane(TabContent),
+ size: "100%",
+ ),
+ (
+ pane: Pane(ProgressBar),
+ size: "1",
+ ),
+ ],
+ ),
+ header: (
+ rows: [
+ (
+ left: [
+ (kind: Text("["), style: (fg: "yellow", modifiers: "Bold")),
+ (kind: Property(Status(StateV2(playing_label: "Playing", paused_label: "Paused", stopped_label: "Stopped"))), style: (fg: "yellow", modifiers: "Bold")),
+ (kind: Text("]"), style: (fg: "yellow", modifiers: "Bold"))
+ ],
+ center: [
+ (kind: Property(Song(Title)), style: (modifiers: "Bold"),
+ default: (kind: Text("No Song"), style: (modifiers: "Bold"))
+ )
+ ],
+ right: [
+ (kind: Property(Widget(ScanStatus)), style: (fg: "blue")),
+ (kind: Property(Widget(Volume)), style: (fg: "blue"))
+ ]
+ ),
+ (
+ left: [
+ (kind: Property(Status(Elapsed))),
+ (kind: Text(" / ")),
+ (kind: Property(Status(Duration))),
+ (kind: Text(" (")),
+ (kind: Property(Status(Bitrate))),
+ (kind: Text(" kbps)"))
+ ],
+ center: [
+ (kind: Property(Song(Artist)), style: (fg: "yellow", modifiers: "Bold"),
+ default: (kind: Text("Unknown"), style: (fg: "yellow", modifiers: "Bold"))
+ ),
+ (kind: Text(" - ")),
+ (kind: Property(Song(Album)),
+ default: (kind: Text("Unknown Album"))
+ )
+ ],
+ right: [
+ (
+ kind: Property(Widget(States(
+ active_style: (fg: "white", modifiers: "Bold"),
+ separator_style: (fg: "white")))
+ ),
+ style: (fg: "#575653")
+ ),
+ ]
+ ),
+ ],
+ ),
+ browser_song_format: [
+ (
+ kind: Group([
+ (kind: Property(Track)),
+ (kind: Text(" ")),
+ ])
+ ),
+ (
+ kind: Group([
+ (kind: Property(Artist)),
+ (kind: Text(" - ")),
+ (kind: Property(Title)),
+ ]),
+ default: (kind: Property(Filename))
+ ),
+ ],
+ lyrics: (
+ timestamp: false
+ )
+)