Compare commits

...

8 Commits

14 changed files with 524 additions and 422 deletions

View File

@@ -1,117 +0,0 @@
# Simple black-and-white theme
# Pointers
# ========
# Sign that indicates the existence of audio files
FORMAT_LOCAL="|>"
# Pointer to the track currently playing (playlist)
FORMAT_CURRENT="->"
# Input prompt
# =============
# Search prompt
SEARCH_PROMPT="search> "
# Headers
# =======
# Header that displays artist's name
HEADER_ARTIST="%s > "
# Header that displays the release-group name after artist's
HEADER_ARTIST_RELEASEGROUP="%s > %s > "
# Header that in addition to `HEADER_ARTIST_RELEASEGROUP` also shows some
# release information
HEADER_RELEASE="%s > %s > %s"
# The release information is formatted as follows (placeholders implicit):
HEADER_RELEASE_FORMAT="<<tracks>> tx <<media>> | <<label>> <<country>> <<year>>"
# Artist view
# ===========
# Artist string for persons
AV_PERSON="<<name>>"
# Artist string for groups
AV_GROUP="<<name>>"
# Artist disambiguation string
AV_DISAMBIGUATION=" (<<disambiguation>>)"
# Release-group view
# ==================
# Default release group string
RGV_RELEASE="<<title>>"
# Release group string if the artist name differs from the current artist
RGV_RELEASE_W_ARTIST="<<title>> by <<artist>>"
# Year of the release group
RGV_YEAR="[<<year>>]"
# Release-group types
# ===================
# Album
FORMAT_TYPE_ALBUM="[LP]"
# EP
FORMAT_TYPE_EP="[EP]"
# Single
FORMAT_TYPE_SINGLE="[single]"
# Broadcast
FORMAT_TYPE_BROADCAST="[broadcast]"
# Other
FORMAT_TYPE_OTHER="[other]"
# Flag to indicate that the given release group has associated secondary types.
FORMAT_TYPE_HAS_SECONDARY="%s xx"
# Style to represent secondary types (takes one %s placeholder)
FORMAT_TYPE_SECONDARY="(%s)"
# Secondary types
FORMAT_TYPE_SECONDARY_COMPILATION="compilation"
FORMAT_TYPE_SECONDARY_SOUNDTRACK="OST"
FORMAT_TYPE_SECONDARY_SPOKENWORD="spokenword"
FORMAT_TYPE_SECONDARY_INTERVIEW="interview"
FORMAT_TYPE_SECONDARY_AUDIOBOOK="book"
FORMAT_TYPE_SECONDARY_AUDIODRAMA="drama"
FORMAT_TYPE_SECONDARY_LIVE="live"
FORMAT_TYPE_SECONDARY_REMIX="remix"
FORMAT_TYPE_SECONDARY_DJMIX="DJ"
FORMAT_TYPE_SECONDARY_MIXTAPE="mixtape"
FORMAT_TYPE_SECONDARY_DEMO="demo"
FORMAT_TYPE_SECONDARY_FIELDREC="field rec"
# Artist Preview
# ==============
# Main preview format. Takes two %s placeholder. The first is for the artist
# biography. The second for the life span.
APV_FORMAT="\n\n%s\n\n%s"
# Specification of a date
APV_DATE="%s"
# Specification of a place
APV_PLACE="%s"
# Specification of a date and a place (in that order)
APV_DATEPLACE="%s in %s"
# String to represent when/where a person is born
APV_BORN="Born: %s"
# String to represent when/where a person died
APV_DIED="Died: %s"
# Release view
# ============
# Format of a string that represents a release.
RV_FORMAT="<<status>>\t<<tracks>> tracks\t<<media>>\t<<year>>\t<<country>>\t<<label>>"
# Additional string to display the release title and artist name
RV_TITLE_ARTIST="<<artist>> - <<title>>"
# Additional string to display the release title
RV_TITLE="<<title>>"
# Additional string to display the artist
RV_ARTIST="<<artist>>"
# Release Status
# ==============
FORMAT_STATUS_OFFICIAL="official"
FORMAT_STATUS_PROMO="promo"
FORMAT_STATUS_BOOTLEG="bootleg"
FORMAT_STATUS_PSEUDO="psuedo"
FORMAT_STATUS_WITHDRAWN="withdrawn"
FORMAT_STATUS_EXPUNGED="expunged"
FORMAT_STATUS_CANCELLED="cancelled"
# Recording view
# ==============
# Format of a track in a release
REC_FORMAT="<<med>>\t<<nr>>\t<<title>>\t<<artist>>\t<<duration>>"
# Format of a track in the playlist
REC_FORMAT_NO_NUMBER="<<title>>\t<<artist>>\t<<duration>>"

90
share/theme/lite.sh Normal file
View File

@@ -0,0 +1,90 @@
# Colors (internal only)
ESC=$(printf '\033')
CARTIST="${ESC}[38;5;209m"
CYEAR="${ESC}[38;5;179m"
RED="${ESC}[31m"
GREEN="${ESC}[32m"
YELLOW="${ESC}[33m"
OFF="${ESC}[m"
# Pointers
# ========
# Sign that indicates the existence of audio files
FORMAT_LOCAL="${YELLOW}|>${OFF}"
# Input prompt
# =============
# General search prompt (for now only used when choosing one-of-many artist)
SEARCH_PROMPT="search> "
# General workings of format strings
#
# A format string (_FMT) contains placeholders, e.g., <<name>>. These
# placeholders are filled with the relevant information. A placeholder may
# occur zero times, once, or more than once. There are two types of
# placeholders: strings and items. A placeholder of type string comes with a
# variable containing a `printf` expression (_FMT_placeholder). This `printf`
# expression may be used to additionally modify the string passed. If the
# string passed is empty, then each corresponding placeholder is replaced
# with the empty string, i.e., the `printf` expression is bypassed. A
# placeholder of the alternative type (item) comes with a series of variables
# that encode constants to be used (_FMT_placeholder_XYZ).
#
# The items in the format string may be separated with "\t". This will induce
# a proper representation (using `column`). By default, all fields but the
# first are left aligned, and the first field is right aligned. This can be
# changed by setting the appropriate FMT_RIGHTALIGN variable. If that
# variable is empty, then the first field is right aligned. This means that
# at least one field must be right aligned.
#
# Artist view
# ===========
# <<flag>> item Indication for locally available audio files
# <<type>> item Indicator for single-person artist or group
# <<name>> string Artist name
# <<disambiguation>> string Disambiguation string
#
AV_FMT_TYPE_PERSON="${RED}P${OFF}"
AV_FMT_TYPE_GROUP="${RED}G${OFF}"
AV_FMT_NAME="${GREEN}%s${OFF}"
AV_FMT_DISAMBIGUATION="(%s)"
# Release-group view
# ==================
# <<flag>> item Indication for locally available audio files
# <<type>> item Indicates the type
# <<hassecondary>> item Indicates if there is some secondary type or none
# <<secondary>> string List of secondary types
# <<title>> string Title of album
# <<artist>> string Artist of album
# <<year>> string Year of initial release
# Note: The above <<secondary>> is of a joint item-string type. See code for
# details.
RGV_FMT="<<flag>>\t<<year>>\t<<title>>\t<<artist>>"
RGV_FMT_ARTIST="${CARTIST}%s${OFF}"
RGV_FMT_YEAR="${CYEAR}%s${OFF}"
# Release view
# ============
# <<flag>> item Indication for locally available audio files
# <<status>> item Release status
# <<tracks>> string Total number of track
# <<media>> string Media description
# <<year>> string Release year
# <<country>> string Release country
# <<label>> string Release label
# <<title>> string Optional titel string
# <<artist>> string Optional artist string
RV_FMT="<<flag>>\t<<year>>\t<<tracks>>\t<<media>>\t<<country>>\t<<label>>"
# Headers
# =======
# These header strings are based on the respective view and its fields
# defined above.
#
# Header that displays artist's name (based on artist view)
HEADER_ARTIST_FMT="\t<<name>>"
# Header that displays the release-group (based on release-group view)
HEADER_RG_FMT="\t<<artist>> / <<title>>"
# Header that displays the release (based on release view)
HEADER_R_FMT="\t<<artist>> / <<title>> / <<tracks>> tx <<media>>"

186
share/theme/plain.sh Normal file
View File

