diff --git a/src/main.sh b/src/main.sh index 4d2d04b..5e0ddba 100755 --- a/src/main.sh +++ b/src/main.sh @@ -30,6 +30,9 @@ MODE_INSERT="show" # Load keys . "sh/keys.sh" +# Load filters +. "sh/filter.sh" + # Load AWK scripts . "sh/awk.sh" @@ -86,6 +89,14 @@ case "${1:-}" in esac exit 0 ;; +"--filter") + mode=$2 + view=$3 + q="$(default_query "$view" "$FZF_KEY")" + printf "show-input+change-query(%s )" "$q" + [ "$mode" = "$MODE_NORMAL" ] && printf "+hide-input" + exit 0 + ;; "--jumpto-artist") mode=$2 view=$3 @@ -100,9 +111,7 @@ case "${1:-}" in if [ "${j:-}" ]; then cnt=$(echo "$j" | $JQ 'length') [ "$cnt" -eq 1 ] && aid="$(echo "$j" | $JQ -r '.[0].artist.id')" - debug "cnt=$cnt; artistid=${artistid:-}" fi - [ "${aid:-}" ] && debug "$0 --draw \"$mode\" \"$VIEW_ARTIST\" \"$aid\"" || debug "$(printf "print(%s)+print(%s)+accept" "$VIEW_SELECT_ARTIST" "$j")" [ "${aid:-}" ] && $0 --draw "$mode" "$VIEW_ARTIST" "$aid" || printf "print(%s)+print(%s)+accept" "$VIEW_SELECT_ARTIST" "$j" exit 0 ;; @@ -179,11 +188,7 @@ case "${1:-}" in *) ;; esac # Set initial query - case "$view" in - "$VIEW_ARTIST") q="!'$QUERY_HAS_SECONDARY' " ;; - "$VIEW_RELEASEGROUP") [ "$QUERY_RV" ] && q="'$QUERY_RV' " || q="" ;; - esac - printf "show-input+change-query(%s)" "${q:-}" + printf "show-input+change-query(%s )" "$(default_query "$view")" # Store current state printf "+change-border-label(%s)+change-list-label(%s)" "$view" "$mbid" # Set header @@ -460,6 +465,7 @@ esac" \ \"$VIEW_SEARCH_ARTIST\") $0 --draw $MODE_NORMAL $VIEW_LIST_ARTISTS ;; \"$VIEW_SEARCH_ALBUM\") $0 --draw $MODE_NORMAL $VIEW_LIST_ALBUMS ;; esac" \ + --bind="$KEYS_FILTER:transform:$0 --filter $FZF_CURRENT_MODE $FZF_CURRENT_VIEW" \ --bind="$KEYS_BROWSE:execute-silent: [ {3} ] || exit 0 case \"\$FZF_BORDER_LABEL\" in diff --git a/src/sh/filter.sh b/src/sh/filter.sh new file mode 100644 index 0000000..8830741 --- /dev/null +++ b/src/sh/filter.sh @@ -0,0 +1,222 @@ +# The default queries depend on the current view, and are usually derived from +# the theme. Nevertheless, they may be overwritten with the configuration file. +# Note that filters are not used in the views VIEW_SEARCH_ARTIST and +# VIEW_SEARCH_ALBUM. The reason for this is that in those modes, changing the +# query string triggers a search on the MusicBrainz website (the input is not a +# filter, but a query). +# +# The keybinding KEYS_FILTER_LOCAL triggers a filter of QUERY_LOCAL in the +# views VIEW_ARTIST, VIEW_RELEASEGROUP, and VIEW_RELEASE only. Here, it is only +# possible to adjust QUERY_LOCAL via the configuration. For all other keys, the +# filters are individually configurable, by specifying e.g., +# F_3_VIEW_LIST_ALBUMS. +# +# +# Derived queries +# To derive the queries from the theme, we must perform some steps: 1) remove +# colors, and 2) escape white spaces. This is implemented in the method +# `__clean_filter`. +# +# List of derived queries: +# - QUERY_LOCAL: Hide items that are not locally available +# - q_has_secondary: Release groups with secondary types +# - q_album: Release group is of type Album +# - q_ep: Release group is of type EP +# - q_single: Release group is of type single +# - q_official: Release is official + +__clean_filter() { + cat | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g" +} + +QUERY_LOCAL="${QUERY_LOCAL:-"$(printf "'%s'" "$FORMAT_LOCAL" | __clean_filter)"}" +q_has_seconary="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "" | __clean_filter)" +q_album="$(printf "%s" "$FORMAT_TYPE_ALBUM" | __clean_filter)" +q_ep=$(printf "%s" "$FORMAT_TYPE_EP" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") +q_single=$(printf "%s" "$FORMAT_TYPE_SINGLE" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") +if printf "$RV_FORMAT" | grep -q "<>"; then + q_official=$(printf "'%s'" "$FORMAT_STATUS_OFFICIAL" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") +fi + +F_1_VIEW_ARTIST="${F_1_VIEW_ARTIST:-"!'$q_has_seconary'"}" +F_2_VIEW_ARTIST="${F_2_VIEW_ARTIST:-"'$q_album'"}" +F_3_VIEW_ARTIST="${F_3_VIEW_ARTIST:-"'$q_ep'"}" +F_4_VIEW_ARTIST="${F_4_VIEW_ARTIST:-"'$q_single'"}" +F_5_VIEW_ARTIST="${F_5_VIEW_ARTIST:-}" +F_6_VIEW_ARTIST="${F_6_VIEW_ARTIST:-}" +F_7_VIEW_ARTIST="${F_7_VIEW_ARTIST:-}" +F_8_VIEW_ARTIST="${F_8_VIEW_ARTIST:-}" +F_9_VIEW_ARTIST="${F_9_VIEW_ARTIST:-}" +F_0_VIEW_ARTIST="${F_0_VIEW_ARTIST:-}" + +F_1_VIEW_RELEASEGROUP="${F_1_VIEW_RELEASEGROUP:-"${q_official:-}"}" +F_2_VIEW_RELEASEGROUP="${F_2_VIEW_RELEASEGROUP:-}" +F_3_VIEW_RELEASEGROUP="${F_3_VIEW_RELEASEGROUP:-}" +F_4_VIEW_RELEASEGROUP="${F_4_VIEW_RELEASEGROUP:-}" +F_5_VIEW_RELEASEGROUP="${F_5_VIEW_RELEASEGROUP:-}" +F_6_VIEW_RELEASEGROUP="${F_6_VIEW_RELEASEGROUP:-}" +F_7_VIEW_RELEASEGROUP="${F_7_VIEW_RELEASEGROUP:-}" +F_8_VIEW_RELEASEGROUP="${F_8_VIEW_RELEASEGROUP:-}" +F_9_VIEW_RELEASEGROUP="${F_9_VIEW_RELEASEGROUP:-}" +F_0_VIEW_RELEASEGROUP="${F_0_VIEW_RELEASEGROUP:-}" + +F_1_VIEW_RELEASE="${F_1_VIEW_RELEASE:-}" +F_2_VIEW_RELEASE="${F_2_VIEW_RELEASE:-}" +F_3_VIEW_RELEASE="${F_3_VIEW_RELEASE:-}" +F_4_VIEW_RELEASE="${F_4_VIEW_RELEASE:-}" +F_5_VIEW_RELEASE="${F_5_VIEW_RELEASE:-}" +F_6_VIEW_RELEASE="${F_6_VIEW_RELEASE:-}" +F_7_VIEW_RELEASE="${F_7_VIEW_RELEASE:-}" +F_8_VIEW_RELEASE="${F_8_VIEW_RELEASE:-}" +F_9_VIEW_RELEASE="${F_9_VIEW_RELEASE:-}" +F_0_VIEW_RELEASE="${F_0_VIEW_RELEASE:-}" + +F_1_LIST_ARTISTS="${F_1_LIST_ARTISTS:-}" +F_2_LIST_ARTISTS="${F_2_LIST_ARTISTS:-}" +F_3_LIST_ARTISTS="${F_3_LIST_ARTISTS:-}" +F_4_LIST_ARTISTS="${F_4_LIST_ARTISTS:-}" +F_5_LIST_ARTISTS="${F_5_LIST_ARTISTS:-}" +F_6_LIST_ARTISTS="${F_6_LIST_ARTISTS:-}" +F_7_LIST_ARTISTS="${F_7_LIST_ARTISTS:-}" +F_8_LIST_ARTISTS="${F_8_LIST_ARTISTS:-}" +F_9_LIST_ARTISTS="${F_9_LIST_ARTISTS:-}" +F_0_LIST_ARTISTS="${F_0_LIST_ARTISTS:-}" + +F_1_LIST_ALBUMS="${F_1_LIST_ALBUMS:-}" +F_2_LIST_ALBUMS="${F_2_LIST_ALBUMS:-}" +F_3_LIST_ALBUMS="${F_3_LIST_ALBUMS:-}" +F_4_LIST_ALBUMS="${F_4_LIST_ALBUMS:-}" +F_5_LIST_ALBUMS="${F_5_LIST_ALBUMS:-}" +F_6_LIST_ALBUMS="${F_6_LIST_ALBUMS:-}" +F_7_LIST_ALBUMS="${F_7_LIST_ALBUMS:-}" +F_8_LIST_ALBUMS="${F_8_LIST_ALBUMS:-}" +F_9_LIST_ALBUMS="${F_9_LIST_ALBUMS:-}" +F_0_LIST_ALBUMS="${F_0_LIST_ALBUMS:-}" + +# Determine preset query +# @argument $1: Current view +# @argument $2: Key pressed (optional) +# +# If the key is not given, then the F_1_.. query is used for the respective +# view, i.e, its as if a key from KEYS_FILTER_1 has been pressed. +default_query() { + view=$1 + key="${2:-"$(echo "$KEYS_FILTER_1" | cut -d ',' -f 1)"}" + case ",$KEYS_FILTER_LOCAL," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST" | "$VIEW_RELEASEGROUP" | "$VIEW_RELEASE") echo "$QUERY_LOCAL" ;; + esac + ;; + esac + case ",$KEYS_FILTER_1," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_1_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_1_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_1_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_1_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_1_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_2," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_2_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_2_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_2_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_2_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_2_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_3," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_3_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_3_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_3_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_3_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_3_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_4," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_4_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_4_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_4_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_4_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_4_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_5," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_5_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_5_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_5_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_5_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_5_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_6," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_6_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_6_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_6_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_6_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_6_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_7," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_7_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_7_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_7_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_7_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_7_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_8," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_8_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_8_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_8_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_8_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_8_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_9," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_9_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_9_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_9_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_9_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_9_LIST_ALBUMS" ;; + esac + ;; + esac + case ",$KEYS_FILTER_0," in + *",$key,"*) + case "$view" in + "$VIEW_ARTIST") echo "$F_0_VIEW_ARTIST" ;; + "$VIEW_RELEASEGROUP") echo "$F_0_VIEW_RELEASEGROUP" ;; + "$VIEW_RELEASE") echo "$F_0_VIEW_RELEASE" ;; + "$VIEW_LIST_ARTISTS") echo "$F_0_LIST_ARTISTS" ;; + "$VIEW_LIST_ALBUMS") echo "$F_0_LIST_ALBUMS" ;; + esac + ;; + esac +} diff --git a/src/sh/keys.sh b/src/sh/keys.sh index 2f3c5e7..8b08eae 100644 --- a/src/sh/keys.sh +++ b/src/sh/keys.sh @@ -33,6 +33,17 @@ # VIEW_LIST_ALBUMS <-> VIEW_SEARCH_ALBUM. # # Filtering: +# - KEYS_FILTER_LOCAL: List only locally available entries +# - KEYS_FILTER_0: Clear query +# - KEYS_FILTER_1: Reset query to the default one for the current view (see `src/sh/filter.sh`) +# - KEYS_FILTER_2: Preset query `2` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_3: Preset query `3` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_4: Preset query `4` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_5: Preset query `5` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_6: Preset query `6` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_7: Preset query `7` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_8: Preset query `8` depending on the view (see `src/sh/filter.sh`) +# - KEYS_FILTER_9: Preset query `9` depending on the view (see `src/sh/filter.sh`) # # Playback: # @@ -68,6 +79,20 @@ KEYS_SEARCH_ALBUM="${KEYS_SEARCH_ALBUM:-"alt-x"}" KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}" KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}" +# Filtering: +KEYS_FILTER_LOCAL="${KEYS_FILTER_LOCAL:-"alt-l"}" +KEYS_FILTER_1="${KEYS_FILTER_1:-"alt-1"}" +KEYS_FILTER_2="${KEYS_FILTER_2:-"alt-2"}" +KEYS_FILTER_3="${KEYS_FILTER_3:-"alt-3"}" +KEYS_FILTER_4="${KEYS_FILTER_4:-"alt-4"}" +KEYS_FILTER_5="${KEYS_FILTER_5:-"alt-5"}" +KEYS_FILTER_6="${KEYS_FILTER_6:-"alt-6"}" +KEYS_FILTER_7="${KEYS_FILTER_7:-"alt-7"}" +KEYS_FILTER_8="${KEYS_FILTER_8:-"alt-8"}" +KEYS_FILTER_9="${KEYS_FILTER_9:-"alt-9"}" +KEYS_FILTER_0="${KEYS_FILTER_9:-"alt-0"}" +KEYS_FILTER="$KEYS_FILTER_LOCAL,$KEYS_FILTER_1,$KEYS_FILTER_2,$KEYS_FILTER_3,$KEYS_FILTER_4,$KEYS_FILTER_5,$KEYS_FILTER_6,$KEYS_FILTER_7,$KEYS_FILTER_8,$KEYS_FILTER_9,$KEYS_FILTER_0" + # ... # Specials: @@ -85,11 +110,6 @@ export KEYS_INPUT_SINGLE KEYS_INPUT_SPECIAL KEYS_BROWSE="${KEYS_BROWSE:-"alt-b"}" KEYS_OPEN="${KEYS_OPEN:-"alt-o"}" KEYS_SELECT_ARTIST="${KEYS_SELECT_ARTIST:-"ctrl-a"}" -KEYS_FILTER_LOCAL="${KEYS_FILTER_LOCAL:-"alt-l"}" -KEYS_FILTER_1="${KEYS_FILTER_1:-"alt-1"}" -KEYS_FILTER_2="${KEYS_FILTER_2:-"alt-2"}" -KEYS_FILTER_3="${KEYS_FILTER_3:-"alt-3"}" -KEYS_FILTER_4="${KEYS_FILTER_4:-"alt-4"}" KEYS_PLAY="${KEYS_PLAY:-"enter"}" KEYS_QUEUE="${KEYS_QUEUE:-"ctrl-alt-m"}" KEYS_SHOW_PLAYLIST="${KEYS_SHOW_PLAYLIST:-"ctrl-p"}" diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 8cbaf6b..cab687b 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -132,21 +132,3 @@ FORMAT_STATUS_CANCELLED="${FORMAT_STATUS_CANCELLED:-"❌"}" REC_FORMAT="${REC_FORMAT:-"${CNOTE}${FAINT}<>\t${CNOTE}<>$OFF\t${CTITLE}<>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"}" # Format of a track in the playlist REC_FORMAT_NO_NUMBER="${REC_FORMAT_NO_NUMBER:-"${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"}" - -# Derivatives -# =========== -QUERY_LOCAL=$(printf "%s" "$FORMAT_LOCAL" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_HAS_SECONDARY=$(printf "$FORMAT_TYPE_HAS_SECONDARY" "" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_ALBUM=$(printf "%s" "$FORMAT_TYPE_ALBUM" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_EP=$(printf "%s" "$FORMAT_TYPE_EP" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_SINGLE=$(printf "%s" "$FORMAT_TYPE_SINGLE" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_BROADCAST=$(printf "%s" "$FORMAT_TYPE_BROADCAST" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -QUERY_OTHER=$(printf "%s" "$FORMAT_TYPE_OTHER" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -if printf "$RV_FORMAT" | grep -q "<<status>>"; then - QUERY_RV=$(printf "%s" "$FORMAT_STATUS_OFFICIAL" | sed "s/${ESC}\[[0-9;]*[mK]//g" | sed "s/ /\\\ /g") -else - QUERY_RV="" -fi - -# Necessary exports -export QUERY_LOCAL QUERY_HAS_SECONDARY QUERY_ALBUM QUERY_EP QUERY_SINGLE QUERY_BROADCAST QUERY_OTHER QUERY_RV