#!/usr/bin/env python3
# feiertage_at.py
# 2024-06-16
# by Gernot Walzl
# Generate an iCalendar (*.ics) file of public holidays in Austria
# https://de.wikipedia.org/wiki/Feiertage_in_%C3%96sterreich
# https://datatracker.ietf.org/doc/html/rfc5545
import argparse
from datetime import date, datetime, timedelta, timezone
from dateutil.easter import easter
from os.path import getmtime
def public_holidays_at(year):
return [
(date(year, 1, 1), "Neujahr", "Österreich",
"https://de.wikipedia.org/wiki/Neujahr"),
(date(year, 1, 6), "Heilige Drei Könige", "Österreich",
"https://de.wikipedia.org/wiki/Heilige_Drei_K%C3%B6nige"),
(date(year, 3, 19), "Josef", "Kärnten, Steiermark, Tirol, Vorarlberg",
"https://de.wikipedia.org/wiki/Josefstag"),
(easter(year)+timedelta(days=1), "Ostermontag", "Österreich",
"https://de.wikipedia.org/wiki/Ostern"),
(date(year, 5, 1), "Staatsfeiertag", "Österreich",
"https://de.wikipedia.org/wiki/Staatsfeiertag_(%C3%96sterreich)"),
(date(year, 5, 4), "Florian", "Oberösterreich",
"https://de.wikipedia.org/wiki/Florian_von_Lorch"),
(easter(year)+timedelta(days=39), "Christi Himmelfahrt", "Österreich",
"https://de.wikipedia.org/wiki/Christi_Himmelfahrt"),
(easter(year)+timedelta(days=50), "Pfingstmontag", "Österreich",
"https://de.wikipedia.org/wiki/Pfingsten"),
(easter(year)+timedelta(days=60), "Fronleichnam", "Österreich",
"https://de.wikipedia.org/wiki/Fronleichnam"),
(date(year, 8, 15), "Mariä Himmelfahrt", "Österreich",
"https://de.wikipedia.org/wiki/Mari%C3%A4_Aufnahme_in_den_Himmel"),
(date(year, 9, 24), "Rupert", "Salzburg",
"https://de.wikipedia.org/wiki/Rupert_von_Salzburg"),
(date(year, 10, 10), "Tag der Volksabstimmung", "Kärnten",
"https://de.wikipedia.org/wiki/Volksabstimmung_1920_in_K%C3%A4rnten"),
(date(year, 10, 26), "Nationalfeiertag", "Österreich",
"https://de.wikipedia.org/wiki/Nationalfeiertag_(%C3%96sterreich)"),
(date(year, 11, 1), "Allerheiligen", "Österreich",
"https://de.wikipedia.org/wiki/Allerheiligen"),
(date(year, 11, 11), "Martin", "Burgenland",
"https://de.wikipedia.org/wiki/Martin_von_Tours"),
(date(year, 11, 15), "Leopold", "Niederösterreich, Wien",
"https://de.wikipedia.org/wiki/Leopold_III._(%C3%96sterreich)"),
(date(year, 12, 8), "Mariä Empfängnis", "Österreich",
"https://de.wikipedia.org/wiki/Mari%C3%A4_Empf%C3%A4ngnis"),
(date(year, 12, 24), "Heiliger Abend", "Österreich",
"https://de.wikipedia.org/wiki/Weihnachten"),
(date(year, 12, 25), "Christtag", "Österreich",
"https://de.wikipedia.org/wiki/Weihnachten"),
(date(year, 12, 26), "Stefanitag", "Österreich",
"https://de.wikipedia.org/wiki/Stefanitag"),
(date(year, 12, 31), "Silvester", "Österreich",
"https://de.wikipedia.org/wiki/Silvester")
]
def print_vevent(dtstart, summary, location, description):
print("BEGIN:VEVENT")
print("UID:"+dtstart.strftime('%Y%m%d')+"@feiertage-at")
dtstamp = datetime.fromtimestamp(getmtime(__file__), timezone.utc)
print("DTSTAMP:"+dtstamp.strftime('%Y%m%dT%H%M%SZ'))
print("DTSTART;VALUE=DATE:"+dtstart.strftime('%Y%m%d'))
print("DTEND;VALUE=DATE:"+(dtstart+timedelta(days=1)).strftime('%Y%m%d'))
print("SUMMARY:"+summary)
print("LOCATION:"+location)
print("DESCRIPTION:"+description)
print("END:VEVENT")
def main(year):
print("BEGIN:VCALENDAR")
print("VERSION:2.0")
print("PRODID:-//")
print("CALSCALE:GREGORIAN")
for holiday in public_holidays_at(args.year):
print_vevent(holiday[0], holiday[1], holiday[2], holiday[3])
print("END:VCALENDAR")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("year", type=int, choices=range(2000, 2200))
args = parser.parse_args()
main(args.year)