diff --git a/src/awk/releasegroups.awk b/src/awk/releasegroups.awk new file mode 100644 index 0000000..238eb94 --- /dev/null +++ b/src/awk/releasegroups.awk @@ -0,0 +1,22 @@ +BEGIN { OFS="\t" } + +{ + gsub("&", "\\\\&") + id = $1 + type = $2 + year = substr($3, 1, 4) + 0 + title = $4 + if (type == "Single") + line = format_single + else if (type == "Album") + line = format_album + else if (type == "EP") + line = format_ep + else + line = format_album + if (year) + line = line " " format_year + sub("<>", title, line) + sub("<<year>>", year, line) + print id, line +} diff --git a/src/awk/releases.awk b/src/awk/releases.awk new file mode 100644 index 0000000..b87b3e0 --- /dev/null +++ b/src/awk/releases.awk @@ -0,0 +1,57 @@ +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 +} + +{ + 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 + } +} + +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("<<year>>", dt, line) + sub("<<title>>", ti, line) + print mi, line + } +} diff --git a/src/main.sh b/src/main.sh index b8f4063..67fd496 100755 --- a/src/main.sh +++ b/src/main.sh @@ -23,7 +23,7 @@ set -eu # Load preview methods . "sh/preview.sh" -if [ "${1:-}" = "--internal-preview" ]; then +if [ "${1:-}" = "--internal-preview-artist" ]; then __preview_artist "$2" exit 0 fi @@ -49,7 +49,7 @@ if [ "${1:-}" = "--internal-search" ]; then echo "$$" >"$PIDFILE" sleep 1 touch "$LOCKFILE" - mb_browse_artists "$2" | + mb_search_artists "$2" | $JQ -r '.artists[] | [.id, .type, .name, .disambiguation, .["life-span"].begin, .["life-span"].end] | join("\t")' | awk \ -F "\t" \ @@ -63,6 +63,24 @@ if [ "${1:-}" = "--internal-search" ]; then exit 0 fi +if [ "${1:-}" = "--internal-browse-artist" ]; then + mb_browse_release_groups "$2" | + $JQ -r '."release-groups"[] | [ + .id, + ."primary-type", + ."first-release-date", + .title + ] | join("\t")' | + awk \ + -F "\t" \ + -v format_album="$FORMAT_ALBUM" \ + -v format_single="$FORMAT_SINGLE" \ + -v format_ep="$FORMAT_EP" \ + -v format_year="$FORMAT_YEAR" \ + "$AWK_RELEASEGROUPS" + exit 0 +fi + if [ "${1:-}" = "--help" ]; then $CAT <<EOF Usage: \`$0\` [ \`--help\` ] @@ -73,6 +91,9 @@ EOF exit 0 fi +# Set window title +printf '\033]0;%s\007' "$WINDOW_TITLE" + # Generate filenames for temporary files tmpdir=$(mktemp -d) LOCKFILE="$tmpdir/lock" @@ -86,18 +107,35 @@ if [ "${1:-}" = "--search" ]; then fi while true; do - sel=$( - printf "" | - $FZF \ - --ansi \ - --no-sort \ - --disabled \ - --delimiter="\t" \ - --accept-nth="{1}" \ - --with-nth="{2}" \ - --preview-window="wrap" \ - --preview="$0 --internal-preview {1}" \ - --bind="change:execute-silent($0 --internal-search \$FZF_QUERY &)+reload($0 --internal-reload)" - ) - echo "$sel" + case "${1:-}" in + "--show-artist") + sel=$( + $0 --internal-browse-artist "$2" | + $FZF \ + --ansi \ + --no-sort \ + --disabled \ + --delimiter="\t" \ + --accept-nth="{1}" \ + --with-nth="{2}" + ) + [ "$sel" ] && set -- "--show-release" "$sel" + ;; + *) + sel=$( + printf "" | + $FZF \ + --ansi \ + --no-sort \ + --disabled \ + --delimiter="\t" \ + --accept-nth="{1}" \ + --with-nth="{2}" \ + --preview-window="wrap" \ + --preview="$0 --internal-preview-artist {1}" \ + --bind="change:execute-silent($0 --internal-search \$FZF_QUERY &)+reload($0 --internal-reload)" + ) + [ "$sel" ] && set -- "--show-artist" "$sel" + ;; + esac done diff --git a/src/sh/api.sh b/src/sh/api.sh index 3afa51a..39f09c0 100644 --- a/src/sh/api.sh +++ b/src/sh/api.sh @@ -1,5 +1,26 @@ +# Argument: MB Artist ID +mb_browse_releases() { + $CURL \ + --get \ + --data-urlencode fmt=json \ + --data-urlencode artist="$1" \ + --data-urlencode inc=release-groups \ + -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ + "https://musicbrainz.org/ws/2/release" +} + +# Argument: MB Artist ID +mb_browse_release_groups() { + $CURL \ + --get \ + --data-urlencode fmt=json \ + --data-urlencode artist="$1" \ + -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ + "https://musicbrainz.org/ws/2/release-group" +} + # Argument: Search string -mb_browse_artists() { +mb_search_artists() { $CURL \ --get \ --data-urlencode fmt=json \ diff --git a/src/sh/awk.sh b/src/sh/awk.sh index fa00411..0b0872e 100644 --- a/src/sh/awk.sh +++ b/src/sh/awk.sh @@ -4,3 +4,17 @@ AWK_ARTISTS=$( EOF ) export AWK_ARTISTS + +AWK_RELEASES=$( + cat <<'EOF' +@@include awk/releases.awk +EOF +) +export AWK_RELEASES + +AWK_RELEASEGROUPS=$( + cat <<'EOF' +@@include awk/releasegroups.awk +EOF +) +export AWK_RELEASEGROUPS diff --git a/src/sh/info.sh b/src/sh/info.sh index f39d1e2..97c1275 100644 --- a/src/sh/info.sh +++ b/src/sh/info.sh @@ -1,5 +1,5 @@ APP_NAME="muf" APP_VERSION="zero.zero" APP_WEBSITE="https://git.indyfac.ch/amin/muf" -WINDOW_TITLE="🔎🎶 $APP_NAME" +WINDOW_TITLE="🔎🎶 $APP_NAME | a simple music finder" export APP_NAME APP_VERSION APP_WEBSITE WINDOW_TITLE diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 23d4c5c..43a894d 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -4,4 +4,14 @@ 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 +COLOR_ALBUM="\033[38;5;208m" +COLOR_SINGLE="\033[38;5;210m" +COLOR_EP="\033[38;5;209m" +COLOR_RELEASE_TITLE="\033[38;5;229m" +COLOR_RELEASE_YEAR="\033[38;5;179m" +FORMAT_ALBUM="${FORMAT_ALBUM:-"💽 ${COLOR_ALBUM} LP $COLOR_RESET $COLOR_RELEASE_TITLE<<title>>$COLOR_RESET"}" +FORMAT_SINGLE="${FORMAT_SINGLE:-"💽 ${COLOR_SINGLE}single$COLOR_RESET $COLOR_RELEASE_TITLE<<title>>$COLOR_RESET"}" +FORMAT_EP="${FORMAT_EP:-"💽 ${COLOR_EP} EP $COLOR_RESET $COLOR_RELEASE_TITLE<<title>>$COLOR_RESET"}" +FORMAT_YEAR="${FORMAT_YEAR:-"${COLOR_RELEASE_YEAR}(<<year>>)${COLOR_RESET}"}" +export FORMAT_PERSON FORMAT_GROUP FORMAT_DISAMBIGUATION \ + FORMAT_ALBUM FORMAT_SINGLE FORMAT_EP FORMAT_YEAR