improved preview and group preview

This commit is contained in:
2025-10-07 15:31:35 +02:00
parent e7fe1aec98
commit 5b7e8ef4c3
4 changed files with 314 additions and 42 deletions

View File

@@ -0,0 +1,99 @@
# Preview artists
#
# parameters:
# name | Artist name
# sortname | Artist sort name
# disamb | Artist disambiguation string
# bio | Artist biography
# alias | Tab-delimited string of aliases
# startdate | Date where artist is born, group is founded
# startplace | Place where artist is born, group is founded
# enddate | Date where artist died, group dissolved
# endplace | Place where artist died, group dissolved
# url | Tab-delimited string of ;-delimited pairs (url name, url link)
#
# theme parameters (see `src/sh/theme.sh`)
# format | Format string
# fmtname | `printf` expression to transform artist names
# fmtsortname | `printf` expression to transform artist sortnames
# fmtbio | `printf` expression to transform disambiguation
# fmtdisamb | `printf` expression to transform disambiguation
# fmtalias | `printf` expression to transform alias
# join_alias | `printf` expression to join one alias to the previously constructed aliases
# format_start | Format string for born/founded string
# fmtstart | `printf` expression for born/founded
# fmtstart_startdate | `printf` expression to transform the start date
# fmtstart_startplace | `printf` expression to transform the start place
# format_end | Format string for died/dissolved string
# fmtend | `printf` expression for died/dissolved
# fmtend_enddate | `printf` expression to transform the end date
# fmtend_endplace | `printf` expression to transform the end place
# fmturl | `printf` expression for links
# format_url | Format string for url string
# join_url | `printf` expression to join one url to all others
# fmturl_urlindex | `printf` expression for URL index
# fmturl_urlname | `printf` expression for URL name
# fmturl_urllink | `printf` expression for URL link (address)
#
# This awk program takes no input from stdin and outputs the preview text for
# the artist.
@include "lib/awk/lib.awk"
BEGIN {
name = name ? sprintf(fmtname, escape(name)) : ""
sortname = sortname ? sprintf(fmtsortname, escape(sortname)) : ""
disamb = disamb ? sprintf(fmtdisamb, escape(disamb)) : ""
bio = bio ? sprintf(fmtbio, escape(bio)) : ""
# Alias
if (alias) {
split(alias, a, "\t")
for (i in a) {
alias = i == 1 ? a[i] : sprintf(join_alias, alias, a[i])
}
alias = sprintf(fmtalias, escape(alias))
}
# Start
startdate = startdate ? sprintf(fmtstart_startdate, escape(startdate)) : ""
startplace = startplace ? sprintf(fmtstart_startplace, escape(startplace)) : ""
if (startdate || startplace) {
gsub("<<startdate>>", startdate, format_start)
gsub("<<startplace>>", startplace, format_start)
start = sprintf(fmtstart, escape(format_start))
}
# End
enddate = enddate ? sprintf(fmtend_enddate, escape(enddate)) : ""
endplace = endplace ? sprintf(fmtend_endplace, escape(endplace)) : ""
if (enddate || endplace) {
gsub("<<enddate>>", enddate, format_end)
gsub("<<endplace>>", endplace, format_end)
end = sprintf(fmtend, escape(format_end))
}
# Links
if (url) {
split(url, a, "\t")
for (i in a) {
urlindex = sprintf(fmturl_urlindex, i)
pos = index(a[i], ";")
urlname = substr(a[i], 1, pos - 1)
urlname = urlname ? sprintf(fmturl_urlname, escape(urlname)) : ""
urllink = substr(a[i], pos + 1)
urllink = urllink ? sprintf(fmturl_urllink, escape(urllink)) : ""
urlentry = format_url
gsub("<<urlindex>>", urlindex, urlentry)
gsub("<<urlname>>", urlname, urlentry)
gsub("<<urllink>>", urllink, urlentry)
url = i == 1 ? urlentry : sprintf(join_url, url, urlentry)
}
}
# Combine all and print
gsub("<<name>>", name, format)
gsub("<<sortname>>", sortname, format)
gsub("<<disambiguation>>", disamb, format)
gsub("<<bio>>", bio, format)
gsub("<<alias>>", alias, format)
gsub("<<start>>", start, format)
gsub("<<end>>", end, format)
gsub("<<url>>", url, format)
print format
}

View File