@@ -0,0 +1,186 @@
# Pointers
# ========
# Sign that indicates the existence of audio files
FORMAT_LOCAL="|>"
# Input prompt
# =============
# General search prompt (for now only used when choosing one-of-many artist)
SEARCH_PROMPT="search> "
# General workings of format strings
#
# A format string (_FMT) contains placeholders, e.g., <<name>>. These
# placeholders are filled with the relevant information. A placeholder may
# occur zero times, once, or more than once. There are two types of
# placeholders: strings and items. A placeholder of type string comes with a
# variable containing a `printf` expression (_FMT_placeholder). This `printf`
# expression may be used to additionally modify the string passed. If the
# string passed is empty, then each corresponding placeholder is replaced
# with the empty string, i.e., the `printf` expression is bypassed. A
# placeholder of the alternative type (item) comes with a series of variables
# that encode constants to be used (_FMT_placeholder_XYZ).
#
# The items in the format string may be separated with "\t". This will induce
# a proper representation (using `column`). By default, all fields but the
# first are left aligned, and the first field is right aligned. This can be
# changed by setting the appropriate FMT_RIGHTALIGN variable. If that
# variable is empty, then the first field is right aligned. This means that
# at least one field must be right aligned.
#
# Artist view
# ===========
# <<flag>> item Indication for locally available audio files
# <<type>> item Indicator for single-person artist or group
# <<name>> string Artist name
# <<disambiguation>> string Disambiguation string
#
AV_FMT_TYPE_PERSON="P"
AV_FMT_TYPE_GROUP="G"
AV_FMT_NAME="%s"
AV_FMT_DISAMBIGUATION="(%s)"
# Release-group view
# ==================
# <<flag>> item Indication for locally available audio files
# <<type>> item Indicates the type
# <<hassecondary>> item Indicates if there is some secondary type or none
# <<secondary>> string List of secondary types
# <<title>> string Title of album
# <<artist>> string Artist of album
# <<year>> string Year of initial release
# Note: The above <<secondary>> is of a joint item-string type. See code for
# details.
RGV_FMT_TYPE_SINGLE="single"
RGV_FMT_TYPE_ALBUM="LP"
RGV_FMT_TYPE_EP="EP"
RGV_FMT_TYPE_BROADCAST="broadcast"
RGV_FMT_TYPE_OTHER="other"
RGV_FMT_HASSECONDARY_YES="xx"
RGV_FMT_SECONDARY="[xx: %s]"
RGV_FMT_SECONDARY_SOUNDTRACK="soundtrack"
RGV_FMT_SECONDARY_SPOKENWORD="spokenword"
RGV_FMT_SECONDARY_INTERVIEW="interview"
RGV_FMT_SECONDARY_AUDIOBOOK="audiobook"
RGV_FMT_SECONDARY_AUDIODRAMA="audio drama"
RGV_FMT_SECONDARY_LIVE="live"
RGV_FMT_SECONDARY_REMIX="remix"
RGV_FMT_SECONDARY_DJMIX="DJ-mix"
RGV_FMT_SECONDARY_MIXTAPE="mixtape"
RGV_FMT_SECONDARY_DEMO="demo"
RGV_FMT_SECONDARY_FIELDREC="field recording"
RGV_FMT_TITLE="%s"
RGV_FMT_ARTIST=" - %s"
RGV_FMT_YEAR="(%s)"
# Release view
# ============
# <<flag>> item Indication for locally available audio files
# <<status>> item Release status
# <<tracks>> string Total number of track
# <<media>> string Media description
# <<year>> string Release year
# <<country>> string Release country
# <<label>> string Release label
# <<title>> string Optional titel string
# <<artist>> string Optional artist string
RV_FMT="${RV_FMT:-"<<flag>>\t<<status>> >> \t<<tracks>>\t<<media>>\t<<year>>\t<<country>>\t<<label>>\t<<title>> <<artist>>"}"
RV_FMT_STATUS_OFFICIAL="official"
RV_FMT_STATUS_PROMO="promo"
RV_FMT_STATUS_BOOTLEG="bootleg"
RV_FMT_STATUS_PSEUDO="pseudo"
RV_FMT_STATUS_WITHDRAWN="withdrawn"
RV_FMT_STATUS_EXPUNGED="expunged"
RV_FMT_STATUS_CANCELLED="cancelled"
RV_FMT_TRACKS="%s tracks"
RV_FMT_MEDIA="%s"
RV_FMT_YEAR="%s"
RV_FMT_COUNTRY="%s"
RV_FMT_LABEL="%s"
RV_FMT_TITLE="as %s"
RV_FMT_ARTIST="by %s"
# Recording view
# ==============
# <<flag>> item Indication for locally available audio files
# <<media>> string Media identifier
# <<nr>> string Track number within media
# <<title>> string Track title
# <<artist>> string Track artist
# <<duration>> string Track duration
REC_FMT_MEDIA="%s"
REC_FMT_NR="%s"
REC_FMT_TITLE="%s"
REC_FMT_ARTIST="%s"
REC_FMT_DURATION="%s"
# Recording view (playlist)
# =========================
# <<playing>> item Mark for currently playing track
# <<title>> string Track title
# <<artist>> string Track artist
# <<duration>> string Track duration
PLYLST_FMT_PLAYING_YES="-->"
PLYLST_FMT_TITLE="%s"
PLYLST_FMT_ARTIST="%s"
PLYLST_FMT_DURATION="%s"
# Headers
# =======
# These header strings are based on the respective view and its fields
# defined above.
#
# Header that displays artist's name (based on artist view)
HEADER_ARTIST_FMT=":::\t<<name>> >"
# Header that displays the release-group (based on release-group view)
HEADER_RG_FMT=":::\t<<artist>> >> <<title>> >"
HEADER_RG_FMT_ARTIST="%s"
# Header that displays the release (based on release view)
#HEADER_RELEASE="${HEADER_RELEASE:-" ${CARTIST}%s$OFF 》${CTITLE}%s$OFF 〉%s"}"
#HEADER_RELEASE_FORMAT="${HEADER_RELEASE_FORMAT:-"${CRELINFO}<<tracks>> tx <<media>> $OFF|$CRELINFO <<label>> <<country>> <<year>>$OFF"}"
HEADER_R_FMT=":::\t<<artist>> >> <<title>> > <<tracks>> tx <<media>> | <<label>> <<country>> <<year>>"
HEADER_R_FMT_TRACKS="%s"
HEADER_R_FMT_MEDIA="%s"
HEADER_R_FMT_YEAR="%s"
HEADER_R_FMT_COUNTRY="%s"
HEADER_R_FMT_LABEL="%s"
HEADER_R_FMT_TITLE="%s"
HEADER_R_FMT_ARTIST="%s"
# Artist Preview
# ==============
# Lines that contain the pattern defined in PREVIEW_NO_WRAP (see
# `src/sh/preview.sh`) will not be wrapped.
#
# We distinguish between single-person and group artists.
#
# <<name>> | string | Artist name
# <<sortname>> | string | Artist sort name
# <<bio>> | string | Artist biography
# <<disambiguation>> | string | Artist disambiguation string
# <<alias>> | higher-order placeholder | Placeholder for aliases
# <<start> | higher-order placeholder | Placeholder for start string
# <<end>> | higher-order placeholder | Placeholder for end string
# <<url>> | higher-order placeholder | Placeholder for links
PREVIEW_ARTIST_PERSON_BIO="%s\n\n"
PREVIEW_ARTIST_PERSON_ALIAS="Also known as %s\n\n"
PREVIEW_ARTIST_PERSON_START="Born: %s\n"
PREVIEW_ARTIST_PERSON_END="Died: %s\n"
PREVIEW_ARTIST_PERSON_URL="\nLinks:\n%s\n"
PREVIEW_ARTIST_PERSON_URL_URLINDEX="%3d"
PREVIEW_ARTIST_PERSON_URL_URLNAME="%s"
PREVIEW_ARTIST_PERSON_URL_URLLINK="%s"
PREVIEW_ARTIST_GROUP_START="Founded: %s\n"
PREVIEW_ARTIST_GROUP_END="Dissolved: %s\n"
# Keybinding themes
# =================
# Format keybinding group
KBF_GROUP="%s"
# Format key
KBF_KEY="%s"
# Format description
KBF_DESC="%s"

View File

@@ -1,118 +0,0 @@
# Simple theme without emojis
# Colors (internal only)
ESC=$(printf '\033')
RED="${ESC}[31m"
GREEN="${ESC}[32m"
YELLOW="${ESC}[33m"
BLUE="${ESC}[34m"
PURPLE="${ESC}[35m"
CYAN="${ESC}[36m"
WHITE="${ESC}[37m"
OFF="${ESC}[m"
# Pointers
# ========
# Sign that indicates the existence of audio files
FORMAT_LOCAL="${BLUE}|>$OFF"
# Pointer to the track currently playing (playlist)
FORMAT_CURRENT="${WHITE}-->$OFF"
# Input prompt
# =============
# Search prompt
SEARCH_PROMPT="search: "
# Headers
# =======
# Header that displays artist's name
HEADER_ARTIST="artist: %s"
# Header that displays the release-group name after artist's
HEADER_ARTIST_RELEASEGROUP="artist: %s / album: %s"
# Header that in addition to `HEADER_ARTIST_RELEASEGROUP` also shows some
# release information
HEADER_RELEASE="artist: %s / album: %s (%s)"
# The release information is formatted as follows (placeholders implicit):
HEADER_RELEASE_FORMAT="<<label>> <<year>>"
# Artist view
# ===========
# Artist string for persons
AV_PERSON="(P) ${CYAN}<<name>>$OFF"
# Artist string for groups
AV_GROUP="(G) ${CYAN}<<name>>$OFF"
# Artist disambiguation string
AV_DISAMBIGUATION="// <<disambiguation>>"
# Release-group view
# ==================
# Default release group string
RGV_RELEASE="${PURPLE}<<title>>$OFF"
# Release group string if the artist name differs from the current artist
RGV_RELEASE_W_ARTIST="${PURPLE}<<title>>$OFF by ${CYAN}<<artist>>$OFF"
# Year of the release group
RGV_YEAR="[<<year>>]"
# Release-group types
# ===================
# Album
FORMAT_TYPE_ALBUM="${YELLOW}LP$OFF"
# EP
FORMAT_TYPE_EP="${YELLOW}EP$OFF"
# Single
FORMAT_TYPE_SINGLE="${YELLOW}Single$OFF"
# Broadcast
FORMAT_TYPE_BROADCAST="${YELLOW}Broadcast$OFF"
# Other
FORMAT_TYPE_OTHER=""
# Flag to indicate that the given release group has associated secondary types.
FORMAT_TYPE_HAS_SECONDARY="%s ${RED}xx${OFF}"
# Style to represent secondary types (takes one %s placeholder)
FORMAT_TYPE_SECONDARY="${RED}(${OFF}%s${RED})${OFF}"
# Secondary types
FORMAT_TYPE_SECONDARY_COMPILATION="${YELLOW}compilation$OFF"
FORMAT_TYPE_SECONDARY_SOUNDTRACK="${YELLOW}soundtrack$OFF"
FORMAT_TYPE_SECONDARY_SPOKENWORD="${YELLOW}spokenword$OFF"
FORMAT_TYPE_SECONDARY_INTERVIEW="${YELLOW}interview$OFF"
FORMAT_TYPE_SECONDARY_AUDIOBOOK="${YELLOW}audiobook$OFF"
FORMAT_TYPE_SECONDARY_AUDIODRAMA="${YELLOW}audio drama$OFF"
FORMAT_TYPE_SECONDARY_LIVE="${YELLOW}live$OFF"
FORMAT_TYPE_SECONDARY_REMIX="${YELLOW}remix$OFF"
FORMAT_TYPE_SECONDARY_DJMIX="${YELLOW}DJ-mix$OFF"
FORMAT_TYPE_SECONDARY_MIXTAPE="${YELLOW}mixtape$OFF"
FORMAT_TYPE_SECONDARY_DEMO="${YELLOW}demo$OFF"
FORMAT_TYPE_SECONDARY_FIELDREC="${YELLOW}field recording$OFF"
# Artist Preview
# ==============
# Main preview format. Takes two %s placeholder. The first is for the artist
# biography. The second for the life span.
APV_FORMAT="\n\nBio:\n%s\n\n${WHITE}%s${OFF}"
# Specification of a date
APV_DATE="%s"
# Specification of a place
APV_PLACE="%s"
# Specification of a date and a place (in that order)
APV_DATEPLACE="%s in %s"
# String to represent when/where a person is born
APV_BORN="Born: %s"
# String to represent when/where a person died
APV_DIED="Died: %s"
# Release view
# ============
# Format of a string that represents a release.
RV_FORMAT="<<media>> (<<tracks>>, yr: <<year>>)\t<<label>>"
# Additional string to display the release title and artist name
RV_TITLE_ARTIST="${CYAN}<<artist>>$OFF - ${PURPLE}<<title>>$OFF"
# Additional string to display the release title
RV_TITLE="${PURPLE}<<title>>$OFF"
# Additional string to display the artist
RV_ARTIST="${CYAN}<<artist>>$OFF"
# Recording view
# ==============
# Format of a track in a release
REC_FORMAT="<<med>>\t${RED}<<nr>>$OFF\t${GREEN}<<title>>$OFF\t${CYAN}<<artist>>$OFF\t${WHITE}<<duration>>$OFF"
# Format of a track in the playlist
REC_FORMAT_NO_NUMBER="${GREEN}<<title>>$OFF\t${CYAN}<<artist>>$OFF\t${WHITE}<<duration>>$OFF"

