summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xheutigeBachkantaten227
1 files changed, 227 insertions, 0 deletions
diff --git a/heutigeBachkantaten b/heutigeBachkantaten
new file mode 100755
index 0000000..faabb7e
--- /dev/null
+++ b/heutigeBachkantaten
@@ -0,0 +1,227 @@
+#!/bin/bash
+
+Y=$(date +%Y)
+G=$((Y%19 + 1))
+C=$((Y/100 +1))
+X=$(((3*C)/4 - 12))
+Z=$(((8*C+5)/25 - 5))
+D=$(((5*Y)/4-X-10))
+E=$(((11*G+50+Z-(X%30))%30))
+if [ ${E} -eq 25 ] && [ ${G} -gt 11 ] || [ ${E} -eq 24 ]; then
+ E=$((E+1))
+fi
+N=$((44-E))
+if [ ${N} -lt 21 ]; then
+ N=$((N+30))
+fi
+N=$((N+7-((D+N)%7)))
+Ostern=$((
+ $(date +%s -d"${Y}-03-01") + (N-1)*24*60*60
+))
+
+# $1. Sonntag nach $2
+sonntag_nach() {
+ echo $((
+ $(date +%s -d@$2) + 24*60*60*(7*$1 + 1 - $(date +%u -d@$(($2+24*60*60))))
+ ))
+}
+
+curl -Ss 'https://de.wikipedia.org/wiki/Liste_der_Bachkantaten' \
+ | sed -n '
+ \#^<h2><span class="mw-headline" id="Liste_der_Kantaten">Liste der Kantaten</span>#,\#^<h2># p
+ ' \
+ | tr -d '\n' \
+ | sed '
+ s#<th[^>]*>[^<>]*</th>##g
+ s#<span style="\(visibility:hidden;"\|display:none"\( class="sortkey"\)\?\)>[^<>]*</span>##g
+ s#<a [^>]*>##g
+ s#</a>##g
+ ' \
+ | sed '
+ s#<\(h2\|tr\|tbody\)#\n\0#g
+ s#</\(h2\|tr\|tbody\)>#\0\n#g
+ ' \
+ | grep -vxF '' \
+ | sed -n '
+ \#<th># d
+ \#<tbody>#,\#</tbody># p
+ ' \
+ | sed -n '
+ 1 d
+ $ d
+ s#^.*<tr\( [^>]\+\)\?><td>\([^<>]\+\)</td><td>[^<>]\+</td><td>\([^<>]*\)</td>\(.*\)</tr>.*#\2 \3#
+ T err
+ s/^\(\S\+\) \([0-9]\+\)\( \|$\)/\1_\2\3/
+ p
+ b
+ :err
+ s/.*/passt nicht: "\0"/
+ w /dev/stderr
+ ' \
+ | sed '
+ /^\S\+ $/d
+ s/^\(\S\+ \).*(\([^()]\+\)).*$/\1real:\2/
+ t
+ s/^\(\S\+ \)\(Sonntag nach \)/\11. \2/
+ s/^\(\S\+ \)\([0-9]\+\)\. Sonntag nach \(\S\+\)$/\1\2+ \3/
+ ' \
+ | sed '
+ / Dramma per musica$/d
+ / Huldigungskantate$/d
+ / Ratswechsel$/d
+ / Trauerfeier$/d
+ / Unbekannter Anlass$/d
+ / Weltliche Kantate$/d
+ ' \
+ | while read -r bwv plus sonntag; do
+ if [ -z "${plus##*+}" ]; then
+ plus="${plus%+}"
+ else
+ if [ -z "${sonntag}" ]; then
+ sonntag="${plus}"
+ else
+ sonntag="${plus} ${sonntag}"
+ fi
+ plus=''
+ fi
+ if [ -z "${sonntag##real:*}" ]; then
+ sonntag="${sonntag#real:}"
+ tag="${sonntag%%. *}"
+ sonntag="${sonntag#*. }"
+ for monat in {01..13}; do
+ if [ ${monat} -eq 13 ]; then
+ >&2 printf 'unbekannter Monat "%s"\n' "${sonntag}"
+ exit 1
+ fi
+ if [ "$(date +%B -d"${Y}-${monat}-01")" = "${sonntag}" ]; then
+ break
+ fi
+ done
+ ausgabe=$(
+ date +%s -d"${Y}-${monat}-${tag}"
+ )
+ elif [ -z "${sonntag%%*. Adventsonntag}" ]; then
+ ausgabe=$(
+ sonntag_nach "$((${sonntag%. Adventsonntag}-4))" "$(date +%s -d"${Y}-12-24")"
+ )
+ elif [ "${sonntag}" = 'Weihnachten' ]; then
+ ausgabe=$(
+ date +%s -d"${Y}-12-24"
+ )
+ elif [ -z "${sonntag%?. Weihnachtstag}" ]; then
+ ausgabe=$((
+ $(date +%s -d"${Y}-12-24") + ${sonntag%. Weihnachtstag}*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Neujahr' ]; then
+ ausgabe=$(
+ date +%s -d"${Y}-01-01"
+ )
+ elif [ "${sonntag}" = 'Epiphanias' ]; then
+ ausgabe=$(
+ date +%s -d"${Y}-01-06"
+ )
+ elif [ "${sonntag}" = 'Septuagesimae' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*9*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Sexagesimae' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*8*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Estomihi' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*7*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Invocabit' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*6*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Reminiscere' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*5*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Oculi' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*4*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Laetare' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*3*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Judica' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*2*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Palmsonntag' ]; then
+ ausgabe=$((
+ "${Ostern}" - 7*24*60*60
+ ))
+ elif [ -z "${sonntag%?. Osterfesttag}" ]; then
+ ausgabe=$((
+ Ostern + (${sonntag%. Osterfesttag}-1)*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Quasimodogeniti' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Misericordias Domini' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*2*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Jubilate' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*3*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Cantate' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*4*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Rogate' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*5*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Christi Himmelfahrt' ]; then
+ ausgabe=$((
+ "${Ostern}" + (7*6-3)*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Exaudi' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*6*24*60*60
+ ))
+ elif [ -z "${sonntag%?. Pfingstfesttag}" ]; then
+ ausgabe=$((
+ Ostern + (${sonntag%. Pfingstfesttag}-1 + 7*7)*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Trinitatis' ]; then
+ ausgabe=$((
+ "${Ostern}" + 7*8*24*60*60
+ ))
+ elif [ "${sonntag}" = 'Gratulationskantate' ] || \
+ [ "${sonntag}" = 'Geburtstagskantate' ]; then
+ ausgabe=$(
+ date +%s -d"${Y}-07-25"
+ )
+ elif [ "${sonntag}" = 'Hochzeit' ] || \
+ [ "${sonntag}" = 'Trauung' ]; then
+ ausgabe=$(
+ date +%s -d"${Y}-09-15"
+ )
+ else
+ >&2 printf '%s >>%s<<\n' "${bwv}" "${sonntag}"
+ continue
+ fi
+ if [ -n "${plus}" ]; then
+ ausgabe=$(
+ sonntag_nach "${plus}" "${ausgabe}"
+ )
+ fi
+ printf '%s %s\n' \
+ "${bwv}" \
+ "$(date +%F -d@"${ausgabe}")"
+ done \
+ | grep " $(date +%F)$" \
+ | cut -d' ' -f1 \
+ | tr '\n' ' ' \
+ | sed '
+ s/ $/\n/
+ '