1
+ import datetime
1
2
import os
2
- import requests
3
- import time
4
- import icalendar
5
3
6
- from datetime import datetime
7
- from flask import Flask , request , abort
4
+ import icalendar
5
+ import requests
6
+ from cachetools import TTLCache , cached
7
+ from flask import Flask , abort , request
8
8
from flask_cors import CORS
9
9
from requests_file import FileAdapter
10
- from cachetools import TTLCache , cached
11
10
12
11
CACHE_TTL = os .environ .get ("CACHE_TTL" , 1800 )
13
12
@@ -43,7 +42,7 @@ def annotations():
43
42
44
43
ical_url = request .headers .get (
45
44
"X-ICAL-URL" ,
46
- f"file://{ os .path .dirname (os .path .realpath (__file__ ))} /fixtures/something .ics" ,
45
+ f"file://{ os .path .dirname (os .path .realpath (__file__ ))} /fixtures/calendar .ics" ,
47
46
)
48
47
49
48
if "X-TAGS" in request .headers :
@@ -75,6 +74,12 @@ def _ical_annotations(url: str, tags: str):
75
74
return ical_as_annotations
76
75
77
76
77
+ def _millis_timestamp (dt : datetime .datetime ):
78
+ if isinstance (dt , datetime .date ):
79
+ dt = datetime .datetime (dt .year , dt .month , dt .day , tzinfo = datetime .timezone .utc )
80
+ return int (dt .timestamp () * 1000 )
81
+
82
+
78
83
def _fetch_ical_data (url : str ):
79
84
s = requests .Session ()
80
85
s .mount ("file://" , FileAdapter ())
@@ -97,31 +102,29 @@ def _convert_ical_to_annotations(ical_data, tags):
97
102
for component in ical_calendar .walk ():
98
103
if component .name == "VEVENT" :
99
104
try :
105
+ start_time = component .get ("dtstart" ).dt
106
+
107
+ end_time = component .get ("dtstart" ).dt
108
+ if "dtend" in component :
109
+ end_time = component .get ("dtend" ).dt
110
+
100
111
ical_annotation = {
101
- "time" : int (
102
- time .mktime (component .get ("dtstart" ).dt .timetuple ()) * 1000
103
- ),
112
+ "time" : _millis_timestamp (start_time ),
113
+ "timeEnd" : _millis_timestamp (end_time ),
104
114
"title" : component .get ("summary" ),
105
115
"tags" : tags ,
106
116
"text" : component .get ("description" , "" ),
107
117
"uid" : component .get ("uid" ),
108
118
}
109
119
110
- try :
111
- ical_annotation ["timeEnd" ] = int (
112
- time .mktime (component .get ("dtend" ).dt .timetuple ()) * 1000
113
- )
114
- except AttributeError :
115
- pass
116
-
117
120
ical_annotations .append (ical_annotation )
118
121
119
- except AttributeError :
122
+ except AttributeError as e :
120
123
print (
121
- f'level=ERROR msg="decoding event failed" event_summary="{ component .get ("summary" )} " event_dtstart="{ component .get ("dtstart" )} " event_dtstamp="{ component .get ("dtstamp" )} " event_dtend="{ component .get ("dtend" )} "'
124
+ f'level=ERROR { e } msg="decoding event failed" event_summary="{ component .get ("summary" )} " event_dtstart="{ component .get ("dtstart" )} " event_dtstamp="{ component .get ("dtstamp" )} " event_dtend="{ component .get ("dtend" )} "'
122
125
)
123
126
return ical_annotations
124
127
125
128
126
129
if __name__ == "__main__" :
127
- app .run (host = "0.0.0.0" , port = 5000 )
130
+ app .run (host = "0.0.0.0" , port = 5000 , debug = True )
0 commit comments