@@ -30,6 +30,13 @@ EOF
)
export AWK_RECORDINGS
AWK_PREVIEW_ARTIST=$(
cat <<'EOF'
@@include awk/preview_artist.awk
EOF
)
export AWK_PREVIEW_ARTIST
export AWK_LOADED=1
fi
@@ -264,3 +271,99 @@ awk_playlist() {
"$AWK_RECORDINGS" |
column -t -s "$(printf '\t')" -R "$PLYLST_FMT_RIGHTALIGN" -l "$PLYLST_FMT_CNT"
}
# Themed awk scrtip to preview single-person artist
#
# @argument $1: Artist name
# @argument $2: Artist sort name
# @argument $3: Artist disambiguation
# @argument $4: Artist biography
# @argument $5: Artist aliases
# @argument $6: Birthdate
# @argument $7: Birth place
# @argument $8: Date when died
# @argument $9: Place where died
# @argument $10: Artist urls
awk_preview_artist_person() {
awk \
-v name="${1:-}" \
-v sortname="${2:-}" \
-v disamb="${3:-}" \
-v bio="${4:-}" \
-v alias="${5:-}" \
-v startdate="${6:-}" \
-v startplace="${7:-}" \
-v enddate="${8:-}" \
-v endplace="${9:-}" \
-v url="${10:-}" \
-v format="$PREVIEW_ARTIST_PERSON_FMT" \
-v fmtname="$PREVIEW_ARTIST_PERSON_NAME" \
-v fmtsortname="$PREVIEW_ARTIST_PERSON_SORTNAME" \
-v fmtbio="$PREVIEW_ARTIST_PERSON_BIO" \
-v fmtdisamb="$PREVIEW_ARTIST_PERSON_DISAMB" \
-v fmtalias="$PREVIEW_ARTIST_PERSON_ALIAS" \
-v join_alias="$PREVIEW_ARTIST_PERSON_ALIAS_JOIN" \
-v format_start="$PREVIEW_ARTIST_PERSON_START_FMT" \
-v fmtstart="$PREVIEW_ARTIST_PERSON_START" \
-v fmtstart_startdate="$PREVIEW_ARTIST_PERSON_START_STARTDATE" \
-v fmtstart_startplace="$PREVIEW_ARTIST_PERSON_START_STARTPLACE" \
-v format_end="$PREVIEW_ARTIST_PERSON_END_FMT" \
-v fmtend="$PREVIEW_ARTIST_PERSON_END" \
-v fmtend_enddate="$PREVIEW_ARTIST_PERSON_END_ENDDATE" \
-v fmtend_endplace="$PREVIEW_ARTIST_PERSON_END_ENDPLACE" \
-v fmturl="$PREVIEW_ARTIST_PERSON_URL" \
-v format_url="$PREVIEW_ARTIST_PERSON_URL_FMT" \
-v join_url="$PREVIEW_ARTIST_PERSON_URL_JOIN" \
-v fmturl_urlindex="$PREVIEW_ARTIST_PERSON_URL_URLINDEX" \
-v fmturl_urlname="$PREVIEW_ARTIST_PERSON_URL_URLNAME" \
-v fmturl_urllink="$PREVIEW_ARTIST_PERSON_URL_URLLINK" \
"$AWK_PREVIEW_ARTIST"
}
# Themed awk scrtip to preview artist group
#
# @argument $1: Artist name
# @argument $2: Artist sort name
# @argument $3: Artist disambiguation
# @argument $4: Artist biography
# @argument $5: Artist aliases
# @argument $6: Founding date
# @argument $7: Founding place
# @argument $8: Date when dissolved
# @argument $9: Place where dissovled
# @argument $10: Artist urls
awk_preview_artist_group() {
awk \
-v name="${1:-}" \
-v sortname="${2:-}" \
-v disamb="${3:-}" \
-v bio="${4:-}" \
-v alias="${5:-}" \
-v startdate="${6:-}" \
-v startplace="${7:-}" \
-v enddate="${8:-}" \
-v endplace="${9:-}" \
-v url="${10:-}" \
-v format="$PREVIEW_ARTIST_GROUP_FMT" \
-v fmtname="$PREVIEW_ARTIST_GROUP_NAME" \
-v fmtsortname="$PREVIEW_ARTIST_GROUP_SORTNAME" \
-v fmtbio="$PREVIEW_ARTIST_GROUP_BIO" \
-v fmtdisamb="$PREVIEW_ARTIST_GROUP_DISAMB" \
-v fmtalias="$PREVIEW_ARTIST_GROUP_ALIAS" \
-v join_alias="$PREVIEW_ARTIST_GROUP_ALIAS_JOIN" \
-v format_start="$PREVIEW_ARTIST_GROUP_START_FMT" \
-v fmtstart="$PREVIEW_ARTIST_GROUP_START" \
-v fmtstart_startdate="$PREVIEW_ARTIST_GROUP_START_STARTDATE" \
-v fmtstart_startplace="$PREVIEW_ARTIST_GROUP_START_STARTPLACE" \
-v format_end="$PREVIEW_ARTIST_GROUP_END_FMT" \
-v fmtend="$PREVIEW_ARTIST_GROUP_END" \
-v fmtend_enddate="$PREVIEW_ARTIST_GROUP_END_ENDDATE" \
-v fmtend_endplace="$PREVIEW_ARTIST_GROUP_END_ENDPLACE" \
-v fmturl="$PREVIEW_ARTIST_GROUP_URL" \
-v format_url="$PREVIEW_ARTIST_GROUP_URL_FMT" \
-v join_url="$PREVIEW_ARTIST_GROUP_URL_JOIN" \
-v fmturl_urlindex="$PREVIEW_ARTIST_GROUP_URL_URLINDEX" \
-v fmturl_urlname="$PREVIEW_ARTIST_GROUP_URL_URLNAME" \
-v fmturl_urllink="$PREVIEW_ARTIST_GROUP_URL_URLLINK" \
"$AWK_PREVIEW_ARTIST"
}