View File

@@ -85,6 +85,7 @@ BEGIN {
gsub("<<urllink>>", urllink, urlentry)
url = i == 1 ? urlentry : sprintf(join_url, url, urlentry)
}
url = sprintf(fmturl, escape(url))
}
# Combine all and print
gsub("<<name>>", name, format)

View File

@@ -213,7 +213,7 @@ case "${1:-}" in
cnt=$(echo "$j" | $JQ 'length')
[ "$cnt" -eq 1 ] && aid="$(echo "$j" | $JQ '.[0].artist.id')"
fi
[ "${aid:-}" ] && $0 --action-draw "$mode" "$VIEW_ARTIST" "$aid" || printf "print(%s)+print(%s)+print(%s)+print(%s)+accept" "$VIEW_SELECT_ARTIST" "$j" "$view" "$mbid_cur"
[ "${aid:-}" ] && $0 --action-draw "$mode" "$VIEW_ARTIST" "0" "$aid" || printf "print(%s)+print(%s)+print(%s)+print(%s)+accept" "$VIEW_SELECT_ARTIST" "$j" "$view" "$mbid_cur"
exit 0
;;
"--action-draw")
@@ -221,8 +221,8 @@ case "${1:-}" in
#
# @argument $2: mode (default `normal`)
# @argument $3: view (default list artists)
# @argument $4: MusicBrainz ID (optional)
# @argument $5: level (optional)
# @argument $4: level
# @argument $5: MusicBrainz ID (optional)
#
# The argument `level` specifies the view relative to `view`: If `level` is
# set to +1, then the specified MusicBrainz ID is an ID of an object one level
@@ -256,8 +256,8 @@ case "${1:-}" in
# - VIEW_RELEASE: Divert view to VIEW_LIST_RELEASEGROUP.
mode="${2:-"$MODE_NORMAL"}"
view="${3:-"$VIEW_LIST_ARTISTS"}"
mbid="${4:-}"
level="${5:-}"
level="${4:-}"
mbid="${5:-}"
# Change state, if we are being diverted.
case "$level" in
"-1")
@@ -291,6 +291,7 @@ case "${1:-}" in
printf "show-input+change-query(%s)" "$q"
# Store current state
printf "+change-list-label(%s)" "$view"
printf "+change-border-label(%s)" "$mbid"
# Set header
fzf_command_set_header "$view" "$mbid"
# Set preview window
@@ -508,6 +509,9 @@ local_files_present || load_missing_files
precompute_views
# Generate filenames for temporary files
# We keep these files in a temporary directory and not in the state directory
# because this allows for straight-forward capability to run multiple instances
# simultaneously.
tmpdir=$(mktemp -d)
LOCKFILE="$tmpdir/lock"
RESULTS="$tmpdir/results"
@@ -538,9 +542,11 @@ IN_VIEW_PATTERN="[ \$FZF_LIST_LABEL = %s ]"
IN_LIST_ARTISTS_VIEW="$(printf "$IN_VIEW_PATTERN" "$VIEW_LIST_ARTISTS")"
FZF_CURRENT_MODE="\$FZF_INPUT_STATE"
FZF_CURRENT_VIEW="\$FZF_LIST_LABEL"
FZF_CURRENT_MBID="\$FZF_BORDER_LABEL"
FZF_RELOAD_PLAYLIST="reload-sync($0 --lines $VIEW_PLAYLIST)"
FZF_POS_PLAYLIST="transform:$0 --action-playlistcursor"
PUT_FZF_KEY_LOGIC="case \$FZF_KEY in space) echo \"put( )\";; left) echo backward-char;; right) echo forward-char;; backspace|bspace|bs) echo backward-delete-char;; delete|del) echo delete-char;; *) echo \"put(\$FZF_KEY)\";; esac"
FZF_DEFAULT_PREVIEW_WINDOW="right,$PREVIEW_WINDOW_PERCENTAGE%,border-line,nowrap,<50(hidden)"
while true; do
case "$VIEW" in
"$VIEW_SELECT_ARTIST")
@@ -561,13 +567,16 @@ while true; do
--bind="$KEYS_KEYBINDINGS:preview:$0 --show-keybindings $VIEW_SELECT_ARTIST" \
--bind="$KEYS_SCROLL_PREVIEW_DOWN:preview-down" \
--bind="$KEYS_SCROLL_PREVIEW_UP:preview-up" \
--bind="$KEYS_PREVIEW_TOGGLE_WRAP:toggle-preview-wrap" \
--bind="$KEYS_PREVIEW_TOGGLE_SIZE:change-preview-window(right,90%,border-line,nowrap|$FZF_DEFAULT_PREVIEW_WINDOW)" \
--bind="$KEYS_PREVIEW_OPEN:show-preview" \
--bind="$KEYS_PREVIEW_CLOSE:hide-preview" \
--bind="$KEYS_FILTER_LOCAL:change-query($QUERY_LOCAL )" \
-0 -1 \
--border="bold" \
--border-label="Select artist" \
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
--preview-window="$FZF_DEFAULT_PREVIEW_WINDOW" \
--wrap-sign="" \
--preview="$0 --preview $VIEW_SELECT_ARTIST {4}" \
--delimiter="\t" \
--prompt="$SEARCH_PROMPT" \
@@ -659,7 +668,7 @@ while true; do
--info="inline-right" \
--header-first \
--header-border="bottom" \
--bind="start:transform:$0 --action-draw $MODE $VIEW $MBID" \
--bind="start:transform:$0 --action-draw $MODE $VIEW "0" $MBID" \
--bind="$KEYS_I_NORMAL:transform:$IN_NORMAL_MODE || echo hide-input" \
--bind="$KEYS_N_INSERT:transform:$IN_NORMAL_MODE && echo show-input || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_DOWN:down" \
@@ -670,26 +679,26 @@ while true; do
--bind="$KEYS_N_UP:transform:$IN_NORMAL_MODE && echo up || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_N_BOT:transform:$IN_NORMAL_MODE && echo last || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_N_TOP:transform:$IN_NORMAL_MODE && echo first || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_IN:transform:[ {4} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {4} \"+1\"" \
--bind="$KEYS_OUT:transform:[ {3} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {3} \"-1\"" \
--bind="$KEYS_N_IN:transform:$IN_NORMAL_MODE && ([ {4} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {4} \"+1\") || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_N_OUT:transform:$IN_NORMAL_MODE && ([ {3} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {3} \"-1\") || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_SELECT_ARTIST:transform:$0 --action-gotoartist $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {3} {4}" \
--bind="$KEYS_LIST_ARTISTS:transform:$0 --action-draw \$FZF_INPUT_STATE $VIEW_LIST_ARTISTS" \
--bind="$KEYS_LIST_ALBUMS:transform:$0 --action-draw \$FZF_INPUT_STATE $VIEW_LIST_ALBUMS" \
--bind="$KEYS_SEARCH_ARTIST:transform:$0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST" \
--bind="$KEYS_SEARCH_ALBUM:transform:$0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM" \
--bind="$KEYS_IN:transform:[ {4} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW \"+1\" {4}" \
--bind="$KEYS_OUT:transform:$0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW \"-1\" $FZF_CURRENT_MBID" \
--bind="$KEYS_N_IN:transform:$IN_NORMAL_MODE && ([ {4} ] && $0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW \"+1\" {4}) || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_N_OUT:transform:$IN_NORMAL_MODE && ($0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW \"-1\" $FZF_CURRENT_MBID) || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_SELECT_ARTIST:transform:$0 --action-gotoartist $FZF_CURRENT_MODE $FZF_CURRENT_VIEW $FZF_CURRENT_MBID {4}" \
--bind="$KEYS_LIST_ARTISTS:transform:$0 --action-draw \$FZF_INPUT_STATE $VIEW_LIST_ARTISTS \"0\"" \
--bind="$KEYS_LIST_ALBUMS:transform:$0 --action-draw \$FZF_INPUT_STATE $VIEW_LIST_ALBUMS \"0\"" \
--bind="$KEYS_SEARCH_ARTIST:transform:$0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST \"0\"" \
--bind="$KEYS_SEARCH_ALBUM:transform:$0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM \"0\"" \
--bind="$KEYS_SWITCH_ARTIST_ALBUM:transform:case $FZF_CURRENT_VIEW in
$VIEW_LIST_ARTISTS) $0 --action-draw $FZF_CURRENT_MODE $VIEW_LIST_ALBUMS ;;
$VIEW_LIST_ALBUMS) $0 --action-draw $FZF_CURRENT_MODE $VIEW_LIST_ARTISTS ;;
$VIEW_SEARCH_ARTIST) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM ;;
$VIEW_SEARCH_ALBUM) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST ;;
$VIEW_LIST_ARTISTS) $0 --action-draw $FZF_CURRENT_MODE $VIEW_LIST_ALBUMS \"0\" ;;
$VIEW_LIST_ALBUMS) $0 --action-draw $FZF_CURRENT_MODE $VIEW_LIST_ARTISTS \"0\";;
$VIEW_SEARCH_ARTIST) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM \"0\" ;;
$VIEW_SEARCH_ALBUM) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST \"0\" ;;
esac" \
--bind="$KEYS_SWITCH_LOCAL_REMOTE:transform:case $FZF_CURRENT_VIEW in
$VIEW_LIST_ARTISTS) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST ;;
$VIEW_LIST_ALBUMS) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM ;;
$VIEW_SEARCH_ARTIST) $0 --action-draw $MODE_NORMAL $VIEW_LIST_ARTISTS ;;
$VIEW_SEARCH_ALBUM) $0 --action-draw $MODE_NORMAL $VIEW_LIST_ALBUMS ;;
$VIEW_LIST_ARTISTS) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ARTIST \"0\" ;;
$VIEW_LIST_ALBUMS) $0 --action-draw $MODE_INSERT $VIEW_SEARCH_ALBUM \"0\" ;;
$VIEW_SEARCH_ARTIST) $0 --action-draw $MODE_NORMAL $VIEW_LIST_ARTISTS \"0\" ;;
$VIEW_SEARCH_ALBUM) $0 --action-draw $MODE_NORMAL $VIEW_LIST_ALBUMS \"0\" ;;
esac" \
--bind="$KEYS_FILTER:transform:$0 --action-filter $FZF_CURRENT_MODE $FZF_CURRENT_VIEW" \
--bind="$KEYS_BROWSE:execute-silent:
@@ -705,20 +714,23 @@ open \"https://musicbrainz.org/\$t/{r4}\"" \
[ {5} ] || exit 0
open \"\$(dirname {5})\"" \
--bind="$KEYS_N_YANK:transform:$IN_NORMAL_MODE && echo \"execute-silent(printf {4} | $CLIP)\" || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_YANK_CURRENT:execute-silent:printf {3} | $CLIP" \
--bind="$KEYS_SHOW_PLAYLIST:transform:echo \"print($VIEW_PLAYLIST)+print()+print($FZF_CURRENT_VIEW)+print({3})+accept\"" \
--bind="$KEYS_YANK_CURRENT:execute-silent:printf $FZF_CURRENT_MBID | $CLIP" \
--bind="$KEYS_SHOW_PLAYLIST:transform:echo \"print($VIEW_PLAYLIST)+print()+print($FZF_CURRENT_VIEW)+print($FZF_CURRENT_MBID)+accept\"" \
--bind="$KEYS_KEYBINDINGS:preview:$0 --show-keybindings $FZF_CURRENT_VIEW" \
--bind="$KEYS_REFRESH:execute-silent($0 --remove-from-cache $FZF_CURRENT_VIEW {3} {4})+transform:$0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW {3}" \
--bind="$KEYS_REFRESH:execute-silent($0 --remove-from-cache $FZF_CURRENT_VIEW $FZF_CURRENT_MBID {4})+transform:$0 --action-draw $FZF_CURRENT_MODE $FZF_CURRENT_VIEW \"0\" $FZF_CURRENT_MBID" \
--bind="$KEYS_QUIT:print($VIEW_QUIT)+accept" \
--bind="$KEYS_N_QUIT:transform:$IN_NORMAL_MODE && ($IN_LIST_ARTISTS_VIEW && echo \"print($VIEW_QUIT)+accept\" || $0 --action-draw $MODE_NORMAL $VIEW_LIST_ARTISTS) || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_N_QUIT:transform:$IN_NORMAL_MODE && ($IN_LIST_ARTISTS_VIEW && echo \"print($VIEW_QUIT)+accept\" || $0 --action-draw $MODE_NORMAL $VIEW_LIST_ARTISTS \"0\") || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_SCROLL_PREVIEW_DOWN:preview-down" \
--bind="$KEYS_SCROLL_PREVIEW_UP:preview-up" \
--bind="$KEYS_PREVIEW_TOGGLE_WRAP:toggle-preview-wrap" \
--bind="$KEYS_PREVIEW_TOGGLE_SIZE:change-preview-window(right,90%,border-line,nowrap|$FZF_DEFAULT_PREVIEW_WINDOW)" \
--bind="$KEYS_PREVIEW_OPEN:show-preview" \
--bind="$KEYS_PREVIEW_CLOSE:hide-preview" \
--bind="$KEYS_PLAYBACK:transform:$0 --playback $FZF_CURRENT_VIEW {3} {4} {5}" \
--bind="$KEYS_N_PLAYBACK:transform:$IN_NORMAL_MODE && $0 --playback $FZF_CURRENT_VIEW {3} {4} {5} || $PUT_FZF_KEY_LOGIC" \
--bind="$KEYS_PLAYBACK:transform:$0 --playback $FZF_CURRENT_VIEW $FZF_CURRENT_MBID {4} {5}" \
--bind="$KEYS_N_PLAYBACK:transform:$IN_NORMAL_MODE && $0 --playback $FZF_CURRENT_VIEW $FZF_CURRENT_MBID {4} {5} || $PUT_FZF_KEY_LOGIC" \
--bind="change:execute-silent($0 --mbsearch $FZF_CURRENT_VIEW &)+reload:$0 --lines $FZF_CURRENT_VIEW" \
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
--preview-window="$FZF_DEFAULT_PREVIEW_WINDOW" \
--wrap-sign="" \
--preview="$0 --preview $FZF_CURRENT_VIEW {4}" \
--delimiter="\t" \
--with-nth="{1}" || true

