{"id":17654300,"url":"https://github.com/pgaskin/innosoftfusiongo-ical","last_synced_at":"2025-03-30T09:21:01.437Z","repository":{"id":196192519,"uuid":"694985633","full_name":"pgaskin/innosoftfusiongo-ical","owner":"pgaskin","description":"API serving Innosoft Fusion Go schedule data as an iCalendar feed, plus a web UI.","archived":false,"fork":false,"pushed_at":"2024-07-04T12:42:02.000Z","size":496,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-05T11:23:39.732Z","etag":null,"topics":["api","calendar","ical","icalendar","innosoft-fusion"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pgaskin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-09-22T05:37:02.000Z","updated_at":"2025-01-20T12:27:51.000Z","dependencies_parsed_at":"2024-03-29T23:33:07.352Z","dependency_job_id":"5b7667f1-b712-418f-96d5-0cc660aa70aa","html_url":"https://github.com/pgaskin/innosoftfusiongo-ical","commit_stats":null,"previous_names":["pgaskin/innosoftfusiongo-ical"],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgaskin%2Finnosoftfusiongo-ical","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgaskin%2Finnosoftfusiongo-ical/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgaskin%2Finnosoftfusiongo-ical/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgaskin%2Finnosoftfusiongo-ical/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pgaskin","download_url":"https://codeload.github.com/pgaskin/innosoftfusiongo-ical/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246297524,"owners_count":20754805,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","calendar","ical","icalendar","innosoft-fusion"],"created_at":"2024-10-23T12:09:28.189Z","updated_at":"2025-03-30T09:21:01.416Z","avatar_url":"https://github.com/pgaskin.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# innosoftfusiongo-ical\n\nAPI serving Innosoft Fusion Go schedule data as an iCalendar feed, plus a web UI.\n\n- Web UI for setting options (requires a modern browser).\n- Supports global notifications (as all-day events).\n- Supports weekly recurrence (separating by activity/location/time, and weekdays where necessary).\n- Generated iCalendar files are valid and work correctly with most clients (e.g., Thunderbird, Outlook, Google Calendar, ICSx5).\n- Options for working around client quirks.\n- Supports filtering activity/category/location.\n- Caches data and handles errors properly.\n- Automatic timezone detection.\n- Optional JSON output for use in other applications.\n\nThe school ID can be found in `assets/config.json` in a branded `com.innosoftfusiongo.*` APK.\n\nGoogle Calendar is not recommended if your schedule changes frequently or often has last-minute cancellations since it generally updates at most around once a day and cannot be force-refreshed.\n\nI mostly made this for myself, but I've published it in case anyone else finds it useful. I host an instance limited to serving the Queen's University ARC schedule [here](https://ifgical.api.pgaskin.net/110).\n\nExample JQ filter for the JSON output:\n\n```bash\n# show upcoming events\ncurl -s 'https://ifgical.api.pgaskin.net/110.json?fake_cancelled=1\u0026no_notifications=1' | jq -r '\n  .schedule\n  | map(\n    . as $activity\n    | $activity.instances\n    | map(select(.isExclusion == false))\n    | map({location: $activity.location, startTime: $activity.startTime} * $activity.base * .))\n  | [.[][]]\n  | sort_by(._start_at)\n  | map(\"\\(.date_weekday[:3]) \\(.date)   \\(.startTime) - \\(.endTime)   \\((.activity+(\" \"*30))[:30]) \\((.location+(\" \"*30))[:30]) \\(.description[:60]+(if ((.description | length) \u003e 60) then \"...\" else \"\" end))\")\n  | .[]\n'\n\n# summarize all events in a category including human-readable recurrence information\ncurl -s 'https://ifgical.api.pgaskin.net/110.json?category_id=721\u0026no_notifications=1\u0026describe_recurrence=1' | jq -r '\n  .schedule | sort_by(.base.date) | map(\n    \"\\(.base.activity)\\n\" +\n    \" In \\(.location)\\n\" +\n    if (.instances | length) \u003e 1 then (\n      \" Starts \\(.base.date_weekday[:3]) \\(.base.date)\\n\" +\n      \" Until \\(.instances[-1].date_weekday[:3]) \\(.instances[-1].date)\\n\" +\n      \" \\(.recurrenceDescription)\\n\"\n    ) else (\n      \" On \\(.base.date_weekday[:3]) \\(.base.date)\\n\" +\n      \" At \\(.startTime)\\n\"\n    ) end\n  ) | .[]\n'\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgaskin%2Finnosoftfusiongo-ical","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpgaskin%2Finnosoftfusiongo-ical","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgaskin%2Finnosoftfusiongo-ical/lists"}