From 3e3622b5be3900a4f7b070dec1f78320a2abd0d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Tue, 29 Jul 2025 22:07:54 +0200 Subject: [PATCH] rg support --- src/awk/releases.awk | 88 +++++++++++++++++++------------------------- src/main.sh | 68 +++++++++++++++++++++++++++++----- src/sh/api.sh | 2 +- src/sh/theme.sh | 34 ++++++++++++----- 4 files changed, 121 insertions(+), 71 deletions(-) diff --git a/src/awk/releases.awk b/src/awk/releases.awk index b87b3e0..be66a38 100644 --- a/src/awk/releases.awk +++ b/src/awk/releases.awk @@ -1,57 +1,43 @@ -BEGIN { - OFS="\t" - year[0] = 0; del year[0] - title[0] = 0; del title[0] - type[0] = 0; del type[0] - id[0] = 0; del id[0] - score[0] = 0; del score[0] -} - -function get_score(rgdt, rgti, dt, ti, qy, res) { - res = 0 - if (rgdt == dt) - res = res + 5 - if (rgti == ti) - res = res + 5 - if (qy == "normal" || qy == "unknown") - res = res + 1 - if (qy == "high") - res = res + 2 - return res -} +BEGIN { OFS="\t" } { gsub("&", "\\\\&") - rgmi = $1 # Release Group ID - rgty = $2 # Release Group Type - rgdt = substr($3, 1, 4) + 0 # Release Group Year - rgti = $4 # Release Group Title - mi = $5 # MusicBrainz Release ID - qy = $6 # Release Quality - dt = substr($7, 1, 4) + 0 # Release Year - ti = $8 # Release Title - s = get_score(rgdt, rgti, dt, ti, qy) - if (score[rgmi] < s) { - score[rgmi] = s - year[rgmi] = dt - title[rgmi] = ti - type[rgmi] = rgty - id[rgmi] = mi + id = $1 + status = $2 + year = substr($3, 1, 4) + 0 + year = year == 0 ? "" : year + covercount = $4 + label = $5 + trackcnt = $6 + media = $7 + country = $8 + title = $9 + artist = $10 + switch (status) { + case "Official": line_status=release_official; break + case "Promotion": line_status=release_promotion; break + case "Bootleg": line_status=release_bootleg; break + case "Pseudo-release": line_status=release_pseudo; break + case "Withdrawn": line_status=release_withdrawn; break + case "Expunged": line_status=release_expunged; break + case "Cancelled": line_status=release_cancelled; break + default: line_status="" } -} + line = release_format + if (artist != rg_artist && title != rg_title) + line = line "\t" release_format_title_artist + else if (artist != rg_artist && title == rg_title) + line = line "\t" release_format_artist + else if (artist != rg_artist && title == rg_title) + line = line "\t" release_format_title -END { - for (rgmi in id) { - if (type[rgmi] == "Single") - line = format_single - else if (type[rgmi] == "Album") - line = format_album - else if (type[rgmi] == "EP") - line = format_ep - else - line = format_album - sub("<>", dt, line) - sub("<>", ti, line) - print mi, line - } + sub("<<status>>", line_status, line) + sub("<<year>>", year, line) + sub("<<tracks>>", trackcnt, line) + sub("<<media>>", media, line) + sub("<<label>>", label, line) + sub("<<title>>", title, line) + sub("<<artist>>", artist, line) + sortk = year ? year : 0 + print sortk, line, id } diff --git a/src/main.sh b/src/main.sh index bd4d109..7372253 100755 --- a/src/main.sh +++ b/src/main.sh @@ -76,11 +76,6 @@ if [ "${1:-}" = "--internal-search" ]; then exit 0 fi -if [ "${1:-}" = "--internal-list-releases" ]; then - print "NOT IMPLEMENTED" - exit 0 -fi - if [ "${1:-}" = "--internal-list-releasegroups-fresh" ]; then artistid="$2" cache_delete_artist "$artistid" @@ -133,6 +128,47 @@ if [ "${1:-}" = "--internal-list-releasegroups" ]; then exit 0 fi +if [ "${1:-}" = "--internal-list-releases" ]; then + title="$(mb_releasegroup "$2" | + $JQ -r '.title')" + artist="$(mb_releasegroup "$2" | + $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" + mb_releasegroup_releases "$2" | + $JQ -r '."releases"[] | [ + .id, + .status, + .date, + ."cover-art-archive".count, + (."label-info" | map(.label.name) | unique | join(", ")), + (.media | map(."track-count") | add), + (.media | map(.format) | unique | join(", ")), + .country, + .title, + (."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")) + ] | join("\t")' | + awk \ + -F "\t" \ + -v release_official="$RELEASE_OFFICIAL" \ + -v release_promotion="$RELEASE_PROMOTION" \ + -v release_bootleg="$RELEASE_BOOTLEG" \ + -v release_pseudo="$RELEASE_PSEUDO" \ + -v release_withdrawn="$RELEASE_WITHDRAWN" \ + -v release_expunged="$RELEASE_EXPUNGED" \ + -v release_cancelled="$RELEASE_CANCELLED" \ + -v release_format="$RELEASE_FORMAT" \ + -v release_format_title_artist="$RELEASE_TITLE_ARTIST" \ + -v release_format_title="$RELEASE_TITLE" \ + -v release_format_artist="$RELEASE_ARTIST" \ + -v rg_artist="$artist" \ + -v rg_title="$title" \ + "$AWK_RELEASES" | + sort -n -r | + cut -d "$(printf '\t')" -f 2- | + column -t -s "$(printf '\t')" | + sed 's| \+\([0-9a-f-]\+\)$|\t\1|' + exit 0 +fi + if [ "${1:-}" = "--help" ]; then cat <<EOF Usage: $0 [ --help | --show-artist <mbid> ] @@ -180,17 +216,29 @@ while true; do --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="ctrl-r:reload:$0 --internal-list-releasegroups-fresh \"$2\"" ) - [ "$sel" ] && set -- "--show-release" "$sel" + [ "$sel" ] && set -- "--show-releasegroup" "$sel" ;; - "--show-release-group") + "--show-releasegroup") title="$(mb_releasegroup "$2" | $JQ -r '.title')" artist="$(mb_releasegroup "$2" | $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" - echo "$title" - echo "$artist" + sel=$( + $0 --internal-list-releases "$2" | + $FZF \ + --ansi \ + --reverse \ + --cycle \ + --no-sort \ + --query="$RELEASE_OFFICIAL " \ + --delimiter="\t" \ + --prompt="$(printf "$FULL_PROMPT" "$artist" "$title")" \ + --accept-nth="{2}" \ + --with-nth="{1}" \ + --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" + ) exit 0 - set -- "" + [ "$sel" ] && set -- "--show-release" "$sel" ;; *) sel=$( diff --git a/src/sh/api.sh b/src/sh/api.sh index d469735..b4df70f 100644 --- a/src/sh/api.sh +++ b/src/sh/api.sh @@ -43,7 +43,7 @@ api_mb_browse_releasegroup_releases() { $CURL \ --get \ --data fmt=json \ - --data inc=artist-credits \ + --data inc="artist-credits+labels+media" \ --data limit="$MB_BROWSE_STEPS" \ --data offset="${2:-0}" \ --data release-group="$1" \ diff --git a/src/sh/theme.sh b/src/sh/theme.sh index d48e950..68881e9 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -1,15 +1,22 @@ +# Colors FAINT="\033[2m" COLOR_ARTIST="\033[38;5;209m" COLOR_DISAMBIGUATION="$FAINT\033[38;5;172m" COLOR_DESCRIPTION="${COLOR_DESCRIPTION:-"\033[38;5;254m"}" COLOR_LIFESPAN="${COLOR_LIFESPAN:-"\033[38;5;251m"}" COLOR_RESET="\033[m" +COLOR_NOTE="\033[38;5;242m" +COLOR_TYPE_SECONDARY="$COLOR_NOTE" +COLOR_RELEASE_TITLE="\033[38;5;229m" +COLOR_RELEASE_YEAR="\033[38;5;179m" +COLOR_RELEASE_STATUS="$COLOR_RELEASE_YEAR" + +# Artist view 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}" -COLOR_TYPE_SECONDARY="\033[38;5;242m" -COLOR_RELEASE_TITLE="\033[38;5;229m" -COLOR_RELEASE_YEAR="\033[38;5;179m" + +# Release group view FORMAT_RELEASE="${FORMAT_RELEASE:-"${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET"}" FORMAT_RELEASE_W_ARTIST="${FORMAT_RELEASE_W_ARTIST:-"${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET โ€” ${COLOR_ARTIST}<<artist>>$COLOR_RESET"}" FORMAT_YEAR="${FORMAT_YEAR:-"${COLOR_RELEASE_YEAR}(<<year>>)${COLOR_RESET}"}" @@ -33,14 +40,10 @@ FORMAT_TYPE_SECONDARY_MIXTAPE="${FORMAT_TYPE_SECONDARY_MIXTAPE:-"๐Ÿ“ผ mixtape"}" FORMAT_TYPE_SECONDARY_DEMO="${FORMAT_TYPE_SECONDARY_DEMO:-"๐Ÿงช demo"}" FORMAT_TYPE_SECONDARY_FIELDREC="${FORMAT_TYPE_SECONDARY_FIELDREC:-"๐ŸŒฟ field recording"}" +# Prompts SEARCH_PROMPT=${SEARCH_PROMPT:-"๐Ÿ”Ž โŒช"} ARTIST_PROMPT="${ARTIST_PROMPT:-"๐ŸŽค ${COLOR_ARTIST}%s$COLOR_RESET โŒช"}" -#BROWSE_PROMPT_ROOT="${BROWSE_PROMPT_ROOT:-"$SEARCH_PROMPT"}" -#BROWSE_PROMPT_ARTIST="${BROWSE_PROMPT_ARTIST:-"$AFMT โŒช"}" -#BROWSE_PROMPT_RELEASE="${BROWSE_PROMPT_RELEASE:-"$AFMT ใ€‹ $RFMT โŒช"}" -#AFMT="${AFMT:-"๐ŸŽค ${ARTIST_COLOR}%s${OFF}"}" -#RFMT="${RFMT:-"๐Ÿ’ฝ ${RELEASE_COLOR}%s${OFF}"}" -#TFMT="${TFMT:-"๐ŸŽต ${TRACK_COLOR}%s${OFF}"}" +FULL_PROMPT="${FULL_PROMPT:-"๐ŸŽค ${COLOR_ARTIST}%s$COLOR_RESET ยป ${COLOR_RELEASE_TITLE}%s$COLOR_RESET โŒช"}" # Artist Preview FORMAT_DATE="${FORMAT_DATE:-"%s"}" @@ -48,3 +51,16 @@ FORMAT_PLACE="${FORMAT_PLACE:-"%s"}" FORMAT_DATEPLACE="${FORMAT_DATEPLACE:-"%s, %s"}" FORMAT_LIFESPAN_BORN="${FORMAT_LIFESPAN_BORN:-"๐Ÿผ Born: %s"}" FORMAT_LIFESPAN_DIED="${FORMAT_LIFESPAN_DIED:-"๐Ÿ•ฏ๏ธ Died: %s"}" + +# Release view +RELEASE_OFFICIAL="${RELEASE_OFFICIAL:-"๐ŸŸข official"}" +RELEASE_PROMOTION="${RELEASE_PROMOTION:-"๐Ÿ“ฃ promo"}" +RELEASE_BOOTLEG="${RELEASE_BOOTLEG:-"๐Ÿ’ฃ bootleg"}" +RELEASE_PSEUDO="${RELEASE_PSEUDO:-"๐ŸŒ€ pseudo"}" +RELEASE_WITHDRAWN="${RELEASE_WITHDRAWN:-"๐Ÿ”™ withdrawn"}" +RELEASE_EXPUNGED="${RELEASE_EXPUNGED:-"๐Ÿงน expunged"}" +RELEASE_CANCELLED="${RELEASE_CANCELLED:-"โŒ cancelled"}" +RELEASE_FORMAT="${COLOR_TYPE_SECONDARY}<<status>>$COLOR_RESET\t${COLOR_RELEASE_YEAR}<<year>>$COLOR_RESET\t${COLOR_NOTE}<<tracks>> tx / <<media>>$COLOR_RESET\t${COLOR_ARTIST}<<label>>$COLOR_RESET" +RELEASE_TITLE_ARTIST="${FAINT}${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET โ€” ${FAINT}${COLOR_ARTIST}<<artist>>$COLOR_RESET" +RELEASE_TITLE="${FAINT}${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET" +RELEASE_ARTIST="${FAINT}by ${COLOR_ARTIST}<<artist>>$COLOR_RESET"