Initial commit

This commit is contained in:
2025-07-21 14:28:02 +02:00
commit 84bff90664
10 changed files with 184 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
muf

19
scripts/build.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/sh
BOLD="\033[1m"
GREEN="\033[0;32m"
OFF="\033[m"
NAME="muf"
SRC="./src/main.sh"
tmpdir=$(mktemp -d)
echo "🐔 ${GREEN}Internalize sourced files${OFF}"
sed -E 's|\. "([^$].+)"$|cat src/\1|e' "$SRC" >"$tmpdir/1.sh"
echo "🥚 ${GREEN}Internalize awk scripts${OFF}"
sed -E 's|@@include (.+)$|cat src/\1|e' "$tmpdir/1.sh" >"$tmpdir/2.sh"
echo "🐔 ${GREEN}Internalize awk libraries${OFF}"
sed -E 's|@include "(.+)"$|cat src/\1|e' "$tmpdir/2.sh" >"$NAME"
echo "🥚 ${GREEN}Make executable and cleanup${OFF}"
chmod +x "$NAME"
rm -rf "$tmpdir"
echo "🍳 ${GREEN}Done:${OFF} Sucessfully built ${BOLD}${GREEN}$NAME${OFF}"

11
src/awk/artists.awk Normal file
View File

@@ -0,0 +1,11 @@
BEGIN { OFS="\t" }
$2 == "Group" { name = format_group }
$2 != "Group" { name = format_person }
{
gsub("&", "\\\\&")
if ($4)
name = name " " format_disambiguation
sub("<<disambiguation>>", $4, name)
sub("<<name>>", $3, name)
print $1, name
}

92
src/main.sh Executable file
View File

@@ -0,0 +1,92 @@
#!/bin/sh
set -eu
# Load helper methods
. "sh/info.sh"
# Load helper methods
. "sh/helper.sh"
# Load MusicBrainz methods
. "sh/mb.sh"
if [ "${1:-}" = "--internal-reload" ]; then
sleep 2
while [ -f "$LOCKFILE" ]; do
sleep 1
done
cat "$RESULTS"
exit 0
fi
if [ "${1:-}" = "--internal-search" ]; then
printf "" >"$RESULTS"
if [ -f "$PIDFILE" ]; then
pid=$(cat "$PIDFILE")
rm -f "$PIDFILE"
kill -9 "$pid" >/dev/null 2>&1 || true
fi
[ ! "${2}" ] && exit 0
# Save current pid
echo "$$" >"$PIDFILE"
sleep 1
touch "$LOCKFILE"
mb_browse_artists "$2" |
$JQ -r '.artists[] | [.id, .type, .name, .disambiguation, .["life-span"].begin, .["life-span"].end] | join("\t")' |
awk \
-F "\t" \
-v format_person="$FORMAT_PERSON" \
-v format_group="$FORMAT_GROUP" \
-v format_disambiguation="$FORMAT_DISAMBIGUATION" \
"$AWK_ARTISTS" |
tee "$RESULTS" ||
true
rm -f "$LOCKFILE" "$PIDFILE"
exit 0
fi
# Load theme
. "sh/theme.sh"
# Load AWK scripts
. "sh/awk.sh"
# Load tools
. "sh/tools.sh"
if [ "${1:-}" = "--help" ]; then
$CAT <<EOF
Usage: \`$0\` [ \`--help\` ]
Options:
\`--help\`: Show this help and exit.
EOF
exit 0
fi
# Generate filenames for temporary files
tmpdir=$(mktemp -d)
LOCKFILE="$tmpdir/lock"
RESULTS="$tmpdir/results"
PIDFILE="$tmpdir/pid"
export LOCKFILE RESULTS PIDFILE
if [ "${1:-}" = "--search" ]; then
$0 --internal-search "$2"
exit 0
fi
while true; do
sel=$(
printf "" |
$FZF \
--ansi \
--no-sort \
--disabled \
--delimiter="\t" \
--with-nth="{2}" \
--bind="change:execute-silent($0 --internal-search \$FZF_QUERY &)+reload($0 --internal-reload)"
)
echo "$sel"
done

6
src/sh/awk.sh Normal file
View File

@@ -0,0 +1,6 @@
AWK_ARTISTS=$(
cat <<'EOF'
@@include awk/artists.awk
EOF
)
export AWK_ARTISTS

3
src/sh/helper.sh Normal file
View File

@@ -0,0 +1,3 @@
err() {
echo "ERROR: ${1:-}"
}

5
src/sh/info.sh Normal file
View File

@@ -0,0 +1,5 @@
APP_NAME="muf"
APP_VERSION="zero.zero"
APP_WEBSITE="https://git.indyfac.ch/amin/muf"
WINDOW_TITLE="🔎🎶 $APP_NAME"
export APP_NAME APP_VERSION APP_WEBSITE WINDOW_TITLE

8
src/sh/mb.sh Normal file
View File

@@ -0,0 +1,8 @@
mb_browse_artists() {
$CURL \
--get \
--data-urlencode fmt=json \
--data-urlencode query="$1" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
"https://musicbrainz.org/ws/2/artist"
}

7
src/sh/theme.sh Normal file
View File

@@ -0,0 +1,7 @@
COLOR_ARTIST="\033[38;5;227m"
COLOR_DISAMBIGUATION="\033[38;5;110m"
COLOR_RESET="\033[m"
FORMAT_PERSON="${FORMAT_PERSON:-👤 $COLOR_ARTIST<<name>>$COLOR_RESET}"
FORMAT_GROUP="${FORMAT_GROUP:-👥 $COLOR_ARTIST<<name>>$COLOR_RESET}"
FORMAT_DISAMBIGUATION="${FORMAT_DISAMBIGUATION:-$COLOR_DISAMBIGUATION(<<disambiguation>>)$COLOR_RESET}"
export FORMAT_PERSON FORMAT_GROUP FORMAT_DISAMBIGUATION

32
src/sh/tools.sh Normal file
View File

@@ -0,0 +1,32 @@
if command -v "fzf" >/dev/null; then
FZF="fzf --black"
else
err "Did not find the command-line fuzzy finder fzf."
exit 1
fi
export FZF
if command -v "bat" >/dev/null; then
CAT="bat"
elif command -v "batcat" >/dev/null; then
CAT="batcat"
fi
CAT=${CAT:+$CAT --color=always --style=plain --language=md}
CAT=${CAT:-cat}
export CAT
if command -v "curl" >/dev/null; then
CURL="curl --silent"
else
err "Did not find curl."
exit 1
fi
export CURL
if command -v "jq" >/dev/null; then
JQ="jq"
else
err "Did not find jq."
exit 1
fi
export JQ