View File

@@ -16,7 +16,7 @@
if [ ! "${CACHE_LOADED:-}" ]; then
# Base path for cache
CACHEDIR="$HOME/.cache/$APP_NAME"
CACHEDIR="${XGD_CACHE_HOME:-"$HOME/.cache"}/$APP_NAME"
# Directory names for cache types
TYPE_ARTIST="artist"
TYPE_RELEASEGROUP="releasegroup"

View File

@@ -4,7 +4,7 @@
# the file may be overwritten by specifying the environment variable
# `CONFIGFILE`. If a configuration file is specified, then it must also exist.
# A configuration file comprises the specification of environment variables
# that are` allowed to be set.
# that are allowed to be set.
#
# Currently, the following files hold variables that are configurable:
# - `src/sh/filter.sh`: Configuration of filters that can be triggered with
@@ -12,7 +12,7 @@
# - `src/sh/keys.sh`: Configuration of key bindings to certain actions
# - `src/sh/theme.sh`: Configuration of theme
# - `src/sh/sort.sh`: List sorting
CONFIGFILE_DEFAULT="$HOME/.config/$APP_NAME/config"
CONFIGFILE_DEFAULT="${XDG_CONFIG_HOME:-"$HOME/.config"}/$APP_NAME/config"
CONFIGFILE="${CONFIGFILE:-"$CONFIGFILE_DEFAULT"}"
[ "$CONFIGFILE" != "$CONFIGFILE_DEFAULT" ] && [ ! -f "$CONFIGFILE" ] && err "The configuration file manually specified with the environment variable CONFIGFILE=($CONFIGFILE) does not exist." && exit 1
# shellcheck source=/dev/null

View File

