My Old Calendar Process
William McKeehan
William McKeehan
May 29, 2022

My Old Calendar Process

My Old Calendar Process

This process/tools described below are no longer in use. See My Tools for details on what I currently use.

Update Calendar Data Script

This script is pretty basic. It uses a list of calendars from a text file of the format: url-to-ics filename Then the conversion to the reminder format is handled by a Perl script that I got from

There is a bug in the perl module iCal-Parser where it ignores timezone on ical events Bug Report. I've applied the patch mentioned in the report and that seems to have fixed my issues.

# calendar-urls.txt is a text file with one line per ics to fetch
# each line has two values, the name (which must be unique)
# and the url
while read line
  set $line   # Breaks the string into $1, $2, ...
  rm -f ~/.cal/$1.ics
  /usr/local/bin/wget -q -O ~/.cal/$1.ics $2
done < ~/.cal/calendar-urls.txt

# Convert the local calendars and those fetched from the above loop
# to remind format
cat ~/.cal/*.ics | /usr/bin/perl ~/.cal/ --lead-time 0 --no-todos --label "#### Calendar" > ~/.cal/all.rem

Calendar Data in Markdown

The script above pushes my calendar data into the Remind format. From there, I'm able to use Remind to get my calendar for the day. I do a little sed parsing to clean up the output and add the markup that I need to make these appear in Obsidian the way I want.

# -b1 use a 24-hour time format
# -gaaad -sorting - date ascending, time ascending, priority ascending, untimed reminders are sorted before timed reminders
# -f remain in the foreground
# -q don't queue timed reminders
remind -b1 -gaaad -f -q ~/.reminders | sed -e 's/^.*today at /- [ ] /' -e 's/^.*today //' | sed -e 's/\\,/,/g' -e 's/\\n/; /g' -e 's/\\;/; /g' | sed '/^#### Calendar Events:/d' | sed 's/^\([^#|-]\)/\1/'

My ~/.reminders file includes the default reminder file, a bit for sunrise/sunset and a few recurring events, then it includes the output of the above execution.

include /Users/mckeehan/remind/def.rem


; show sunrise/sunset
SET $LongDeg -83
SET $LongMin 37
SET $LongSec 37
SET $LatDeg 35
SET $LatMin 58
SET $LatSec 28
; MSG Sunrise at [sunrise(trigdate())], Sunset at [sunset(trigdate())], next full moon at [moontime(2)] on [moondate(2)]%

; prettify the sunrise/sunset/moon data
fset _srtd() coerce("STRING", _no_lz(_am_pm(sunrise(today()))))
fset _sstd() coerce("STRING", _no_lz(_am_pm(sunset(today()))))
fset _srtm() coerce("STRING", _no_lz(_am_pm(sunrise(today()+1))))
fset _sstm() coerce("STRING", _no_lz(_am_pm(sunset(today()+1))))
MSG - Sunrise at [_srtd()], Sunset at [_sstd()].%"%"%
MSG - Next full moon: [mon(moondate(2))] [day(moondate(2))], [year(moondate(2))].%"%"

MSG #### Schedule:%"%"%

include /Users/mckeehan/remind/othercals.rem

Google Apps Calendar Challenges

I encountered issues downloading my work Google calendar, but I found that the Private iCal address was not available. It turns out there's a setting in the Google Apps admin console that will enable this feature. See How to Enable the iCal Private Addresses for Google Apps.