diff --git a/docs/widgets/services/calendar.md b/docs/widgets/services/calendar.md
index b1bc0ea4..f9ed6284 100644
--- a/docs/widgets/services/calendar.md
+++ b/docs/widgets/services/calendar.md
@@ -15,13 +15,20 @@ widget:
firstDayInWeek: sunday # optional - defaults to monday
view: monthly # optional - possible values monthly, agenda
maxEvents: 10 # optional - defaults to 10
+ showTime: true # optional - show time for event happening today - defaults to false
integrations: # optional
- - type: sonarr # active widget type that is currently enabled on homepage - possible values: radarr, sonarr, lidarr, readarr
+ - type: sonarr # active widget type that is currently enabled on homepage - possible values: radarr, sonarr, lidarr, readarr, ical
service_group: Media # group name where widget exists
service_name: Sonarr # service name for that widget
color: teal # optional - defaults to pre-defined color for the service (teal for sonarr)
params: # optional - additional params for the service
unmonitored: true # optional - defaults to false, used with *arr stack
+ - type: ical # Show calendar events from another service
+ url: https://domain.url/with/link/to.ics # URL with calendar events
+ name: My Events # required - name for these calendar events
+ color: zinc # optional - defaults to pre-defined color for the service (zinc for ical)
+ params: # optional - additional params for the service
+ showName: true # optional - show name before event title in event line - defaults to false
```
## Agenda
@@ -33,6 +40,7 @@ widget:
type: calendar
view: agenda
maxEvents: 10 # optional - defaults to 10
+ showTime: true # optional - show time for event happening today - defaults to false
previousDays: 3 # optional - shows events since three days ago - defaults to 0
integrations: # same as in Monthly view example
```
@@ -42,3 +50,7 @@ widget:
Currently integrated widgets are [sonarr](sonarr.md), [radarr](radarr.md), [lidarr](lidarr.md) and [readarr](readarr.md).
Supported colors can be found on [color palette](../../configs/settings.md#color-palette).
+
+### iCal
+
+This custom integration allows you to show events from any calendar that supports iCal format, for example, Google Calendar (go to `Settings`, select specific calendar, go to `Integrate calendar`, copy URL from `Public Address in iCal format`).
diff --git a/package-lock.json b/package-lock.json
index 16e2ed68..45c77579 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"dependencies": {
"@headlessui/react": "^1.7.2",
"@kubernetes/client-node": "^0.17.1",
+ "cal-parser": "^1.0.2",
"classnames": "^2.3.2",
"compare-versions": "^5.0.1",
"dockerode": "^3.3.4",
@@ -1250,6 +1251,15 @@
"node": ">=14.16"
}
},
+ "node_modules/cal-parser": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cal-parser/-/cal-parser-1.0.2.tgz",
+ "integrity": "sha512-wlQwcF0fl4eLclyGdncF9rcNNq0ipRYZGagG6h3LVgRXvCWE1fdMUaCLXwfC9YWoz9jKKbjQAq7TpO2Y3yrvmA==",
+ "dependencies": {
+ "ical-date-parser": "^4.0.0",
+ "rrule": "^2.6.8"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -3382,6 +3392,11 @@
"resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-1.2.0.tgz",
"integrity": "sha512-pUx3AcgXCbur0jpFA7U67Z2RJflAcIi698Y8VL+phdOqUchahxriV3Cs+M6UkPNQSS/zPEzWLfdJ8EgjB7HVxg=="
},
+ "node_modules/ical-date-parser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ical-date-parser/-/ical-date-parser-4.0.0.tgz",
+ "integrity": "sha512-XRCK/FU1akC2ZaJOdKIeZI6BLLgzWUuE0pegSrrkEva89GOan5mNkLVqCU4EMhCJ9nkG5TLWdMXrVX1fNAkFzw=="
+ },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -5485,6 +5500,19 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/rrule": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.2.tgz",
+ "integrity": "sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/rrule/node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
diff --git a/package.json b/package.json
index 0b10fedf..0688bf7d 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"dependencies": {
"@headlessui/react": "^1.7.2",
"@kubernetes/client-node": "^0.17.1",
+ "cal-parser": "^1.0.2",
"classnames": "^2.3.2",
"compare-versions": "^5.0.1",
"dockerode": "^3.3.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 335da832..2d272b31 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,9 @@ dependencies:
'@kubernetes/client-node':
specifier: ^0.17.1
version: 0.17.1
+ cal-parser:
+ specifier: ^1.0.2
+ version: 1.0.2
classnames:
specifier: ^2.3.2
version: 2.3.2
@@ -864,6 +867,13 @@ packages:
responselike: 3.0.0
dev: false
+ /cal-parser@1.0.2:
+ resolution: {integrity: sha512-wlQwcF0fl4eLclyGdncF9rcNNq0ipRYZGagG6h3LVgRXvCWE1fdMUaCLXwfC9YWoz9jKKbjQAq7TpO2Y3yrvmA==}
+ dependencies:
+ ical-date-parser: 4.0.0
+ rrule: 2.7.2
+ dev: false
+
/call-bind@1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
@@ -2232,6 +2242,10 @@ packages:
'@babel/runtime': 7.21.0
dev: false
+ /ical-date-parser@4.0.0:
+ resolution: {integrity: sha512-XRCK/FU1akC2ZaJOdKIeZI6BLLgzWUuE0pegSrrkEva89GOan5mNkLVqCU4EMhCJ9nkG5TLWdMXrVX1fNAkFzw==}
+ dev: false
+
/iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -3538,6 +3552,12 @@ packages:
dependencies:
glob: 7.2.3
+ /rrule@2.7.2:
+ resolution: {integrity: sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==}
+ dependencies:
+ tslib: 2.5.0
+ dev: false
+
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 3a3f88f1..cc78e7c6 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -765,6 +765,7 @@
"inCinemas": "In cinemas",
"physicalRelease": "Physical release",
"digitalRelease": "Digital release",
- "noEventsToday": "No events for today!"
+ "noEventsToday": "No events for today!",
+ "noEventsFound": "No events found"
}
}
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
index 25f84341..29c04da3 100644
--- a/src/pages/_app.jsx
+++ b/src/pages/_app.jsx
@@ -12,7 +12,6 @@ import { ColorProvider } from "utils/contexts/color";
import { ThemeProvider } from "utils/contexts/theme";
import { SettingsProvider } from "utils/contexts/settings";
import { TabProvider } from "utils/contexts/tab";
-import { EventProvider } from "utils/contexts/calendar";
function MyApp({ Component, pageProps }) {
return (
@@ -32,9 +31,7 @@ function MyApp({ Component, pageProps }) {