keith / reminders-cli

A simple CLI for interacting with macOS reminders
MIT License
666 stars 53 forks source link

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

Closed wkoszek closed 1 year ago

wkoszek commented 3 years ago

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 3 years ago

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

wkoszek commented 3 years ago

@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 3 years ago

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

wkoszek commented 3 years ago

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

fbaube commented 1 year ago

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

keith commented 1 year ago

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

fbaube commented 1 year ago

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.

0xdevalias commented 1 year ago

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.

0xdevalias commented 1 year ago

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 1 year ago

I believe done in https://github.com/keith/reminders-cli/pull/55/