#!/usr/bin/env bash # Musmaster: find and play music in any directory (bash edition) # Depends on find and fzf # Created by Luxferre in 2026, released into the public domain [[ -z "$PLAYER" ]] && PLAYER='mpg123' [[ -z "$FTYPES" ]] && FTYPES='mp3 MP3' if [[ -z "$TAGDUMP" ]]; then TAGDUMP='mpg123-id3dump -n {} | grep -E "^(Title|Artist|Album|Year|Comment|Genre):" | sort -u' fi PREVIEWCMD="[ -d {} ] && ls -1 {} || ([ {} != 'Quit' ] && $TAGDUMP)" mdir="$1" [[ -z "$mdir" ]] && mdir='.' declare -a fargs=() muslist dirlist tracks for ext in $FTYPES; do fargs+=('-name' "*.$ext" '-o') done unset 'fargs[-1]' cd "$mdir" while true; do mapfile -t muslist < <(find . -type f \( "${fargs[@]}" \)) mapfile -t dirlist < <(dirname "${muslist[@]}" | sort -u) IFS=$'\n' muslist=($(sort -u <<<"${muslist[*]} ${dirlist[*]}") Quit); unset IFS src="$(printf '%s\n' "${muslist[@]}" | grep '\S' | fzf --tac --preview="$PREVIEWCMD" -0 -1)" [[ "$src" = 'Quit' ]] && break if [[ -n "$src" ]]; then if [[ -d "$src" ]]; then mapfile -t tracks < <(find "$src" -type f \( "${fargs[@]}" \) | sort -u) $PLAYER "${tracks[@]}" else $PLAYER "$src" fi fi done