diff --git a/src/awk/preview_artist.awk b/src/awk/preview_artist.awk new file mode 100644 index 0000000..41a7051 --- /dev/null +++ b/src/awk/preview_artist.awk @@ -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, format_start) + gsub("<>", 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, format_end) + gsub("<>", 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, urlentry) + gsub("<>", urlname, urlentry) + gsub("<>", urllink, urlentry) + url = i == 1 ? urlentry : sprintf(join_url, url, urlentry) + } + } + # Combine all and print + gsub("<>", name, format) + gsub("<>", sortname, format) + gsub("<>", disamb, format) + gsub("<>", bio, format) + gsub("<>", alias, format) + gsub("<>", start, format) + gsub("<>", end, format) + gsub("<>", url, format) + print format +} diff --git a/src/sh/awk.sh b/src/sh/awk.sh index aa1fbbc..8cd89df 100644 --- a/src/sh/awk.sh +++ b/src/sh/awk.sh @@ -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" +} diff --git a/src/sh/preview.sh b/src/sh/preview.sh index 58ead9c..4ac59e1 100644 --- a/src/sh/preview.sh +++ b/src/sh/preview.sh @@ -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 diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 40ed614..f2209d8 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -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. + # + # <> | string | Artist name + # <> | string | Artist sort name + # <> | string | Artist biography + # <> | string | Artist disambiguation string + # <> | higher-order placeholder | Placeholder for aliases + # < | higher-order placeholder | Placeholder for start string + # <> | higher-order placeholder | Placeholder for end string + # <> | higher-order placeholder | Placeholder for links + PREVIEW_ARTIST_PERSON_FMT="${PREVIEW_ARTIST_PERSON_FMT:-"<><><><>\n<>"}" + 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:-"<> <>"}" + 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:-"<> <>"}" + 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:-"<>:\n<>\n<>\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 # =================