From eb1c64731cf0a350bbfd17fcf34d7a12ccc10dd3 Mon Sep 17 00:00:00 2001 From: Luxferre Date: Sat, 25 Apr 2026 19:48:49 +0300 Subject: [PATCH] added Musmaster --- README.md | 1 + mus.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100755 mus.sh diff --git a/README.md b/README.md index 0b31b3d..0ab10a7 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,4 @@ * [BlueShift](./blueshift.sh): a high-density steganographic tool for hiding any data file inside a PNG image * [abmux](./abmux.sh): a simple terminal session switcher on top of abduco, fzf and expect * [dmux](./dmux.sh): a simple terminal session switcher on top of dtach and fzf +* [Musmaster](./mus.sh): a simple fzf-based music catalog wrapper diff --git a/mus.sh b/mus.sh new file mode 100755 index 0000000..1b00d6c --- /dev/null +++ b/mus.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# Musmaster: find and play music in any directory +# Depends on find and fzf +# Created by Luxferre in 2026, released into the public domain + +[ -z "$PLAYER" ] && PLAYER='mpg123' +[ -z "$FTYPES" ] && FTYPES='mp3 MP3' + +mdir="$1" +[ -z "$mdir" ] && mdir='.' +set -- +for ext in $FTYPES; do + if [ $# -eq 0 ]; then + set -- -name "*.$ext" + else + set -- "$@" -o -name "*.$ext" + fi +done + +cd "$mdir" +echo "Indexing music..." +muslist="$(find . -type f \( "$@" \))" +dirlist="$(find . -type f \( "$@" \) -print0 | xargs -0 dirname | sort -u)" +muslist="$(printf '%s\n%s' "$muslist" "$dirlist" | sort -u)" +echo "Indexing complete" + +while true; do + src="$(printf '%s\nQuit' "$muslist" | fzf --tac -0 -1)" + [ -d "$src" ] && src="$(find "$src" -type f \( "$@" \) | sort -u)" + [ "$src" = 'Quit' ] && break + if [ -n "$src" ]; then + printf '%s' "$src" | while read -r track; do + $PLAYER "$track" + done + fi +done