100 lines
3.3 KiB
Bash
Executable File
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/'
|