From 7eb9d6633f63b2401852d5045158b2a9886c181d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Thu, 31 Jul 2025 08:55:25 +0200 Subject: [PATCH] recordings --- src/awk/recordings.awk | 32 ++++++++++++++++++++++++++++++++ src/main.sh | 40 +++++++++++++++++++++++++++++++++++++++- src/sh/awk.sh | 7 +++++++ src/sh/theme.sh | 3 +++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/awk/recordings.awk diff --git a/src/awk/recordings.awk b/src/awk/recordings.awk new file mode 100644 index 0000000..8ce47d4 --- /dev/null +++ b/src/awk/recordings.awk @@ -0,0 +1,32 @@ +BEGIN { OFS="\t" } + +{ + gsub("&", "\\\\&") + id = $1 + med = $2 + nr = $3 + dur = $4 + title = $5 + artist = $6 + # Parse duration + if (dur) { + dur = int(dur / 1000) + dh = int(dur / 3600) + dur = dur % 3600 + dm = int(dur / 60) + ds = dur % 60 + if (ds <= 9) + ds = "0"ds + dur = dh ? dh":"dm":"ds : dm":"ds + } else { + dur = "??:??" + } + line = format + sub("<>", med, line) + sub("<>", nr, line) + sub("<>", title, line) + sub("<<artist>>", artist, line) + sub("<<duration>>", dur, line) + sortk = med" "nr + print sortk, line, id +} diff --git a/src/main.sh b/src/main.sh index 31f15fb..36718d5 100755 --- a/src/main.sh +++ b/src/main.sh @@ -169,6 +169,30 @@ if [ "${1:-}" = "--internal-list-releases" ]; then exit 0 fi +if [ "${1:-}" = "--internal-list-recordings" ]; then + mb_release "$2" | + $JQ -r '.media[] | + .position as $pos | + .tracks[] | [ + .id, + $pos, + .number, + .length, + .recording.title, + (.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join("")) + ] | + join("\t")' | + awk \ + -F "\t" \ + -v format="$REC_FORMAT" \ + "$AWK_RECORDINGS" | + sort -k1,1n -k 2,2n -r | + cut -d "$(printf '\t')" -f 2- | + column -t -s "$(printf '\t')" -R 1,2,4 | + sed 's| \+\([0-9a-f-]\+\)$|\t\1|' + exit 0 +fi + if [ "${1:-}" = "--help" ]; then cat <<EOF Usage: $0 [ --help | --show-artist <mbid> ] @@ -207,6 +231,7 @@ while true; do --ansi \ --reverse \ --cycle \ + --no-sort \ --query="!$secsymb " \ --delimiter="\t" \ --prompt="$(printf "$ARTIST_PROMPT" "$name")" \ @@ -237,9 +262,22 @@ while true; do --with-nth="{1}" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" ) - exit 0 [ "$sel" ] && set -- "--show-release" "$sel" ;; + "--show-release") + $0 --internal-list-recordings "$2" | + $FZF \ + --ansi \ + --reverse \ + --cycle \ + --no-sort \ + --no-input \ + --delimiter="\t" \ + --accept-nth="{2}" \ + --with-nth="{1}" \ + --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" + exit 0 + ;; *) sel=$( printf "" | diff --git a/src/sh/awk.sh b/src/sh/awk.sh index 0b0872e..400cbac 100644 --- a/src/sh/awk.sh +++ b/src/sh/awk.sh @@ -18,3 +18,10 @@ AWK_RELEASEGROUPS=$( EOF ) export AWK_RELEASEGROUPS + +AWK_RECORDINGS=$( + cat <<'EOF' +@@include awk/recordings.awk +EOF +) +export AWK_RECORDINGS diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 4574863..196be91 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -68,3 +68,6 @@ RV_FORMAT="<<status>>\t${CXXX}<<tracks>> tracks\t<<media>>${OFF}\t${CYEAR}<<year RV_TITLE_ARTIST="${FAINT}${CTITLE}<<title>>$OFF — ${FAINT}${CARTIST}<<artist>>$OFF" RV_TITLE="${FAINT}${CTITLE}<<title>>$OFF" RV_ARTIST="${FAINT}by ${CARTIST}<<artist>>$OFF" + +# Recording view +REC_FORMAT="${CNOTE}${FAINT}<<med>>$OFF\t${CNOTE}<<nr>>$OFF\t${CTITLE}<<title>>$OFF\t${CARTIST}<<artist>>$OFF\t${CXXX}<<duration>>$OFF"