@@ -1,87 +1,91 @@
# Preset filters for different views. These filters are associated to key
# bindings (see `src/sh/keys.sh`), and are configurable through a configuration
# file (see `src/sh/config.sh`).
if [ ! "${FILTER_LOADED:-}" ]; then
# The `QUERY_LOCAL` filter is associated with the keys `KEYS_FILTER_LOCAL`.
# It is used to hide all entries that are not available locally (see
# `src/sh/query.sh` for details and the relevant methods)
QUERY_LOCAL="${QUERY_LOCAL:-"$(printf "'%s'" "$FORMAT_LOCAL" | __clean_filter)"}"
# The `QUERY_LOCAL` filter is associated with the keys `KEYS_FILTER_LOCAL`. It
# is used to hide all entries that are not available locally (see
# `src/sh/query.sh` for details and the relevant methods)
QUERY_LOCAL="${QUERY_LOCAL:-"$(printf "'%s'" "$FORMAT_LOCAL" | __clean_filter)"}"
# The following variables store preset strings derived from the theme (see
# `src/sh/theme.sh`), and used in the assignment of the default filters.
q_has_seconary="$(printf "%s" "$RGV_FMT_HASSECONDARY_YES" | __clean_filter)"
q_album="$(printf "%s" "$RGV_FMT_TYPE_ALBUM" | __clean_filter)"
q_ep="$(printf "%s" "$RGV_FMT_TYPE_EP" | __clean_filter)"
q_single="$(printf "%s" "$RGV_FMT_TYPE_SINGLE" | __clean_filter)"
if printf "$RV_FMT" | grep -q "<<status>>"; then
q_official="$(printf "'%s'" "$RV_FMT_STATUS_OFFICIAL" | __clean_filter)"
fi
export QUERY_LOCAL
# The following variables store preset strings derived from the theme (see
# `src/sh/theme.sh`), and used in the assignment of the default filters.
q_has_seconary="$(printf "%s" "$RGV_FMT_HASSECONDARY_YES" | __clean_filter)"
q_album="$(printf "%s" "$RGV_FMT_TYPE_ALBUM" | __clean_filter)"
q_ep="$(printf "%s" "$RGV_FMT_TYPE_EP" | __clean_filter)"
q_single="$(printf "%s" "$RGV_FMT_TYPE_SINGLE" | __clean_filter)"
if printf "$RV_FMT" | grep -q "<<status>>"; then
q_official="$(printf "'%s'" "$RV_FMT_STATUS_OFFICIAL" | __clean_filter)"
# Here starts the list of all filters (grouped per view) that are associated
# to the keys `KEYS_FILTER_0` - `KEYS_FILTER_9`. The filters in the
# `F_1_<view>` variable are automatically applied whenever the given view is
# entered.
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:-}"
export F_1_VIEW_ARTIST F_2_VIEW_ARTIST F_3_VIEW_ARTIST F_4_VIEW_ARTIST \
F_5_VIEW_ARTIST F_6_VIEW_ARTIST F_7_VIEW_ARTIST F_8_VIEW_ARTIST \
F_9_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:-}"
export F_1_VIEW_RELEASEGROUP F_2_VIEW_RELEASEGROUP F_3_VIEW_RELEASEGROUP \
F_4_VIEW_RELEASEGROUP F_5_VIEW_RELEASEGROUP F_6_VIEW_RELEASEGROUP \
F_7_VIEW_RELEASEGROUP F_8_VIEW_RELEASEGROUP F_9_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:-}"
export F_1_VIEW_RELEASE F_2_VIEW_RELEASE F_3_VIEW_RELEASE F_4_VIEW_RELEASE \
F_5_VIEW_RELEASE F_6_VIEW_RELEASE F_7_VIEW_RELEASE F_8_VIEW_RELEASE \
F_9_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:-}"
export F_1_LIST_ARTISTS F_2_LIST_ARTISTS F_3_LIST_ARTISTS F_4_LIST_ARTISTS \
F_5_LIST_ARTISTS F_6_LIST_ARTISTS F_7_LIST_ARTISTS F_8_LIST_ARTISTS \
F_9_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:-}"
export F_1_LIST_ALBUMS F_2_LIST_ALBUMS F_3_LIST_ALBUMS F_4_LIST_ALBUMS \
F_5_LIST_ALBUMS F_6_LIST_ALBUMS F_7_LIST_ALBUMS F_8_LIST_ALBUMS \
F_9_LIST_ALBUMS
export FILTER_LOADED=1
fi
export QUERY_LOCAL
# Here starts the list of all filters (grouped per view) that are associated to
# the keys `KEYS_FILTER_0` - `KEYS_FILTER_9`. The filters in the `F_1_<view>`
# variable are automatically applied whenever the given view is entered.
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:-}"
export F_1_VIEW_ARTIST F_2_VIEW_ARTIST F_3_VIEW_ARTIST F_4_VIEW_ARTIST \
F_5_VIEW_ARTIST F_6_VIEW_ARTIST F_7_VIEW_ARTIST F_8_VIEW_ARTIST \
F_9_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:-}"
export F_1_VIEW_RELEASEGROUP F_2_VIEW_RELEASEGROUP F_3_VIEW_RELEASEGROUP \
F_4_VIEW_RELEASEGROUP F_5_VIEW_RELEASEGROUP F_6_VIEW_RELEASEGROUP \
F_7_VIEW_RELEASEGROUP F_8_VIEW_RELEASEGROUP F_9_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:-}"
export F_1_VIEW_RELEASE F_2_VIEW_RELEASE F_3_VIEW_RELEASE F_4_VIEW_RELEASE \
F_5_VIEW_RELEASE F_6_VIEW_RELEASE F_7_VIEW_RELEASE F_8_VIEW_RELEASE \
F_9_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:-}"
export F_1_LIST_ARTISTS F_2_LIST_ARTISTS F_3_LIST_ARTISTS F_4_LIST_ARTISTS \
F_5_LIST_ARTISTS F_6_LIST_ARTISTS F_7_LIST_ARTISTS F_8_LIST_ARTISTS \
F_9_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:-}"
export F_1_LIST_ALBUMS F_2_LIST_ALBUMS F_3_LIST_ALBUMS F_4_LIST_ALBUMS \
F_5_LIST_ALBUMS F_6_LIST_ALBUMS F_7_LIST_ALBUMS F_8_LIST_ALBUMS \
F_9_LIST_ALBUMS

View File