View File

@@ -14,37 +14,45 @@ __shape() {
#
# @input $1: MusicBrainz artist ID
preview_artist() {
desc=$(mb_artist_enwikipedia "$1" | $JQ '.extract' | __shape)
[ "$desc" ] || desc=$(mb_artist_discogs "$1" | $JQ '.profile' | sed 's/\[a=\([^]]*\)\]/\1/g' | __shape)
name="$(mb_artist "$1" | $JQ '.name')"
sortname="$(mb_artist "$1" | $JQ '."sort-name"')"
disamb="$(mb_artist "$1" | $JQ '.disambiguation')"
bio=$(mb_artist_enwikipedia "$1" | $JQ '.extract')
[ "$bio" ] || bio=$(mb_artist_discogs "$1" | $JQ '.profile' | sed 's/\[a=\([^]]*\)\]/\1/g')
alias="$(mb_artist "$1" | $JQ '.aliases | map(.name) | join("\t")')"
startdate="$(mb_artist "$1" | $JQ '."life-span".begin // ""' | head -c 4)"
startplace="$(mb_artist "$1" | $JQ '."begin-area".name // ""')"
enddate="$(mb_artist "$1" | $JQ '."life-span".end // ""' | head -c 4)"
endplace="$(mb_artist "$1" | $JQ '."end-area".name // ""')"
url="$(mb_artist "$1" | $JQ '[.relations[] | select(."target-type" == "url") | [.type, .url.resource] | join(";")] | join("\t")')"
if [ "$(mb_artist "$1" | $JQ '.type')" = "Person" ]; then
# Show birth place and death place of person
lsb=$(mb_artist "$1" | $JQ '."life-span".begin // ""' | head -c 4)
lse=$(mb_artist "$1" | $JQ '."life-span".end // ""' | head -c 4)
ab=$(mb_artist "$1" | $JQ '."begin-area".name // ""')
ae=$(mb_artist "$1" | $JQ '."end-area".name // ""')
if [ "$lsb" ] && [ "$ab" ]; then
begin=$(printf "$APV_DATEPLACE" "$lsb" "$ab")
elif [ "$lsb" ]; then
begin=$(printf "$APV_DATE" "$lsb")
elif [ "$ab" ]; then
begin=$(printf "$APV_PLACE" "$ab")
else
begin=""
fi
if [ "$lse" ] && [ "$ae" ]; then
end=$(printf "$APV_DATEPLACE" "$lse" "$ae")
elif [ "$lse" ]; then
end=$(printf "$APV_DATE" "$lse")
elif [ "$ae" ]; then
end=$(printf "$APV_PLACE" "$ae")
else
end=""
fi
[ "$begin" ] && lifespan="$(printf "$APV_BORN" "$begin")"
[ "$end" ] && lifespan="$(printf "%s\n$APV_DIED" "$lifespan" "$end")"
awk_preview_artist_person \
"$name" \
"$sortname" \
"$disamb" \
"$bio" \
"$alias" \
"$startdate" \
"$startplace" \
"$enddate" \
"$endplace" \
"$url" |
__shape
else
awk_preview_artist_group \
"$name" \
"$sortname" \
"$disamb" \
"$bio" \
"$alias" \
"$startdate" \
"$startplace" \
"$enddate" \
"$endplace" \
"$url" |
__shape
fi
#link=$(printf "More info:\033]8;;%s\033\\ %s\033]8;;\033\\" "https://musicbrainz.org/" "[MusicBrainz]")
printf "$APV_FORMAT" "$desc" "${lifespan:-}"
}
# Print message if there is nothing to be shown

View File

@@ -9,6 +9,7 @@ if [ ! "${THEME_LOADED:-}" ]; then
ESC=$(printf '\033')
BOLD="${ESC}[1m"
FAINT="${ESC}[2m"
ITALIC="${ESC}[3m"
UNDERLINE="${ESC}[4m"
CARTIST="${ESC}[38;5;209m"
CTITLE="${ESC}[38;5;229m"
@@ -301,20 +302,81 @@ if [ ! "${THEME_LOADED:-}" ]; then
# Artist Preview
# ==============
# Main preview format. Takes two %s placeholder. The first is for the artist
# biography. The second for the life span.
APV_FORMAT="${APV_FORMAT:-"\n\n${CDESC}%s${OFF}\n\n${CLIFE}%s${OFF}"}"
# Specification of a date
APV_DATE="${APV_DATE:-"%s"}"
# Specification of a place
APV_PLACE="${APV_PLACE:-"%s"}"
# Specification of a date and a place (in that order)
APV_DATEPLACE="${APV_DATEPLACE:-"$APV_DATE, $APV_PLACE"}"
# String to represent when/where a person is born
APV_BORN="${APV_BORN:-"🍼 Born: %s"}"
# String to represent when/where a person died
APV_DIED="${APV_DIED:-"🕯️ Died: %s"}"
export APV_FORMAT APV_DATE APV_PLACE APV_DATEPLACE APV_BORN APV_DIED
# 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_FMT="${PREVIEW_ARTIST_PERSON_FMT:-"<<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_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_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>>"}"
PREVIEW_ARTIST_PERSON_START_STARTDATE="${PREVIEW_ARTIST_PERSON_START_STARTDATE:-"%s"}"
PREVIEW_ARTIST_PERSON_START_STARTPLACE="${PREVIEW_ARTIST_PERSON_START_STARTPLACE:-"in %s"}"
PREVIEW_ARTIST_PERSON_END="${PREVIEW_ARTIST_PERSON_END:-"🕯️ Died: %s\n"}"
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_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"}"
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 \
PREVIEW_ARTIST_PERSON_ALIAS_JOIN PREVIEW_ARTIST_PERSON_START \
PREVIEW_ARTIST_PERSON_START_FMT PREVIEW_ARTIST_PERSON_START_STARTDATE \
PREVIEW_ARTIST_PERSON_START_STARTPLACE PREVIEW_ARTIST_PERSON_END \
PREVIEW_ARTIST_PERSON_END_FMT PREVIEW_ARTIST_PERSON_END_ENDDATE \
PREVIEW_ARTIST_PERSON_END_ENDPLACE PREVIEW_ARTIST_PERSON_URL \
PREVIEW_ARTIST_PERSON_URL_JOIN PREVIEW_ARTIST_PERSON_URL_FMT \
PREVIEW_ARTIST_PERSON_URL_URLINDEX PREVIEW_ARTIST_PERSON_URL_URLNAME \
PREVIEW_ARTIST_PERSON_URL_URLLINK
PREVIEW_ARTIST_GROUP_FMT="${PREVIEW_ARTIST_GROUP_FMT:-"$PREVIEW_ARTIST_PERSON_FMT"}"
PREVIEW_ARTIST_GROUP_NAME="${PREVIEW_ARTIST_GROUP_NAME:-"$PREVIEW_ARTIST_PERSON_NAME"}"
PREVIEW_ARTIST_GROUP_SORTNAME="${PREVIEW_ARTIST_GROUP_SORTNAME:-"$PREVIEW_ARTIST_PERSON_SORTNAME"}"
PREVIEW_ARTIST_GROUP_BIO="${PREVIEW_ARTIST_GROUP_BIO:-"$PREVIEW_ARTIST_PERSON_BIO"}"
PREVIEW_ARTIST_GROUP_DISAMB="${PREVIEW_ARTIST_GROUP_DISAMB:-"$PREVIEW_ARTIST_PERSON_DISAMB"}"
PREVIEW_ARTIST_GROUP_ALIAS="${PREVIEW_ARTIST_GROUP_ALIAS:-"$PREVIEW_ARTIST_PERSON_ALIAS"}"
PREVIEW_ARTIST_GROUP_ALIAS_JOIN="${PREVIEW_ARTIST_GROUP_ALIAS_JOIN:-"$PREVIEW_ARTIST_PERSON_ALIAS_JOIN"}"
PREVIEW_ARTIST_GROUP_START="${PREVIEW_ARTIST_GROUP_START:-"✂️ Founded: %s\n"}"
PREVIEW_ARTIST_GROUP_START_FMT="${PREVIEW_ARTIST_GROUP_START_FMT:-"$PREVIEW_ARTIST_PERSON_START_FMT"}"
PREVIEW_ARTIST_GROUP_START_STARTDATE="${PREVIEW_ARTIST_GROUP_START_STARTDATE:-"$PREVIEW_ARTIST_PERSON_START_STARTDATE"}"
PREVIEW_ARTIST_GROUP_START_STARTPLACE="${PREVIEW_ARTIST_GROUP_START_STARTPLACE:-"$PREVIEW_ARTIST_PERSON_START_STARTPLACE"}"
PREVIEW_ARTIST_GROUP_END="${PREVIEW_ARTIST_GROUP_END:-"🛑 Dissolved: %s\n"}"
PREVIEW_ARTIST_GROUP_END_FMT="${PREVIEW_ARTIST_GROUP_END_FMT:-"$PREVIEW_ARTIST_PERSON_END_FMT"}"
PREVIEW_ARTIST_GROUP_END_ENDDATE="${PREVIEW_ARTIST_GROUP_END_ENDDATE:-"$PREVIEW_ARTIST_PERSON_END_ENDDATE"}"
PREVIEW_ARTIST_GROUP_END_ENDPLACE="${PREVIEW_ARTIST_GROUP_END_ENDPLACE:-"$PREVIEW_ARTIST_PERSON_END_ENDPLACE"}"
PREVIEW_ARTIST_GROUP_URL="${PREVIEW_ARTIST_GROUP_URL:-"$PREVIEW_ARTIST_PERSON_URL"}"
PREVIEW_ARTIST_GROUP_URL_JOIN="${PREVIEW_ARTIST_GROUP_URL_JOIN:-"$PREVIEW_ARTIST_PERSON_URL_JOIN"}"
PREVIEW_ARTIST_GROUP_URL_FMT="${PREVIEW_ARTIST_GROUP_URL_FMT:-"$PREVIEW_ARTIST_PERSON_URL_FMT"}"
PREVIEW_ARTIST_GROUP_URL_URLINDEX="${PREVIEW_ARTIST_GROUP_URL_URLINDEX:-"$PREVIEW_ARTIST_PERSON_URL_URLINDEX"}"
PREVIEW_ARTIST_GROUP_URL_URLNAME="${PREVIEW_ARTIST_GROUP_URL_URLNAME:-"$PREVIEW_ARTIST_PERSON_URL_URLNAME"}"
PREVIEW_ARTIST_GROUP_URL_URLLINK="${PREVIEW_ARTIST_GROUP_URL_URLLINK:-"$PREVIEW_ARTIST_PERSON_URL_URLLINK"}"
export PREVIEW_ARTIST_GROUP_FMT PREVIEW_ARTIST_GROUP_NAME \
PREVIEW_ARTIST_GROUP_SORTNAME PREVIEW_ARTIST_GROUP_BIO \
PREVIEW_ARTIST_GROUP_DISAMB PREVIEW_ARTIST_GROUP_ALIAS \
PREVIEW_ARTIST_GROUP_ALIAS_JOIN PREVIEW_ARTIST_GROUP_START \
PREVIEW_ARTIST_GROUP_START_FMT PREVIEW_ARTIST_GROUP_START_STARTDATE \
PREVIEW_ARTIST_GROUP_START_STARTPLACE PREVIEW_ARTIST_GROUP_END \
PREVIEW_ARTIST_GROUP_END_FMT PREVIEW_ARTIST_GROUP_END_ENDDATE \
PREVIEW_ARTIST_GROUP_END_ENDPLACE PREVIEW_ARTIST_GROUP_URL \
PREVIEW_ARTIST_GROUP_URL_JOIN PREVIEW_ARTIST_GROUP_URL_FMT \
PREVIEW_ARTIST_GROUP_URL_URLINDEX PREVIEW_ARTIST_GROUP_URL_URLNAME \
PREVIEW_ARTIST_GROUP_URL_URLLINK
# Keybinding themes
# =================