Polybar Modules music player - ulises-jeremias/dotfiles GitHub Wiki
Control and monitor music playback from various media players directly in your polybar.
Tip
The music player modules provide comprehensive media control with support for multiple players via MPRIS and custom integrations.
The music player system includes multiple modules:
- player: Universal media control buttons (play/pause/next/prev)
- playing: Current song title display
- spotify: Dedicated Spotify integration
- mpd: Music Player Daemon support
[module/player]
type = custom/script
interval = 1
exec = ~/.config/polybar/configs/default/scripts/player
Playing State:
Paused State:
No Player Active:
(empty - module hides)
- Click controls: Previous, play/pause, next
- Universal support: Works with any MPRIS-compatible player
- Automatic detection: Only shows when media is playing/paused
- Color-coded status: Different colors for playing vs paused
[module/playing]
type = custom/script
interval = 1
exec = ~/.config/polybar/configs/default/scripts/player --title
Current Song Title (truncated to 30 chars)
- Smart truncation: Long titles are automatically shortened
- Multi-player support: Shows active player's current track
- Colored output: Uses theme-appropriate colors
- Real-time updates: Updates every second during playback
[module/media-player]
type = custom/script
interval = 1
exec = ~/.config/polybar/configs/default/scripts/player
format = <label>
[module/media-title]
type = custom/script
interval = 1
exec = ~/.config/polybar/configs/default/scripts/player --title
format = <label>
; In bar configuration
modules-center = media-title media-player
The player script supports various options:
# Show only the title
~/.config/polybar/configs/default/scripts/player --title
# Show control buttons (default)
~/.config/polybar/configs/default/scripts/player
# Get help
~/.config/polybar/configs/default/scripts/player --help
The player script uses hardcoded colors that you can modify:
# In the script file
status_label=""
if [ "${player_status}" = "Playing" ]; then
status_label="%{F#ebcb8b}%{F}" # Playing color (yellow)
elif [ "${player_status}" = "Paused" ]; then
status_label="%{F#a3be8c}%{F}" # Paused color (green)
fi
# Button colors
prev_label="%{T4}%{A1:playerctl prev:}%{F#b48ead}%{F}%{A}%{T-}" # Purple
next_label="%{T4}%{A1:playerctl next:}%{F#b48ead}%{F}%{A}%{T-}" # Purple
Modify the truncation length in the script:
# Change from 30 to your preferred length
current_song="$(playerctl metadata -s --format '{{trunc(title, 50)}}' | awk 'NR==1 {print; exit}')"
Replace the Nerd Font icons with your preferred symbols:
# Replace these icons in the script
# Previous (nf-md-skip_previous)
# Play (nf-md-play)
# Pause (nf-md-pause)
# Next (nf-md-skip_next)
[module/mpd]
type = internal/mpd
host = 127.0.0.1
port = 6600
format-online = <label-song> <icon-prev> <icon-seekb> <icon-stop> <toggle> <icon-seekf> <icon-next>
format-offline = <label-offline>
label-song = %artist% - %title%
label-offline = 🎵 mpd is offline
icon-prev =
icon-stop =
icon-play =
icon-pause =
icon-next =
icon-seekb =
icon-seekf =
- Direct connection to Music Player Daemon
- Rich metadata access (artist, album, etc.)
- Playlist control and seeking
- Connection status monitoring
The universal player module works with:
- Spotify: Full playback control
- VLC: Media player integration
- Firefox: Web audio/video control
- Chromium/Chrome: Browser media control
- Rhythmbox: GNOME music player
- Amarok: KDE music player
- Clementine: Cross-platform music player
- And many more: Any MPRIS-compliant application
# List active players
playerctl -l
# Check current player status
playerctl status
# Get metadata from specific player
playerctl -p spotify metadata
modules-center = playing player
# Top bar
modules-center = playing
# Bottom bar
modules-left = player spotify volume
# Focus on productivity
modules-right = player github cpu memory date
No player controls showing:
- Check if any media player is running:
playerctl status
- Verify playerctl is installed:
which playerctl
- Test script manually:
~/.config/polybar/configs/default/scripts/player
Controls not working:
- Test playerctl commands:
playerctl play-pause
- Check player MPRIS support:
playerctl -l
- Verify script permissions:
chmod +x ~/.config/polybar/configs/default/scripts/player
Title not updating:
- Check update interval (should be 1 second for real-time)
- Test title command:
~/.config/polybar/configs/default/scripts/player --title
- Verify metadata availability:
playerctl metadata
# Test playerctl functionality
playerctl status
playerctl metadata
# Test script output
bash -x ~/.config/polybar/configs/default/scripts/player
bash -x ~/.config/polybar/configs/default/scripts/player --title
# Check active MPRIS players
busctl --user list | grep mpris
If multiple players are active, playerctl follows this priority:
- Most recently active player
- Spotify (if available)
- First detected player
# Force specific player
playerctl -p spotify play-pause
playerctl -p vlc next
# Combine with volume control
[module/media-controls]
type = custom/script
exec = echo "$(~/.config/polybar/configs/default/scripts/player) | Vol: $(pamixer --get-volume)%"
interval = 1
# Perfect for ultrawide monitors
modules-left = workspaces
modules-center = playing player volume
modules-right = network battery date
# For vertical bars or side panels
modules = playing player spotify
# Clean, distraction-free
modules-right = player date
- ✅ All MPRIS players (Spotify, VLC, browsers, etc.)
- ✅ Multiple players simultaneously
- ✅ All bar configurations and window managers
- ✅ Remote control via playerctl commands
- Volume controls for complete audio management
- Spotify module for detailed track information
- System tray for player application access
Control your music without leaving your workflow! 🎶
Tip
Place media controls in your center modules for easy access, or keep them minimal in the corner if you prefer keyboard shortcuts for music control.