@@ -59,6 +59,8 @@
# - KEYS_SCROLL_PREVIEW_UP: Scroll preview up
# - KEYS_PREVIEW_OPEN: Open preview window
# - KEYS_PREVIEW_CLOSE: Close preview window
# - KEYS_PREVIEW_TOGGLE_WRAP: Toggle line wrapping in preview window
# - KEYS_PREVIEW_TOGGLE_SIZE: Toggle size (small, large) of preview window
# - KEYS_REFRESH: Refresh current entry
#
# Playback:
@@ -101,7 +103,7 @@ if [ ! "${KEYS_LOADED:-}" ]; then
KEYS_N_DOWN="${KEYS_N_DOWN:-"j"}"
KEYS_N_UP="${KEYS_N_UP:-"k"}"
KEYS_N_BOT="${KEYS_N_BOT:-"G"}"
KEYS_N_TOP="${KEYS_N_TOP:-"1"}"
KEYS_N_TOP="${KEYS_N_TOP:-"g"}"
export KEYS_DOWN KEYS_UP KEYS_HALFPAGE_DOWN KEYS_HALFPAGE_UP KEYS_N_DOWN \
KEYS_N_UP KEYS_N_BOT KEYS_N_TOP
@@ -151,10 +153,14 @@ if [ ! "${KEYS_LOADED:-}" ]; then
KEYS_SCROLL_PREVIEW_UP="${KEYS_SCROLL_PREVIEW_UP:-"page-up"}"
KEYS_PREVIEW_OPEN="${KEYS_PREVIEW_OPEN:-"alt-up"}"
KEYS_PREVIEW_CLOSE="${KEYS_PREVIEW_CLOSE:-"alt-down"}"
KEYS_PREVIEW_TOGGLE_WRAP="${KEYS_PREVIEW_TOGGLE_WRAP:-"alt-w"}"
KEYS_PREVIEW_TOGGLE_SIZE="${KEYS_PREVIEW_TOGGLE_SIZE:-"alt-/"}"
KEYS_REFRESH="${KEYS_REFRESH:-"ctrl-r"}"
export KEYS_BROWSE KEYS_OPEN KEYS_N_YANK KEYS_YANK_CURRENT KEYS_SHOW_PLAYLIST \
KEYS_KEYBINDINGS KEYS_QUIT KEYS_N_QUIT KEYS_SCROLL_PREVIEW_DOWN \
KEYS_SCROLL_PREVIEW_UP KEYS_PREVIEW_CLOSE KEYS_PREVIEW_OPEN KEYS_REFRESH
export KEYS_BROWSE KEYS_OPEN KEYS_N_YANK KEYS_YANK_CURRENT \
KEYS_SHOW_PLAYLIST KEYS_KEYBINDINGS KEYS_QUIT KEYS_N_QUIT \
KEYS_SCROLL_PREVIEW_DOWN KEYS_SCROLL_PREVIEW_UP KEYS_PREVIEW_CLOSE \
KEYS_PREVIEW_OPEN KEYS_PREVIEW_TOGGLE_WRAP KEYS_PREVIEW_TOGGLE_SIZE \
KEYS_REFRESH
# Playback:
KEYS_PLAY="${KEYS_PLAY:-"enter"}"
@@ -239,6 +245,8 @@ print_keybindings() {
"$KEYS_SCROLL_PREVIEW_DOWN" "Scroll preview down" \
"$KEYS_SCROLL_PREVIEW_UP" "Scroll preview up" \
"$KEYS_KEYBINDINGS" "Show these keybindings" \
"$KEYS_PREVIEW_TOGGLE_WRAP" "Toggle preview wrapping" \
"$KEYS_PREVIEW_TOGGLE_SIZE" "Toggle preview size" \
"$KEYS_PREVIEW_OPEN" "Open preview window" \
"$KEYS_PREVIEW_CLOSE" "Close preview window"
__keybindinggroup_from_args "Navigation" \
@@ -313,6 +321,8 @@ print_keybindings() {
"$KEYS_SCROLL_PREVIEW_DOWN" "Scroll preview down" \
"$KEYS_SCROLL_PREVIEW_UP" "Scroll preview up" \
"$KEYS_KEYBINDINGS" "Show these keybindings" \
"$KEYS_PREVIEW_TOGGLE_WRAP" "Toggle preview wrapping" \
"$KEYS_PREVIEW_TOGGLE_SIZE" "Toggle preview size" \
"$KEYS_PREVIEW_OPEN" "Open preview window" \
"$KEYS_PREVIEW_CLOSE" "Close preview window"
__keybindinggroup_from_args "Navigation" \

View File

@@ -4,7 +4,7 @@
# will also use the methods here, and modifications thereof, to support
# MusicBainz collections.
if [ ! "${LOCAL_LOADED:-}" ]; then
LOCALDATADIR="$HOME/.cache/$APP_NAME/local"
LOCALDATADIR="${XDG_DATA_HOME:-"$HOME/.local/share"}/$APP_NAME"
LOCALDATA_ARTISTS="$LOCALDATADIR/artists"
LOCALDATA_RELEASEGROUPS="$LOCALDATADIR/releasegroups"
LOCALDATA_RELEASES="$LOCALDATADIR/releases"
@@ -16,6 +16,15 @@ if [ ! "${LOCAL_LOADED:-}" ]; then
LOCALDATA_RELEASES_LIST="$LOCALDATADIR/releases_list"
DECORATION_FILENAME=${DECORATION_FILENAME:-"mbid.json"}
# Create necessary files
[ -d "$LOCALDATADIR" ] || mkdir -p "$LOCALDATADIR"
[ -f "$LOCALDATA_ARTISTS" ] || touch "$LOCALDATA_ARTISTS"
[ -f "$LOCALDATA_RELEASEGROUPS" ] || touch "$LOCALDATA_RELEASEGROUPS"
[ -f "$LOCALDATA_RELEASES" ] || touch "$LOCALDATA_RELEASES"
[ -f "$LOCALDATA_ARTISTS_LIST" ] || touch "$LOCALDATA_ARTISTS_LIST"
[ -f "$LOCALDATA_RELEASEGROUPS_LIST" ] || touch "$LOCALDATA_RELEASEGROUPS_LIST"
[ -f "$LOCALDATA_RELEASES_LIST" ] || touch "$LOCALDATA_RELEASES_LIST"
export LOCALDATADIR LOCALDATA_ARTISTS LOCALDATA_RELEASEGROUPS \
LOCALDATA_RELEASES LOCALDATA_ARTISTS_VIEW LOCALDATA_RELEASEGROUPS_VIEW \
LOCALDATA_RELEASES_VIEW LOCALDATA_ARTISTS_LIST LOCALDATA_RELEASEGROUPS_LIST \
@@ -229,7 +238,7 @@ __precompute_lists() {
.disambiguation,
.["life-span"].begin,
.["life-span"].end
] | join("\t")' >"$LOCALDATA_ARTISTS_LIST"
] | join("\t")' >"$LOCALDATA_ARTISTS_LIST" &
cache_get_file_batch "$TYPE_RELEASEGROUP" <"$LOCALDATA_RELEASEGROUPS" | xargs \
$JQ '[
.id,
@@ -238,7 +247,8 @@ __precompute_lists() {
."first-release-date",
.title,
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
] | join("\t")' >"$LOCALDATA_RELEASEGROUPS_LIST"
] | join("\t")' >"$LOCALDATA_RELEASEGROUPS_LIST" &
wait
}
# Precompute views
@@ -273,19 +283,24 @@ reloaddb() {
__batch_load_missing "$TYPE_RELEASE"
tmpreleasefiles=$(mktemp)
cache_get_file_batch "$TYPE_RELEASE" <"$tmpreleases" >"$tmpreleasefiles"
xargs \
$JQ '."release-group".id' \
<"$tmpreleasefiles" >"$LOCALDATA_RELEASEGROUPS"
xargs \
$JQ '."release-group"."artist-credit" | map(.artist.id) | join("\n")' \
<"$tmpreleasefiles" >"$LOCALDATA_ARTISTS"
(
xargs \
$JQ '."release-group".id' \
<"$tmpreleasefiles" >"$LOCALDATA_RELEASEGROUPS"
tf1=$(mktemp)
sort "$LOCALDATA_RELEASEGROUPS" | uniq >"$tf1"
mv "$tf1" "$LOCALDATA_RELEASEGROUPS"
) &
(
xargs \
$JQ '."release-group"."artist-credit" | map(.artist.id) | join("\n")' \
<"$tmpreleasefiles" >"$LOCALDATA_ARTISTS"
tf2=$(mktemp)
sort "$LOCALDATA_ARTISTS" | uniq >"$tf2"
mv "$tf2" "$LOCALDATA_ARTISTS"
) &
wait
rm -f "$tmpreleases" "$tmpreleasefiles"
tf1=$(mktemp)
tf2=$(mktemp)
sort "$LOCALDATA_RELEASEGROUPS" | uniq >"$tf1"
mv "$tf1" "$LOCALDATA_RELEASEGROUPS"
sort "$LOCALDATA_ARTISTS" | uniq >"$tf2"
mv "$tf2" "$LOCALDATA_ARTISTS"
__batch_load_missing "$TYPE_RELEASEGROUP" <"$LOCALDATA_RELEASEGROUPS"
__batch_load_missing "$TYPE_ARTIST" <"$LOCALDATA_ARTISTS"
__precompute_lists

View File

@@ -6,7 +6,7 @@ if [ ! "${LOG_LOADED:-}" ]; then
ERR="\033[38;5;196m"
INFO="\033[38;5;75m"
OFF="\033[m"
LOGDIR="$HOME/.local/state/$APP_NAME"
LOGDIR="${XDG_STATE_HOME:-"$HOME/.local/state"}/$APP_NAME"
[ -d "$LOGDIR" ] || mkdir -p "$LOGDIR"
LOGFILE="$LOGDIR/log"
export ERR INFO OFF LOGFILE

View File

@@ -2,12 +2,32 @@
#
# For now, only artist previews are supported.
if [ ! "${PREVIEW_LOADED:-}" ]; then
PREVIEW_NO_WRAP="__DO_NOT_WRAP_THIS_LINE__"
PREVIEW_WINDOW_PERCENTAGE="30"
export PREVIEW_NO_WRAP PREVIEW_WINDOW_PERCENTAGE
export PREVIEW_LOADED=1
fi
# This internal method reshapes the text to be shown in the preview. This
# creates a border on both horizontal ends.
#
# The text is read from stdin.
# The text is read from stdin. If a line contains the pattern defined in
# PREVIEW_NO_WRAP, then that line will not be folded.
__shape() {
cat | tr -d '\r' | fold -s -w "$((FZF_PREVIEW_COLUMNS - 4))" | awk '{print " "$0" "}'
#width="$((FZF_PREVIEW_COLUMNS - 4))"
width="$((FZF_COLUMNS * PREVIEW_WINDOW_PERCENTAGE / 100 - 4))"
while IFS= read -r line; do
line="$(printf "%s" "$line" | tr -d '\r')"
if printf "%s" "$line" | grep --silent "$PREVIEW_NO_WRAP"; then
printf " %s\n" "$line" | sed "s/$PREVIEW_NO_WRAP//g"
else
printf "%s\n" "$line" |
fold -s -w "$width" |
awk '{print " "$0" "}'
fi
done
}
# Print preview of artist

View File

@@ -19,7 +19,6 @@ if [ ! "${THEME_LOADED:-}" ]; then
CNOTE="${ESC}[38;5;242m"
CXXX="${ESC}[38;5;109m"
CDESC="${ESC}[38;5;254m"
CLIFE="${ESC}[38;5;251m"
CKB="${ESC}[38;5;224m"
OFF="${ESC}[m"
@@ -69,8 +68,8 @@ if [ ! "${THEME_LOADED:-}" ]; then
AV_FMT_FLAG_NO_LOCAL="${AV_FMT_FLAG_NO_LOCAL:-""}"
AV_FMT_TYPE_PERSON="${AV_FMT_TYPE_PERSON:-🧑‍🎤}"
AV_FMT_TYPE_GROUP="${AV_FMT_TYPE_GROUP:-🧑‍🤝‍🧑}"
AV_FMT_NAME="${AV_FMT_NAME:-"${CARTIST}%s$OFF"}"
AV_FMT_DISAMBIGUATION="${AV_FMT_DISAMBIGUATION:-"${CDISAMB}(%s)$OFF"}"
AV_FMT_NAME="${AV_FMT_NAME:-"${CARTIST}%s${OFF}"}"
AV_FMT_DISAMBIGUATION="${AV_FMT_DISAMBIGUATION:-"${CDISAMB}(%s)${OFF}"}"
export AV_FMT AV_FMT_CNT AV_FMT_RIGHTALIGN AV_FMT_FLAG_LOCAL \
AV_FMT_FLAG_NO_LOCAL AV_FMT_TYPE_PERSON AV_FMT_TYPE_GROUP AV_FMT_NAME \
AV_FMT_DISAMBIGUATION
@@ -84,7 +83,8 @@ if [ ! "${THEME_LOADED:-}" ]; then
# <<title>> string Title of album
# <<artist>> string Artist of album
# <<year>> string Year of initial release
# TODO: The above <<secondary>> is of a joint item-string type; unify or document.
# Note: The above <<secondary>> is of a joint item-string type. See code for
# details.
RGV_FMT="${RGV_FMT:-"<<flag>>\t<<type>>\t<<hassecondary>>\t<<title>><<artist>> <<year>> <<secondary>>"}"
RGV_FMT_CNT=$(($(printf "$RGV_FMT" | tr -cd '\t' | wc -c) + 1))
RGV_FMT_RIGHTALIGN="${RGV_FMT_RIGHTALIGN:-"1"}"
@@ -98,7 +98,7 @@ if [ ! "${THEME_LOADED:-}" ]; then
RGV_FMT_TYPE_UNKNOWN="${RGV_FMT_TYPE_UNKNOWN:-""}"
RGV_FMT_HASSECONDARY_YES="${RGV_FMT_HASSECONDARY_YES:-"☼"}"
RGV_FMT_HASSECONDARY_NO="${RGV_FMT_HASSECONDARY_NO:-""}"
RGV_FMT_SECONDARY="${RGV_FMT_SECONDARY:-"${CNOTE}[☼: %s]$OFF"}"
RGV_FMT_SECONDARY="${RGV_FMT_SECONDARY:-"${CNOTE}[☼: %s]${OFF}"}"
RGV_FMT_SECONDARY_SOUNDTRACK="${RGV_FMT_SECONDARY_SOUNDTRACK:-"🎬 soundtrack"}"
RGV_FMT_SECONDARY_SPOKENWORD="${RGV_FMT_SECONDARY_SPOKENWORD:-"📖 spokenword"}"
RGV_FMT_SECONDARY_INTERVIEW="${RGV_FMT_SECONDARY_INTERVIEW:-"💬 interview"}"
@@ -110,9 +110,9 @@ if [ ! "${THEME_LOADED:-}" ]; then
RGV_FMT_SECONDARY_MIXTAPE="${RGV_FMT_SECONDARY_MIXTAPE:-"📼 mixtape"}"
RGV_FMT_SECONDARY_DEMO="${RGV_FMT_SECONDARY_DEMO:-"🧪 demo"}"
RGV_FMT_SECONDARY_FIELDREC="${RGV_FMT_SECONDARY_FIELDREC:-"🌿 field recording"}"
RGV_FMT_TITLE="${RGV_FMT_TITLE:-"${CTITLE}%s$OFF"}"
RGV_FMT_ARTIST="${RGV_FMT_ARTIST:-"${CARTIST}%s$OFF"}"
RGV_FMT_YEAR="${RGV_FMT_YEAR:-"${CYEAR}(%s)$OFF"}"
RGV_FMT_TITLE="${RGV_FMT_TITLE:-"${CTITLE}%s${OFF}"}"
RGV_FMT_ARTIST="${RGV_FMT_ARTIST:-"${CARTIST}%s${OFF}"}"
RGV_FMT_YEAR="${RGV_FMT_YEAR:-"${CYEAR}(%s)${OFF}"}"
export RGV_FMT RGV_FMT_CNT RGV_FMT_RIGHTALIGN RGV_FMT_FLAG_LOCAL \
RGV_FMT_FLAG_NO_LOCAL RGV_FMT_TYPE_SINGLE RGV_FMT_TYPE_ALBUM \
RGV_FMT_TYPE_EP RGV_FMT_TYPE_BROADCAST RGV_FMT_TYPE_OTHER \
@@ -148,13 +148,13 @@ if [ ! "${THEME_LOADED:-}" ]; then
RV_FMT_STATUS_EXPUNGED="${RV_FMT_STATUS_EXPUNGED:-"🧹"}"
RV_FMT_STATUS_CANCELLED="${RV_FMT_STATUS_CANCELLED:-"❌"}"
RV_FMT_STATUS_UNKNOWN="${RV_FMT_STATUS_UNKNOWN:-""}"
RV_FMT_TRACKS="${RV_FMT_TRACKS:-"${CXXX}%s tracks$OFF"}"
RV_FMT_MEDIA="${RV_FMT_MEDIA:-"${CXXX}%s$OFF"}"
RV_FMT_YEAR="${RV_FMT_YEAR:-"${CYEAR}%s$OFF"}"
RV_FMT_COUNTRY="${RV_FMT_COUNTRY:-"${CYEAR}%s$OFF"}"
RV_FMT_LABEL="${RV_FMT_LABEL:-"${CARTIST}%s$OFF"}"
RV_FMT_TITLE="${RV_FMT_TITLE:-"${FAINT}as$OFF ${CTITLE}%s$OFF"}"
RV_FMT_ARTIST="${RV_FMT_ARTIST:-"${FAINT}by$OFF ${CTITLE}%s$OFF"}"
RV_FMT_TRACKS="${RV_FMT_TRACKS:-"${CXXX}%s tracks${OFF}"}"
RV_FMT_MEDIA="${RV_FMT_MEDIA:-"${CXXX}%s${OFF}"}"
RV_FMT_YEAR="${RV_FMT_YEAR:-"${CYEAR}%s${OFF}"}"
RV_FMT_COUNTRY="${RV_FMT_COUNTRY:-"${CYEAR}%s${OFF}"}"
RV_FMT_LABEL="${RV_FMT_LABEL:-"${CARTIST}%s${OFF}"}"
RV_FMT_TITLE="${RV_FMT_TITLE:-"${FAINT}as${OFF} ${CTITLE}%s${OFF}"}"
RV_FMT_ARTIST="${RV_FMT_ARTIST:-"${FAINT}by${OFF} ${CTITLE}%s${OFF}"}"
export RV_FMT RV_FMT_CNT RV_FMT_RIGHTALIGN RV_FMT_FLAG_LOCAL \
RV_FMT_FLAG_NO_LOCAL RV_FMT_STATUS_OFFICIAL RV_FMT_STATUS_PROMO \
RV_FMT_STATUS_BOOTLEG RV_FMT_STATUS_PSEUDO RV_FMT_STATUS_WITHDRAWN \
@@ -175,11 +175,11 @@ if [ ! "${THEME_LOADED:-}" ]; then
REC_FMT_RIGHTALIGN="${REC_FMT_RIGHTALIGN:-"1,2,3,6"}"
REC_FMT_FLAG_LOCAL="${REC_FMT_FLAG_LOCAL:-"$FORMAT_LOCAL"}"
REC_FMT_FLAG_NO_LOCAL="${REC_FMT_FLAG_NO_LOCAL:-""}"
REC_FMT_MEDIA="${REC_FMT_MEDIA:-"${CNOTE}${FAINT}%s$OFF"}"
REC_FMT_NR="${REC_FMT_NR:-"${CNOTE}%s$OFF"}"
REC_FMT_TITLE="${REC_FMT_TITLE:-"${CTITLE}%s$OFF"}"
REC_FMT_ARTIST="${REC_FMT_ARTIST:-"${CARTIST}%s$OFF"}"
REC_FMT_DURATION="${REC_FMT_DURATION:-"${CXXX}%s$OFF"}"
REC_FMT_MEDIA="${REC_FMT_MEDIA:-"${CNOTE}${FAINT}%s${OFF}"}"
REC_FMT_NR="${REC_FMT_NR:-"${CNOTE}%s${OFF}"}"
REC_FMT_TITLE="${REC_FMT_TITLE:-"${CTITLE}%s${OFF}"}"
REC_FMT_ARTIST="${REC_FMT_ARTIST:-"${CARTIST}%s${OFF}"}"
REC_FMT_DURATION="${REC_FMT_DURATION:-"${CXXX}%s${OFF}"}"
export REC_FMT REC_FMT_CNT REC_FMT_RIGHTALIGN REC_FMT_FLAG_LOCAL \
REC_FMT_FLAG_NO_LOCAL REC_FMT_MEDIA REC_FMT_NR REC_FMT_TITLE \
REC_FMT_ARTIST REC_FMT_DURATION
@@ -195,9 +195,9 @@ if [ ! "${THEME_LOADED:-}" ]; then
PLYLST_FMT_RIGHTALIGN="${PLYLST_FMT_RIGHTALIGN:-"1"}"
PLYLST_FMT_PLAYING_YES="${PLYLST_FMT_PLAYING_YES:-"👉"}"
PLYLST_FMT_PLAYING_NO="${PLYLST_FMT_PLAYING_NO:-""}"
PLYLST_FMT_TITLE="${PLYLST_FMT_TITLE:-"${CTITLE}%s$OFF"}"
PLYLST_FMT_ARTIST="${PLYLST_FMT_ARTIST:-"${CARTIST}%s$OFF"}"
PLYLST_FMT_DURATION="${PLYLST_FMT_DURATION:-"${CXXX}%s$OFF"}"
PLYLST_FMT_TITLE="${PLYLST_FMT_TITLE:-"${CTITLE}%s${OFF}"}"
PLYLST_FMT_ARTIST="${PLYLST_FMT_ARTIST:-"${CARTIST}%s${OFF}"}"
PLYLST_FMT_DURATION="${PLYLST_FMT_DURATION:-"${CXXX}%s${OFF}"}"
export PLYLST_FMT PLYLST_FMT_CNT PLYLST_FMT_RIGHTALIGN \
PLYLST_FMT_PLAYING_YES PLYLST_FMT_PLAYING_NO PLYLST_FMT_TITLE \
PLYLST_FMT_ARTIST PLYLST_FMT_DURATION
@@ -208,7 +208,6 @@ if [ ! "${THEME_LOADED:-}" ]; then
# defined above.
#
# Header that displays artist's name (based on artist view)
HEADER_ARTIST="${HEADER_ARTIST:-" ${CARTIST}%s$OFF "}"
HEADER_ARTIST_FMT="${HEADER_ARTIST_FMT:-"🎤\t<<name>> 〉"}"
HEADER_ARTIST_FMT_CNT=$(($(printf "$HEADER_ARTIST_FMT" | tr -cd '\t' | wc -c) + 1))
HEADER_ARTIST_FMT_RIGHTALIGN="${HEADER_ARTIST_FMT_RIGHTALIGN:-"1"}"
@@ -218,11 +217,10 @@ if [ ! "${THEME_LOADED:-}" ]; then
HEADER_ARTIST_FMT_TYPE_GROUP="${HEADER_ARTIST_FMT_TYPE_GROUP:-"$AV_FMT_TYPE_GROUP"}"
HEADER_ARTIST_FMT_NAME="${HEADER_ARTIST_FMT_NAME:-"$AV_FMT_NAME"}"
HEADER_ARTIST_FMT_DISAMBIGUATION="${HEADER_ARTIST_FMT_DISAMBIGUATION:-"$AV_FMT_DISAMBIGUATION"}"
export HEADER_ARTIST HEADER_ARTIST_FMT HEADER_ARTIST_FMT_CNT \
HEADER_ARTIST_FMT_RIGHTALIGN HEADER_ARTIST_FMT_FLAG_LOCAL \
HEADER_ARTIST_FMT_FLAG_NO_LOCAL HEADER_ARTIST_FMT_TYPE_PERSON \
HEADER_ARTIST_FMT_TYPE_GROUP HEADER_ARTIST_FMT_NAME \
HEADER_ARTIST_FMT_DISAMBIGUATION
export HEADER_ARTIST_FMT HEADER_ARTIST_FMT_CNT HEADER_ARTIST_FMT_RIGHTALIGN \
HEADER_ARTIST_FMT_FLAG_LOCAL HEADER_ARTIST_FMT_FLAG_NO_LOCAL \
HEADER_ARTIST_FMT_TYPE_PERSON HEADER_ARTIST_FMT_TYPE_GROUP \
HEADER_ARTIST_FMT_NAME HEADER_ARTIST_FMT_DISAMBIGUATION
# Header that displays the release-group (based on release-group view)
HEADER_RG_FMT="${HEADER_RG_FMT:-"🎤\t<<artist>> 》<<title>> 〉"}"
@@ -251,7 +249,7 @@ if [ ! "${THEME_LOADED:-}" ]; then
HEADER_RG_FMT_SECONDARY_DEMO="${HEADER_RG_FMT_SECONDARY_DEMO:-"$RGV_FMT_SECONDARY_DEMO"}"
HEADER_RG_FMT_SECONDARY_FIELDREC="${HEADER_RG_FMT_SECONDARY_FIELDREC:-"$RGV_FMT_SECONDARY_FIELDREC"}"
HEADER_RG_FMT_TITLE="${HEADER_RG_FMT_TITLE:-"$RGV_FMT_TITLE"}"
HEADER_RG_FMT_ARTIST="${HEADER_RG_FMT_ARTIST:-"${CARTIST}%s$OFF"}"
HEADER_RG_FMT_ARTIST="${HEADER_RG_FMT_ARTIST:-"${CARTIST}%s${OFF}"}"
HEADER_RG_FMT_YEAR="${HEADER_RG_FMT_YEAR:-"$RGV_FMT_YEAR"}"
export HEADER_RG_FMT HEADER_RG_FMT_CNT HEADER_RG_FMT_RIGHTALIGN \
HEADER_RG_FMT_FLAG_LOCAL HEADER_RG_FMT_FLAG_NO_LOCAL \
@@ -268,8 +266,6 @@ if [ ! "${THEME_LOADED:-}" ]; then
HEADER_RG_FMT_YEAR
# Header that displays the release (based on release view)
#HEADER_RELEASE="${HEADER_RELEASE:-" ${CARTIST}%s$OFF 》${CTITLE}%s$OFF 〉%s"}"
#HEADER_RELEASE_FORMAT="${HEADER_RELEASE_FORMAT:-"${CRELINFO}<<tracks>> tx <<media>> $OFF|$CRELINFO <<label>> <<country>> <<year>>$OFF"}"
HEADER_R_FMT="${HEADER_R_FMT:-"🎤\t<<artist>> 》<<title>> 〉<<tracks>> ${CRELINFO}tx${OFF} <<media>> | <<label>> <<country>> <<year>>"}"
HEADER_R_FMT_CNT=$(($(printf "$HEADER_R_FMT" | tr -cd '\t' | wc -c) + 1))
HEADER_R_FMT_RIGHTALIGN="${HEADER_R_FMT_RIGHTALIGN:-"1"}"
@@ -283,13 +279,13 @@ if [ ! "${THEME_LOADED:-}" ]; then
HEADER_R_FMT_STATUS_EXPUNGED="${HEADER_R_FMT_STATUS_EXPUNGED:-"$RV_FMT_STATUS_EXPUNGED"}"
HEADER_R_FMT_STATUS_CANCELLED="${HEADER_R_FMT_STATUS_CANCELLED:-"$RV_FMT_STATUS_CANCELLED"}"
HEADER_R_FMT_STATUS_UNKNOWN="${HEADER_R_FMT_STATUS_UNKNOWN:-"$RV_FMT_STATUS_UNKNOWN"}"
HEADER_R_FMT_TRACKS="${HEADER_R_FMT_TRACKS:-"${CRELINFO}%s$OFF"}"
HEADER_R_FMT_MEDIA="${HEADER_R_FMT_MEDIA:-"${CRELINFO}%s$OFF"}"
HEADER_R_FMT_YEAR="${HEADER_R_FMT_YEAR:-"${CRELINFO}%s$OFF"}"
HEADER_R_FMT_COUNTRY="${HEADER_R_FMT_COUNTRY:-"${CRELINFO}%s$OFF"}"
HEADER_R_FMT_LABEL="${HEADER_R_FMT_LABEL:-"${CRELINFO}%s$OFF"}"
HEADER_R_FMT_TITLE="${HEADER_R_FMT_TITLE:-"${CTITLE}%s$OFF"}"
HEADER_R_FMT_ARTIST="${HEADER_R_FMT_ARTIST:-"${CARTIST}%s$OFF"}"
HEADER_R_FMT_TRACKS="${HEADER_R_FMT_TRACKS:-"${CRELINFO}%s${OFF}"}"
HEADER_R_FMT_MEDIA="${HEADER_R_FMT_MEDIA:-"${CRELINFO}%s${OFF}"}"
HEADER_R_FMT_YEAR="${HEADER_R_FMT_YEAR:-"${CRELINFO}%s${OFF}"}"
HEADER_R_FMT_COUNTRY="${HEADER_R_FMT_COUNTRY:-"${CRELINFO}%s${OFF}"}"
HEADER_R_FMT_LABEL="${HEADER_R_FMT_LABEL:-"${CRELINFO}%s${OFF}"}"
HEADER_R_FMT_TITLE="${HEADER_R_FMT_TITLE:-"${CTITLE}%s${OFF}"}"
HEADER_R_FMT_ARTIST="${HEADER_R_FMT_ARTIST:-"${CARTIST}%s${OFF}"}"
export HEADER_R_FMT HEADER_R_FMT_CNT HEADER_R_FMT_RIGHTALIGN \
HEADER_R_FMT_FLAG_LOCAL HEADER_R_FMT_FLAG_NO_LOCAL \
HEADER_R_FMT_STATUS_OFFICIAL HEADER_R_FMT_STATUS_PROMO \
@@ -302,6 +298,9 @@ if [ ! "${THEME_LOADED:-}" ]; then
# Artist Preview
# ==============
# Lines that contain the pattern defined in PREVIEW_NO_WRAP (see
# `src/sh/preview.sh`) will not be wrapped.
#
# We distinguish between single-person and group artists.
#
# <<name>> | string | Artist name
@@ -312,12 +311,12 @@ if [ ! "${THEME_LOADED:-}" ]; then
# <<start> | higher-order placeholder | Placeholder for start string
# <<end>> | higher-order placeholder | Placeholder for end string
# <<url>> | higher-order placeholder | Placeholder for links
PREVIEW_ARTIST_PERSON_FMT="${PREVIEW_ARTIST_PERSON_FMT:-"<<bio>><<alias>><<start>><<end>>\n<<url>>"}"
PREVIEW_ARTIST_PERSON_FMT="${PREVIEW_ARTIST_PERSON_FMT:-"\n\n<<bio>><<alias>><<start>><<end>>\n<<url>>"}"
PREVIEW_ARTIST_PERSON_NAME="${PREVIEW_ARTIST_PERSON_NAME:-"%s"}"
PREVIEW_ARTIST_PERSON_SORTNAME="${PREVIEW_ARTIST_PERSON_SORTNAME:-"%s"}"
PREVIEW_ARTIST_PERSON_BIO="${PREVIEW_ARTIST_PERSON_BIO:-"${CDESC}%s$OFF\n\n"}"
PREVIEW_ARTIST_PERSON_BIO="${PREVIEW_ARTIST_PERSON_BIO:-"${CDESC}%s${OFF}\n\n"}"
PREVIEW_ARTIST_PERSON_DISAMB="${PREVIEW_ARTIST_PERSON_DISAMB:-"%s"}"
PREVIEW_ARTIST_PERSON_ALIAS="${PREVIEW_ARTIST_PERSON_ALIAS:-"${FAINT}Also known as ${ITALIC}%s$OFF\n\n"}"
PREVIEW_ARTIST_PERSON_ALIAS="${PREVIEW_ARTIST_PERSON_ALIAS:-"${FAINT}Also known as ${ITALIC}%s${OFF}\n\n"}"
PREVIEW_ARTIST_PERSON_ALIAS_JOIN="${PREVIEW_ARTIST_PERSON_ALIAS_JOIN:-"%s, %s"}"
PREVIEW_ARTIST_PERSON_START="${PREVIEW_ARTIST_PERSON_START:-"🍼 Born: %s\n"}"
PREVIEW_ARTIST_PERSON_START_FMT="${PREVIEW_ARTIST_PERSON_START_FMT:-"<<startdate>> <<startplace>>"}"
@@ -327,12 +326,12 @@ if [ ! "${THEME_LOADED:-}" ]; then
PREVIEW_ARTIST_PERSON_END_FMT="${PREVIEW_ARTIST_PERSON_END_FMT:-"<<enddate>> <<endplace>>"}"
PREVIEW_ARTIST_PERSON_END_ENDDATE="${PREVIEW_ARTIST_PERSON_END_ENDDATE:-"%s"}"
PREVIEW_ARTIST_PERSON_END_ENDPLACE="${PREVIEW_ARTIST_PERSON_END_ENDPLACE:-"in %s"}"
PREVIEW_ARTIST_PERSON_URL="${PREVIEW_ARTIST_PERSON_URL:-"\n${UNDERLINE}Links:$OFF%s\n"}"
PREVIEW_ARTIST_PERSON_URL="${PREVIEW_ARTIST_PERSON_URL:-"\n%s\n"}"
PREVIEW_ARTIST_PERSON_URL_JOIN="${PREVIEW_ARTIST_PERSON_URL_JOIN:-"%s\n%s"}"
PREVIEW_ARTIST_PERSON_URL_FMT="${PREVIEW_ARTIST_PERSON_URL_FMT:-"<<urlindex>>:\n<<urlname>>\n<<urllink>>\n"}"
PREVIEW_ARTIST_PERSON_URL_URLINDEX="${PREVIEW_ARTIST_PERSON_URL_URLINDEX:-"${CDISAMB}%3d$OFF"}"
PREVIEW_ARTIST_PERSON_URL_URLNAME="${PREVIEW_ARTIST_PERSON_URL_URLNAME:-"${CDESC}%s$OFF"}"
PREVIEW_ARTIST_PERSON_URL_URLLINK="${PREVIEW_ARTIST_PERSON_URL_URLLINK:-"${FAINT}%s$OFF"}"
PREVIEW_ARTIST_PERSON_URL_FMT="${PREVIEW_ARTIST_PERSON_URL_FMT:-"${PREVIEW_NO_WRAP}<<urlindex>>: <<urlname>> <<urllink>>\n"}"
PREVIEW_ARTIST_PERSON_URL_URLINDEX="${PREVIEW_ARTIST_PERSON_URL_URLINDEX:-"${CDISAMB}%3d${OFF}"}"
PREVIEW_ARTIST_PERSON_URL_URLNAME="${PREVIEW_ARTIST_PERSON_URL_URLNAME:-"${CDESC}%s${OFF}"}"
PREVIEW_ARTIST_PERSON_URL_URLLINK="${PREVIEW_ARTIST_PERSON_URL_URLLINK:-"${FAINT}%s${OFF}"}"
export PREVIEW_ARTIST_PERSON_FMT PREVIEW_ARTIST_PERSON_NAME \
PREVIEW_ARTIST_PERSON_SORTNAME PREVIEW_ARTIST_PERSON_BIO \
PREVIEW_ARTIST_PERSON_DISAMB PREVIEW_ARTIST_PERSON_ALIAS \
@@ -381,11 +380,11 @@ if [ ! "${THEME_LOADED:-}" ]; then
# Keybinding themes
# =================
# Format keybinding group
KBF_GROUP="${KBF_GROUP:-"${UNDERLINE}${CKB}%s$OFF"}"
KBF_GROUP="${KBF_GROUP:-"${UNDERLINE}${CKB}%s${OFF}"}"
# Format key
KBF_KEY="${KBF_KEY:-"${BOLD}${CKB}%s$OFF"}"
KBF_KEY="${KBF_KEY:-"${BOLD}${CKB}%s${OFF}"}"
# Format description
KBF_DESC="${KBF_DESC:-"${CKB}%s$OFF"}"
KBF_DESC="${KBF_DESC:-"${CKB}%s${OFF}"}"
export KBF_GROUP KBF_KEY KBF_DESC
export THEME_LOADED=1