#!/bin/sh set -eu # Load helper methods . "sh/info.sh" # Load helper methods . "sh/helper.sh" # Load configuration . "sh/config.sh" # Load theme . "sh/theme.sh" # Load AWK scripts . "sh/awk.sh" # Load tools . "sh/tools.sh" # Load MusicBrainz and Discogs methods . "sh/api.sh" # Load preview methods . "sh/preview.sh" # Load cache functionality . "sh/cache.sh" # Load MusicBrainz wrappers . "sh/mb.sh" # Load local file handling . "sh/local.sh" # Load list-generating methods . "sh/lists.sh" if [ "${1:-}" = "--fzf-reload" ]; then mode=$(cut -d "#" -f 1 "$MODEFILE") args=$(cut -d "#" -f 2- "$MODEFILE") case "$mode" in "$MODE_ARTIST") list_releasegroups "$args" ;; "$MODE_RELEASEGROUP") list_releases "$args" ;; "$MODE_RELEASE") list_recordings "$args" ;; "$MODE_LIST_ARTISTS") list_local_artists ;; "$MODE_LIST_ALBUMS") list_local_releasegroups ;; "$MODE_SELECT_ARTIST") true ;; esac exit 0 fi if [ "${1:-}" = "--fzf-load" ]; then mode=$(cut -d "#" -f 1 "$MODEFILE") args=$(cut -d "#" -f 2- "$MODEFILE") case "$mode" in "$MODE_ARTIST") secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")" QUERY="$(printf "!%s " "$secsymb")" name="$(mb_artist "$args" | $JQ -r '.name')" PROMPT=$(printf "$ARTIST_PROMPT" "$name") ;; "$MODE_RELEASEGROUP") title="$(mb_releasegroup "$args" | $JQ -r '.title')" artist="$(mb_releasegroup "$args" | $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title") ;; "$MODE_RELEASE") title="$(mb_release "$args" | $JQ -r '.title')" artist="$(mb_release "$args" | $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title") ;; "$MODE_SEARCH_ARTIST") ENABLE_CHANGE=1 DISABLE_SEARCH=1 SHOW_PREVIEW=1 ;; "$MODE_SEARCH_ALBUM") ENABLE_CHANGE=1 DISABLE_SEARCH=1 ;; "$MODE_LIST_ARTISTS") SHOW_PREVIEW=1 ;; "$MODE_LIST_ALBUMS") ;; "$MODE_SELECT_ARTIST") ;; esac [ "${QUERY:-}" ] && printf "+change-query(%s)" "$QUERY" printf "+change-prompt(%s)" "${PROMPT:-"$SEARCH_PROMPT"}" [ "${DISABLE_SEARCH:-}" ] && printf "+disable-search" || printf "+enable-search" [ "${SHOW_PREVIEW:-}" ] && printf "+show-preview" || printf "+hide-preview" [ "${ENABLE_CHANGE:-}" ] && printf "+rebind(change)" || printf "+unbind(change)" exit 0 fi if [ "${1:-}" = "--fzf-info" ]; then mode=$(cut -d "#" -f 1 "$MODEFILE") args=$(cut -d "#" -f 2- "$MODEFILE") case "$mode" in "$MODE_SEARCH_ARTIST") echo "Search music artist on MusicBrainz" ;; "$MODE_SEARCH_ALBUM") echo "Search album on MusicBrainz" ;; "$MODE_LIST_ARTISTS") echo "Search artists" ;; "$MODE_LIST_ALBUMS") echo "Search albums" ;; "$MODE_SELECT_ARTIST") echo "Select artist" ;; *) if [ "$FZF_KEY" ]; then printf "[last key: %s] %s/%s" "$FZF_KEY" "$FZF_MATCH_COUNT" "$FZF_TOTAL_COUNT" else printf "%s/%s" "$FZF_MATCH_COUNT" "$FZF_TOTAL_COUNT" fi ;; esac exit 0 fi if [ "${1:-}" = "--fzf-change-reload" ]; then # Wait for async. process to terminate sleep 1 while [ -f "$LOCKFILE" ]; do sleep 1 done # Show results column -t -s "$(printf '\t')" "$RESULTS" | sed 's| \+\([0-9a-f-]\+\)$|\t\1|' exit 0 fi if [ "${1:-}" = "--fzf-change" ]; then # Kill any running search if [ -f "$PIDFILE" ]; then pid=$(cat "$PIDFILE") rm -f "$PIDFILE" kill -9 "$pid" >/dev/null 2>&1 || true fi # Stop, if no search string is given [ "$FZF_QUERY" ] || exit 0 # Store PID of current process echo "$$" >"$PIDFILE" touch "$LOCKFILE" sleep 1 mode=$(cut -d "#" -f 1 "$MODEFILE") if [ "$mode" = "$MODE_SEARCH_ARTIST" ]; then api_mb_search_artist "$FZF_QUERY" | $JQ -r '.artists[] | [ .id, .type, .name, .disambiguation, .["life-span"].begin, .["life-span"].end ] | join("\t")' | awk \ -F "\t" \ -v file_local_artists="${LOCALDATA_ARTISTS:-}" \ -v format_person="$AV_PERSON" \ -v format_group="$AV_GROUP" \ -v format_disambiguation="$AV_DISAMBIGUATION" \ -v format_local="$FORMAT_LOCAL" \ "$AWK_ARTISTS" >"$RESULTS" || true else api_mb_search_releasegroup "$FZF_QUERY" | $JQ -r '."release-groups"[] | [ .id, ."primary-type", (."secondary-types" // []|join(";")), ."first-release-date", .title, (."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")) ] | join("\t")' | awk \ -F "\t" \ -v file_local_releasegroups="${LOCALDATA_RELEASEGROUPS:-}" \ -v format_release="$RGV_RELEASE" \ -v format_release_w_artist="$RGV_RELEASE_W_ARTIST" \ -v format_year="$RGV_YEAR" \ -v format_album="$FORMAT_TYPE_ALBUM" \ -v format_single="$FORMAT_TYPE_SINGLE" \ -v format_ep="$FORMAT_TYPE_EP" \ -v format_broadcast="$FORMAT_TYPE_BROADCAST" \ -v format_other="$FORMAT_TYPE_OTHER" \ -v format_has_secondary="$FORMAT_TYPE_HAS_SECONDARY" \ -v format_secondary="$FORMAT_TYPE_SECONDARY" \ -v format_compilation="$FORMAT_TYPE_SECONDARY_COMPILATION" \ -v format_soundtrack="$FORMAT_TYPE_SECONDARY_SOUNDTRACK" \ -v format_spokenword="$FORMAT_TYPE_SECONDARY_SPOKENWORD" \ -v format_interview="$FORMAT_TYPE_SECONDARY_INTERVIEW" \ -v format_audiobook="$FORMAT_TYPE_SECONDARY_AUDIOBOOK" \ -v format_audiodrama="$FORMAT_TYPE_SECONDARY_AUDIODRAMA" \ -v format_live="$FORMAT_TYPE_SECONDARY_LIVE" \ -v format_remix="$FORMAT_TYPE_SECONDARY_REMIX" \ -v format_djmix="$FORMAT_TYPE_SECONDARY_DJMIX" \ -v format_mixtape="$FORMAT_TYPE_SECONDARY_MIXTAPE" \ -v format_demo="$FORMAT_TYPE_SECONDARY_DEMO" \ -v format_fieldrec="$FORMAT_TYPE_SECONDARY_FIELDREC" \ -v format_local="$FORMAT_LOCAL" \ "$AWK_RELEASEGROUPS" | cut -d "$(printf '\t')" -f 2- >"$RESULTS" || true fi # Process ends now: Display and quit rm -f "$LOCKFILE" "$PIDFILE" exit 0 fi generate_playlist() { dir="$(dirname "$2")" mb_release "$1" | $JQ -r --slurpfile deco "$2" --arg base "$dir" '$deco[].tracks as $filenames | .media[] | .position as $pos | .tracks | map({ $pos, number: .number, file: $filenames[.id] }) | map( if(.number | type == "string" and test("^[0-9]+$")) then .number |= tonumber else . end ) | sort_by([.pos, .number]) | map($base + "/" + .file)[]' } if [ "${1:-}" = "--fzf-key" ]; then mbid="${2:-}" path="${3:-}" mode=$(cut -d "#" -f 1 "$MODEFILE") args=$(cut -d "#" -f 2- "$MODEFILE") if [ "$FZF_KEY" = "enter" ] && [ "$path" ]; then case "$mode" in "$MODE_RELEASEGROUP") generate_playlist "$mbid" "$path" >"$tmplist" mpv_play_list "$tmplist" >/dev/null rm -f "$tmplist" ;; "$MODE_RELEASE") mpv_play_file "$path" >/dev/null ;; esac elif [ "$FZF_KEY" = "alt-enter" ] && [ "$path" ]; then case "$mode" in "$MODE_RELEASEGROUP") generate_playlist "$mbid" "$path" >"$tmplist" mpv_queue_list "$tmplist" >/dev/null rm -f "$tmplist" ;; "$MODE_RELEASE") mpv_queue_file "$path" >/dev/null ;; esac elif [ "$FZF_KEY" = "alt-space" ]; then mpv_toggle_pause >/dev/null elif [ "$FZF_KEY" = "ctrl-n" ] && [ "$path" ]; then mpv_next >/dev/null elif [ "$FZF_KEY" = "ctrl-p" ] && [ "$path" ]; then mpv_prev >/dev/null elif [ "$FZF_KEY" = "shift-right" ] && [ "$path" ]; then mpv_seek_forward >/dev/null elif [ "$FZF_KEY" = "shift-left" ] && [ "$path" ]; then mpv_seek_backward >/dev/null elif [ "$FZF_KEY" = "ctrl-d" ]; then printf "half-page-down" elif [ "$FZF_KEY" = "down" ]; then printf "preview-half-page-down" elif [ "$FZF_KEY" = "up" ]; then printf "preview-half-page-up" elif [ "$FZF_KEY" = "ctrl-u" ]; then printf "half-page-up" elif [ "$FZF_KEY" = "alt-l" ]; then case "$mode" in "$MODE_SEARCH_ARTIST" | "$MODE_SEARCH_ALBUM") ;; *) QUERY="$FORMAT_LOCAL " ;; esac elif [ "$FZF_KEY" = "tab" ]; then case "$mode" in "$MODE_SEARCH_ARTIST") MODE_NEXT="$MODE_SEARCH_ALBUM" ;; "$MODE_SEARCH_ALBUM") MODE_NEXT="$MODE_SEARCH_ARTIST" ;; "$MODE_LIST_ARTISTS") MODE_NEXT="$MODE_LIST_ALBUMS" ;; "$MODE_LIST_ALBUMS") MODE_NEXT="$MODE_LIST_ARTISTS" ;; esac elif [ "$FZF_KEY" = "ctrl-/" ]; then case "$mode" in "$MODE_SEARCH_ARTIST") MODE_NEXT="$MODE_LIST_ARTISTS" ;; "$MODE_SEARCH_ALBUM") MODE_NEXT="$MODE_LIST_ALBUMS" ;; "$MODE_LIST_ARTISTS") MODE_NEXT="$MODE_SEARCH_ARTIST" ;; "$MODE_LIST_ALBUMS") MODE_NEXT="$MODE_SEARCH_ALBUM" ;; esac elif [ "$FZF_KEY" = "alt-b" ] && [ "$mbid" ]; then case "$mode" in "$MODE_ARTIST") urltype="release-group" ;; "$MODE_RELEASEGROUP") urltype="release" ;; "$MODE_RELEASE") urltype="track" ;; esac printf "esecute-silent(xdg-open \"https://musicbrainz.org/%s/%s\" &)" "$urltype" "$mbid" elif [ "$FZF_KEY" = "ctrl-h" ]; then case "$mode" in "$MODE_ARTIST") MODE_NEXT="$MODE_LIST_ARTISTS" ;; "$MODE_RELEASEGROUP") MODE_NEXT="$MODE_SELECT_ARTIST" MODE_NEXT_ARGS="$(mb_releasegroup "$args" | $JQ -r --compact-output '."artist-credit"')" ;; "$MODE_RELEASE") MODE_NEXT="$MODE_RELEASEGROUP" MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."release-group".id')" ;; esac elif [ "$FZF_KEY" = "ctrl-l" ] && [ "$mbid" ]; then MODE_NEXT_ARGS="$mbid" case "$mode" in "$MODE_LIST_ARTISTS" | "$MODE_SEARCH_ARTIST") MODE_NEXT="$MODE_ARTIST" ;; "$MODE_ARTIST") MODE_NEXT="$MODE_RELEASEGROUP" ;; "$MODE_RELEASEGROUP" | "$MODE_LIST_ALBUMS" | "$MODE_SEARCH_ALBUM") MODE_NEXT="$MODE_RELEASE" ;; esac elif [ "$FZF_KEY" = "ctrl-a" ] && [ "$mbid" ]; then case "$mode" in "$MODE_ARTIST" | "$MODE_SEARCH_ARTIST" | "$MODE_LIST_ARTISTS") MODE_NEXT_ARGS="$(mb_releasegroup "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;; "$MODE_RELEASEGROUP" | "$MODE_SEARCH_ALBUM" | "$MODE_LIST_ALBUMS") MODE_NEXT_ARGS="$(mb_release "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;; "$MODE_RELEASE") MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."artist-credit"')" ;; esac [ "$MODE_NEXT_ARGS" ] && MODE_NEXT="$MODE_SELECT_ARTIST" else # View specific commands case "$mode" in "$MODE_ARTIST") case "$FZF_KEY" in "alt-1") secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")" QUERY="!$secsymb " ;; "alt-2") secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")" QUERY="$secsymb " ;; esac ;; esac fi [ "${QUERY:-}" ] && printf "+change-query(%s)" "$QUERY" if [ "$MODE_NEXT" ]; then printf "%s#%s" "$MODE_NEXT" "${MODE_NEXT_ARGS:-}" >"$MODEFILE" printf "+clear-query+reload:%s" "$0 --fzf-reload" fi exit 0 fi # Support of local music files if [ "${1:-}" = "--decorate" ]; then [ ! "${2:-}" ] && err "You did not specify a directory." && exit 1 [ ! -d "$2" ] && err "Path $2 does not point to a directory." && exit 1 if ! decorate "$2"; then err "Something went wrong. Are you're files tagged correctly?" exit 1 fi exit 0 fi if [ "${1:-}" = "--reload" ]; then [ ! "${2:-}" ] && err "Path to decorated music is missing." && exit 1 [ ! -d "$2" ] && err "Path does not point to a directory." && exit 1 info "Reloading information of local music directory $2" load_local "$2" || err "Failed to load local data" info "Done" exit 0 fi if [ "${1:-}" = "--internal-preview-artist" ]; then __preview_artist "$2" exit 0 fi if [ "${1:-}" = "--help" ]; then cat <] Search artist on MusicBrainz --search-album [] Search album on MusicBrainz --artist List release groups of given artist --releasegroup List releases in given release group --release Show release given by --ni-search-artist [] Non-interactive search on MusicBrainz --ni-search-album [] Non-interactive search on MusicBrainz MANAGE LOCAL MUSIC: --decorate Decorate directory containing a tagged release --reload Populate database with decorated local music from 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" RESULTS="$tmpdir/results" PIDFILE="$tmpdir/pid" MODEFILE="$tmpdir/mode" trap 'rm -rf "$tmpdir"' EXIT INT export LOCKFILE RESULTS PIDFILE MODEFILE if [ "${1:-}" = "--ni-search-artist" ]; then $0 --internal-search "artist" "$2" exit 0 fi if [ "${1:-}" = "--ni-search-album" ]; then $0 --internal-search "releasegroup" "$2" exit 0 fi # Modes MODE_ARTIST="artist" MODE_RELEASEGROUP="rg" MODE_RELEASE="release" MODE_SEARCH_ARTIST="search-artist" MODE_SEARCH_ALBUM="search-album" MODE_LIST_ARTISTS="list-artists" MODE_LIST_ALBUMS="list-albums" MODE_SELECT_ARTIST="select-artist" export MODE_ARTIST MODE_RELEASEGROUP MODE_RELEASE MODE_SEARCH_ARTIST \ MODE_SEARCH_ALBUM MODE_LIST_ARTISTS MODE_LIST_ALBUMS MODE_SELECT_ARTIST case "${1:-}" in "--artist") [ ! "${2:-}" ] && err "MusicBrainz Artist ID not specified (see --help)" && exit 1 printf "%s#%s" "$MODE_ARTIST" "$2" >"$MODEFILE" ;; "--releasegroup") [ ! "${2:-}" ] && err "MusicBrainz Release-Group ID not specified (see --help)" && exit 1 printf "%s#%s" "$MODE_RELEASEGROUP" "$2" >"$MODEFILE" ;; "--release") [ ! "${2:-}" ] && err "MusicBrainz Release ID not specified (see --help)" && exit 1 printf "%s#%s" "$MODE_RELEASE" "$2" >"$MODEFILE" ;; "--search-artist") printf "%s#%s" "$MODE_SEARCH_ARTIST" "${2:-}" >"$MODEFILE" ;; "--search-album") printf "%s#%s" "$MODE_SEARCH_ALBUM" "${2:-}" >"$MODEFILE" ;; "--artists" | "") printf "%s" "$MODE_LIST_ARTISTS" >"$MODEFILE" ;; "--albums") printf "%s" "$MODE_LIST_ALBUMS" >"$MODEFILE" ;; *) err "Unknown option $1 (see --help)" exit 1 ;; esac # Start mpv mpv_start $FZF \ --bind="start:reload:$0 --fzf-reload" \ --bind="load:transform:$0 --fzf-load" \ --bind="change:execute-silent($0 --fzf-change &)+reload:$0 --fzf-change-reload" \ --bind="ctrl-d:transform:$0 --fzf-key" \ --bind="ctrl-u:transform:$0 --fzf-key" \ --bind="alt-b:transform:$0 --fzf-key {2}" \ --bind="ctrl-h:transform:$0 --fzf-key {2}" \ --bind="ctrl-l:transform:$0 --fzf-key {2}" \ --bind="ctrl-a:transform:$0 --fzf-key {2}" \ --bind="alt-l:transform:$0 --fzf-key" \ --bind="alt-1:transform:$0 --fzf-key" \ --bind="alt-2:transform:$0 --fzf-key" \ --bind="tab:transform:$0 --fzf-key" \ --bind="ctrl-/:transform:$0 --fzf-key" \ --bind="enter:transform:$0 --fzf-key {2} {3}" \ --bind="alt-enter:transform:$0 --fzf-key {2} {3}" \ --bind="alt-space:transform:$0 --fzf-key" \ --bind="alt-space:transform:$0 --fzf-key" \ --bind="ctrl-n:transform:$0 --fzf-key" \ --bind="ctrl-p:transform:$0 --fzf-key" \ --bind="shift-right:transform:$0 --fzf-key" \ --bind="shift-left:transform:$0 --fzf-key" \ --info="inline-right" \ --info-command="$0 --fzf-info" \ --preview-window="right,25%,border-left,wrap,<30(hidden)" \ --preview="$0 --internal-preview-artist {2}" \ --delimiter="\t" \ --with-nth="{1}" \ --accept-nth="{2}" while true; do case "${1:-}" in "--releasegroup") title="$(mb_releasegroup "$2" | $JQ -r '.title')" artist="$(mb_releasegroup "$2" | $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" sel=$( $0 --internal-list-releases "$2" | $FZF \ --no-clear \ --ansi \ --reverse \ --cycle \ --no-sort \ --query="$FORMAT_STATUS_OFFICIAL " \ --delimiter="\t" \ --prompt="$(printf "$FULL_PROMPT" "$artist" "$title")" \ --accept-nth="{2}" \ --with-nth="{1}" \ --expect="ctrl-h,ctrl-a" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="load:transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="enter:execute-silent:$0 --play-release {2} {3}" \ --bind="alt-enter:execute-silent:$0 --play-release {2} {3} q" \ --bind="alt-space:execute-silent:$0 --play-toggle" \ --bind="ctrl-n:execute-silent:$0 --play-next" \ --bind="ctrl-p:execute-silent:$0 --play-previous" \ --bind="shift-right:execute-silent:$0 --seek-forward" \ --bind="shift-left:execute-silent:$0 --seek-backward" \ --bind="focus:transform: [ {3} ] && c=rebind || c=unbind for key in enter alt-enter alt-space ctrl-n ctrl-p shift-right shift-left; do printf \"+%s(%s)\" \"\$c\" \"\$key\" done " \ --bind="ctrl-l:accept" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release/{r2}' &" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--release" "$mid" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-h" ] && set -- "--select-artist" "$(mb_releasegroup "$2" | $JQ -r -c '."artist-credit"')" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_release "$mid" | $JQ -r -c '."artist-credit"')" ;; "--release") title="$(mb_release "$2" | $JQ -r '.title')" artist="$(mb_release "$2" | $JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')" sel=$( $0 --internal-list-recordings "$2" | $FZF \ --no-clear \ --ansi \ --reverse \ --cycle \ --no-sort \ --delimiter="\t" \ --prompt="$(printf "$FULL_PROMPT" "$artist" "$title")" \ --accept-nth="{2}" \ --with-nth="{1}" \ --expect="ctrl-h,ctrl-a" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="enter:execute-silent:$0 --play-recording {3}" \ --bind="alt-enter:execute-silent:$0 --play-recording {3} q" \ --bind="alt-space:execute-silent:$0 --play-toggle" \ --bind="ctrl-n:execute-silent:$0 --play-next" \ --bind="ctrl-p:execute-silent:$0 --play-previous" \ --bind="shift-right:execute-silent:$0 --seek-forward" \ --bind="shift-left:execute-silent:$0 --seek-backward" \ --bind="focus:transform: [ {3} ] && c=rebind || c=unbind for key in enter alt-enter alt-space ctrl-n ctrl-p shift-right shift-left; do printf \"+%s(%s)\" \"\$c\" \"\$key\" done " \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/track/{r2}' &" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$lns" -eq 2 ] && [ "$key" = "ctrl-h" ] && set -- "--releasegroup" "$(mb_release "$2" | $JQ -r -c '."release-group".id')" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_release "$2" | $JQ -r -c ".media[].tracks[] | select(.id==\"$mid\") | .\"artist-credit\"")" ;; "--playlist") count=$(mpv_playlist_count) echo "Playlist: count=$count" >>/tmp/foo set -- "" ;; "--select-artist") tput rmcup sel=$( echo "$2" | $JQ -r 'map([.artist.id, .artist.type, .name] | join("\t")) | join("\n")' | awk \ -F "\t" \ -v file_local_artists="${LOCALDATA_ARTISTS:-}" \ -v format_person="$AV_PERSON" \ -v format_group="$AV_GROUP" \ -v format_disambiguation="$AV_DISAMBIGUATION" \ -v format_local="$FORMAT_LOCAL" \ "$AWK_ARTISTS" | column -t -s "$(printf '\t')" | sed 's| \+\([0-9a-f-]\+\)$|\t\1|' | $FZF \ --no-clear \ -1 \ --ansi \ --cycle \ --no-sort \ --border="bold" \ --border-label="Select artist" \ --delimiter="\t" \ --prompt="$SEARCH_PROMPT" \ --margin="5%,20%" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --accept-nth="{2}" \ --with-nth="{1}" ) [ "$sel" ] && set -- "--artist" "$sel" ;; "--search-album") sel=$( printf "" | $FZF \ --no-clear \ --ansi \ --reverse \ --no-sort \ --disabled \ --cycle \ --delimiter="\t" \ --prompt="$SEARCH_PROMPT" \ --info="inline-right" \ --info-command="echo \"Search album on MusicBrainz\"" \ --color='input-fg:#ba478f' \ --accept-nth="{2}" \ --with-nth="{1}" \ --expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-/" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="start:transform:[ \"${2:-}\" ] && echo \"change-query:${2:-}\"" \ --bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="ctrl-l:accept" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \ --bind="change:execute-silent($0 --internal-search releasegroup \$FZF_QUERY &)+reload($0 --internal-reload)" || true ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "tab" ] && set -- "--search-artist" [ "$key" = "ctrl-/" ] && set -- "--albums" [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid" ;; "--search-artist") sel=$( printf "" | $FZF \ --no-clear \ --ansi \ --reverse \ --no-sort \ --disabled \ --cycle \ --delimiter="\t" \ --prompt="$SEARCH_PROMPT" \ --info="inline-right" \ --info-command="echo \"Search music artist on MusicBrainz\"" \ --color='input-fg:#ba478f' \ --accept-nth="{2}" \ --with-nth="{1}" \ --preview-window="right,25%,border-left,wrap,<30(hidden)" \ --preview="$0 --internal-preview-artist {2}" \ --expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-/" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="start:transform:[ \"${2:-}\" ] && echo \"change-query:${2:-}\"" \ --bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="ctrl-l:accept" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="down:preview-half-page-down,up:preview-half-page-up" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/artist/{r2}' &" \ --bind="change:execute-silent($0 --internal-search artist \$FZF_QUERY &)+reload($0 --internal-reload)" || true ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "tab" ] && set -- "--search-album" [ "$key" = "ctrl-/" ] && set -- "--artists" [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--artist" "$mid" ;; "--albums") sel=$( $0 --internal-list-local-releasegroups | $FZF \ --no-clear \ --ansi \ --reverse \ --cycle \ --delimiter="\t" \ --prompt="$SEARCH_PROMPT" \ --info="inline-right" \ --info-command="echo \"Search albums\"" \ --accept-nth="{2}" \ --with-nth="{1}" \ --expect="ctrl-h,ctrl-a" \ --expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-/" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="load:transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="enter:execute-silent:$0 --play-release {2} {3}" \ --bind="alt-enter:execute-silent:$0 --play-release {2} {3} q" \ --bind="alt-space:execute-silent:$0 --play-toggle" \ --bind="ctrl-n:execute-silent:$0 --play-next" \ --bind="ctrl-p:execute-silent:$0 --play-previous" \ --bind="shift-right:execute-silent:$0 --seek-forward" \ --bind="shift-left:execute-silent:$0 --seek-backward" \ --bind="focus:transform: [ {3} ] && c=rebind || c=unbind for key in enter alt-enter alt-space ctrl-n ctrl-p shift-right shift-left; do printf \"+%s(%s)\" \"\$c\" \"\$key\" done " \ --bind="ctrl-l:accept" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release/{r2}' &" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" || true ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-h" ] && set -- "--albums" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_releasegroup "$mid" | $JQ -r -c '."artist-credit"')" [ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "ctrl-/" ] && set -- "--search-album" [ "$key" = "tab" ] && set -- "--artists" ;; *) sel=$( $0 --internal-list-local-artists | $FZF \ --no-clear \ --ansi \ --reverse \ --cycle \ --delimiter="\t" \ --prompt="$SEARCH_PROMPT" \ --info="inline-right" \ --info-command="echo \"Search music artist\"" \ --accept-nth="{2}" \ --with-nth="{1}" \ --preview-window="right,25%,border-left,wrap,<30(hidden)" \ --preview="$0 --internal-preview-artist {2}" \ --expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-/" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \ --bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="ctrl-l:accept" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="down:preview-half-page-down,up:preview-half-page-up" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/artist/{r2}' &" || true ) lns=$(echo "$sel" | wc -l) key=$(echo "$sel" | head -1 | tail -1) mid=$(echo "$sel" | head -2 | tail -1) [ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "tab" ] && set -- "--albums" [ "$key" = "ctrl-/" ] && set -- "--search-artist" [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--artist" "$mid" ;; esac done