keith/reminders-cli

[Feature request] Add listing flags / dates / notes / URLs in JSON format

Closed this issue · 10 comments

How hard could it be to add listing not only a title of a task but also all the other auxiliary parameters attached to an item?

image

My dream come true: reminders -f json show TODO gives me a JSON dump of everything on the TODO list.

How much work would it be?

keith commented

I'm not sure if all the metadata is accessible in the API as it is today, but otherwise I think it would be do-able

@keith Would you be willing to add a bug bounty label for this? I'd be willing to donate $25 to someone who could explore this.

keith commented

Any quick guide on how that works? I've never done that with one of my issues

I'd just make a gold label with $25 in it. E.g.: Kapeli/Dash-User-Contributions#2014

Dumb question: Would this enable me to wrap reminders-cli inside a non-Swift application ?

keith commented

Do you mean this specific feature request or the tool in general? Either way likely no, unless you can bridge to objective-c in whatever language you're trying to use, or you might be able to shell out to this CLI

Ah sorry, i meant: the reminders-cli app in general. I'd line to be able to invoke it from Go and capture the output. I wouldn't think it would pose any particular problems.

I'm not sure if all the metadata is accessible in the API as it is today, but otherwise I think it would be do-able

Looks like main.swift calls into CLI.swift, which calls into Reminders.swift, which uses EKEventStore from EventKit:

It looks like getCalendars() currently filters it so we can only access 'reminder calendars' that are modifiable:

reminders() uses Store.predicateForReminders() + Store.fetchReminders() to fetch all of the reminders for the given EKCalendar, which returns an array of EKReminders:

It looks like EKReminder directly allows reading the priority, start date, due date, whether it's completed, and the date it was completed; but it also inherits from EKCalendarItem which allows reading the title, location, creation/modified date, timezone, url, notes, attendees (may not be relevant to a reminder), alarms, recurrence rules, etc:

Skimming through the UI in the Reminders app, that looks like it covers pretty much if not all of the fields I can see on a reminder (maybe not images.. but I suspect that may be 'hidden' in the notes/similar objects maybe?); so this issue definitely seems plausible to complete?


A quick google for Swift JSON handling lead me to the following:


Looks like the 'Building Manually' instructions are pretty straightforward to follow, with 1 minor tweak:

We can also run it in debug mode with swift run reminders (eg. swift run reminders --help)


Edit: I've been hacking away at this this afternoon and have a mostly implemented prototype. Will clean it up and put up a PR shortly.

Just put up a PR to resolve a chunk of the above. It adds a new export-all command that outputs Reminders as JSON. It adds a bunch of extra fields that I identified, but there were still some (eg. flag) that I didn't figure out/find a way to access through the SDK during my brief research today. There are still a couple of tiny TODO/improvement things i'd like to do, but it's usable/testable in it's current state.

keith commented

I believe done in #55