Read the statement by Michael Teeuw here.
MMM-CalendarEXT2 - Calendar Read Failing When Time Value Is Missing from ics file
-
@edd189 missed that…
anyhow… I think you are stuck… , and will have to fix it yourself
unless the original author chooses to help.
-
@sdetweil said in MMM-CalendarEXT2 - Calendar Read Failing When Time Value Is Missing from ics file:
and will have to fix it yourself
I know, that’s what I’m asking for help with here. :)
I don’t understand in the code where the call to the ics file occurs. If I can find it and just append 0’s where no time exists, I believe that will solve it.
I found this in CALEXT2_Event.js. Any idea if this is where the call is made?
const now = moment().locale(locale); if (this.useEventTimeRelative) { let status = "current"; if (this.mEnd.isBefore(now)) status = "passed"; if (this.mStart.isAfter(now)) status = "future"; const timeDom = document.createElement("div"); timeDom.classList.add("relative"); timeDom.classList.add(status); timeDom.innerHTML = this.relativeFormat[status] .replace("%ENDFROMNOW%", this.mEnd.fromNow()) .replace("%STARTFROMNOW%", this.mStart.fromNow()) .replace("%DURATION%", dur.humanize()); if (typeof this.dateFormat === "string") { timeDom.innerHTML .replace("%STARTDATE%", this.mStart.format(this.dateFormat)) .replace("%ENDDATE%", this.mEnd.format(this.dateFormat)); } time.appendChild(timeDom); } else { let sd; let ed; let st; let et; let sdt; let edt = null; if (typeof this.dateFormat === "object") { sd = this.mStart.calendar(null, this.dateFormat); ed = this.mEnd.calendar(null, this.dateFormat); } else { sd = this.mStart.format(this.dateFormat); ed = this.mEnd.format(this.dateFormat); } if (typeof this.timeFormat === "object") { st = this.mStart.calendar(null, this.timeFormat); et = this.mEnd.calendar(null, this.timeFormat); } else { st = this.mStart.format(this.timeFormat); et = this.mEnd.format(this.timeFormat); } if (typeof this.dateTimeFormat === "object") { sdt = this.mStart.calendar(null, this.dateTimeFormat); edt = this.mEnd.calendar(null, this.dateTimeFormat); } else { sdt = this.mStart.format(this.dateTimeFormat); edt = this.mEnd.format(this.dateTimeFormat); } time.appendChild(makeEventTime(sd, "startDate start date")); time.appendChild(makeEventTime(st, "startTime start time")); time.appendChild(makeEventTime(sdt, "startDateTime start dateTime")); time.appendChild(makeEventTime(ed, "endDate end date")); time.appendChild(makeEventTime(et, "endTime end time")); time.appendChild(makeEventTime(edt, "endDateTime end dateTime")); } return time; -
@edd189 its in the node_helper.js
url = url.replace("webcal://", "http://"); try { response = await fetch(url, opts);approx line 90
-
@sdetweil Well, this is quickly becoming a bugabear!
The error is passed all the way from ical.js (found here: https://github.com/kewisch/ical.js) via a call through iCalExpander (found here: https://github.com/mifi/ical-expander) on node_helper.js line 137.
Line 1107 in time.js (sub-module of ical.js):
static fromDateTimeString(aValue, prop) {
if (aValue.length < 19) {
throw new Error(
‘invalid date-time value: "’ + aValue + ‘"’
);
}This seems odd to me. I’m working with two different ics files and both of them present a problem for these four lines of code. But my computer, iPhone, and other MMM modules handle the ics file fine. Is this ics.js not used by other calendar modules? Did the accepted format for an ical file change at some point since CX2 was developed?
Acceptable format of an ics entry lists the time as an optional component: https://datatracker.ietf.org/doc/html/rfc5545#section-3.8.2
Time to dig more into their methods I suppose…
-
@edd189 if the time is not specified, the event is a full day event.
spec hasn’t changed, but the ics providers have changed their data, outside the spec.
MS in particular has started using the custom timezone feature, and mapping all the events to their custom(overlapping with IANA based standard timezones)
all this breaks a bunch of stuff…
only the calendar modules use the ics parser. ext2 had its own. MM default uses node-ical
-
@sdetweil Looks like the ics.js branch being used by CX2 had a report on this issue around a year ago with no fix. :(
-
@edd189 yep, stuff gets old, people get tired, or move on… or it becomes too much work to keep it up to date
-
from line 1142:
ICAL.Time.fromString = function fromString(aValue) {
if (aValue.length > 10) {
return ICAL.Time.fromDateTimeString(aValue);
} else {
return ICAL.Time.fromDateString(aValue);
}
};Looks like time.js within (https://github.com/kewisch/ical.js) is already trying to do something different with the entry if the length is less than 10. But that count seems off to me – it should never make the call to line 1107 (fromDateTimeString) at all. It should be using line 1083 (fromDateString).
-
@edd189 you could
console.log("aValue='"+aValue+"'")to check its contents (in the mm startup output)
-
I tried to put
console.log(‘[CALEXT2] calendar: >> error on line 1111’);
within the time.js file, found embedded within the CX2 directory. It didn’t output anything. Will a sub-rountine embedded a few layers down still output to the console? Do I need to reinstall or re-link anything?
-
@edd189 generally yes, regardless of where it is…
no, no need to do any compile
sory, forgo this darned forum changes quotes not in a code block …
make sure they are the straight up and down ones
look back at my example -
@sdetweil Doh, the error reporter already shows me the aValue.
aValue = 2022-01-01T::
By my count, that is 13 characters. Let me see if simply changing 10 to 13 in the above code fixes it.
-
@sdetweil Is this right?
ICAL.Time.fromString = function fromString(aValue) {
if (aValue.length > 10) {
return ICAL.Time.fromDateTimeString(aValue);
Log.log([CALEXT2] calendar: >> greater 10);
Console.log($avalue.length );
} else {
return ICAL.Time.fromDateString(aValue);
Log.log([CALEXT2] calendar: >> less 10);
Console.log($avalue.length );
}
}; -
@edd189 said in MMM-CalendarEXT2 - Calendar Read Failing When Time Value Is Missing from ics file:
Log.log([CALEXT2] calendar: >> greater 10);
Console.log($avalue.length );no… those new statements are after the return… so will never be executed
Log.log and console.log are the same here …
-
Thanks for your help. Not sure I’m finding the right place where the call is made to fromDateTimeString. I found a few more instances in a file under the build directory. I was previously only looking under the lib directory.
Not sure how I missed it, but I need to take a break for the evening. Pick it back up later.
-
Look at file design.js here: https://github.com/kewisch/ical.js/tree/main/lib/ical
What does line 401 do? The call on line 403 is where I get the error. I’m not familiar enough with java to know what decorate means.
-
@edd189 sorry. no idea
-
Ok, plan B – read the ICS files, save them locally, append the time to the DTSTART and DTEND fields.
Create a script to do this automatically every 24 hours.
Wish me luck! I’m in over my head, but its kinda fun.
Any advice? I am running this on linux, so figured I can just run a cronjob every 24 hours. What’s the best service to language to use to write such a simple script?
-
@edd189 people write in python, I do most of mine in bash shell.
-
Sorry for late reply. I was outside in holidays. I’ll study what your issue is tomorrow.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login