epsi2ics/epsiEDTtoICS.sh

100 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# The epsi2ics project produces an ICS file from an EPSI school-year calendar.
# Copyright © 2019 Y. Gablin, under the GPL-3.0-or-later license.
# Full licensing information in the LICENSE file, or gnu.org/licences/gpl-3.0.txt if the file is missing.
#
# from EPSI “edtmobilityeng” to ICS, for the current school year
# $1: EPSI Login (firstname.lastname)
# $2: output file (else standard output)
if [ -n "$2" -a -d "$(dirname "$2")" -a -w "$(dirname "$2")" ]; then
exec >"$2"
fi
(
currentYear=$(date +%Y)
splitDay=$(date +%j -d "${currentYear}-08-01" | sed 's/^0*//') # XXXX-08-01 ∈ [1 … 366]
dayOfYear=$(date +%j | sed 's/^0*//') # this day ∈ [1 … 366]
if [ $dayOfYear -lt $splitDay ]; then
offsetMax=$(( splitDay-dayOfYear ))
offset=$(( offsetMax-365 ))
else
offset=$(( splitDay-dayOfYear ))
offsetMax=$(( 365+offset ))
fi
dayOfWeek=$(date +%u -d "${offset}days") # ∈ [1=monday … 5=friday]
cat <<-ENDOFTEXT
BEGIN:VCALENDAR
VERSION:2.0
PRODID:yalis.fr/epsi2ical v1.0/FR
ENDOFTEXT
while [ $offset -lt $offsetMax ]; do
mon=$(date +%Y%m%dT%z -d "$(($offset+1-$dayOfWeek))days")
tue=$(date +%Y%m%dT%z -d "$(($offset+2-$dayOfWeek))days")
wed=$(date +%Y%m%dT%z -d "$(($offset+3-$dayOfWeek))days")
thu=$(date +%Y%m%dT%z -d "$(($offset+4-$dayOfWeek))days")
fri=$(date +%Y%m%dT%z -d "$(($offset+5-$dayOfWeek))days")
curl -s "https://edtmobiliteng.wigorservices.net/WebPsDyn.aspx?action=posEDTBEECOME&serverid=C&Tel=${1}&date=$(date +%m/%d/%Y -d "${offset}days")" \
| tr '\r\n' ' ' \
| sed -r 's/[[:blank:]]+/ /g' \
| grep -oE '<DIV [^>]*class="Case" [^>]*style="[^"]*left *:[^"]*"|DIV [^>]*style="[^"]*left *:[^"]*" [^>]*class="Case"|<td [^>]*class="TC(ase|Prof|hdeb|Salle)"([^<]|<[^/]|</[^t]|</t[^d])*</td>' \
| awk -vmon=$mon -vtue=$tue -vwed=$wed -vthu=$thu -vfri=$fri -F$'\t' '
function out() {
if (ase!="") printf( \
"BEGIN:VEVENT\nDTSTART:%s%s%s\nDTEND:%s%s%s\nSUMMARY:%s\nLOCATION:%s\nDESCRIPTION:🗣 %s 👥 %s\nEND:VEVENT\n", \
day, from, zone, \
day, to, zone, \
ase, \
where, \
prof, who)
ase=""
prof=""
who=""
day=""
zone=""
from=""
to=""
where=""
}
/class="Case"/ {
out()
pc=gensub(".*left *: *([0-9]+)[%.].*", "\\1", 1)
if (pc < 110) tmpd=mon
else if (pc < 130) tmpd=tue
else if (pc < 150) tmpd=wed
else if (pc < 170) tmpd=thu
else tmpd=fri
day=substr(tmpd, 1, 9)
zone=substr(tmpd, 10)
}
/class="TCase"/ {
ase=gensub(".*</div>(.*)</.*", "\\1", 1)
}
/class="TCProf"/ {
split(gensub(".*>(.*)<br/?>(.*)</.*", "\\1\t\\2", 1), tmp)
prof=tmp[1]
who=tmp[2]
}
/class="TChdeb"/ {
split(gensub(".*> *([^ ]{2}):?([^ ]{2}) *- *([^ ]{2}):?([^ ]{2}) *</.*", "\\1\\2\t\\3\\4", 1), tmp)
from=tmp[1] "00"
to=tmp[2] "00"
}
/class="TCSalle"/ {
where=gensub(".*>(Salle:)?(.*)</.*", "\\2", 1)
}
END {
out()
}'
offset=$(($offset+7))
done
cat <<-ENDOFTEXT
END:VCALENDAR
ENDOFTEXT
) \
| sed 's/$/\r/'