jblu

jblu / p90x3cal.py

Last active 6 months ago

Like 0

jblu revised this gist 1 year ago · ce3c0fc

2 files changed, 454 insertions, 1 deletion

p90x3.ics (file created)
@@ -0,0 +1,454 @@
1 + BEGIN:VCALENDAR
2 + VERSION:2.0
3 + PRODID:-//jonb.io//p90x3iCalgen 1.0//EN
4 + BEGIN:VEVENT
5 + SUMMARY:Total Synergistics
6 + DTSTART:20250616
7 + DTEND:20250616
8 + END:VEVENT
9 + BEGIN:VEVENT
10 + SUMMARY:Agility X
11 + DTSTART:20250617
12 + DTEND:20250617
13 + END:VEVENT
14 + BEGIN:VEVENT
15 + SUMMARY:X3 Yoga
16 + DTSTART:20250618
17 + DTEND:20250618
18 + END:VEVENT
19 + BEGIN:VEVENT
20 + SUMMARY:The Challenge
21 + DTSTART:20250619
22 + DTEND:20250619
23 + END:VEVENT
24 + BEGIN:VEVENT
25 + SUMMARY:CVX
26 + DTSTART:20250620
27 + DTEND:20250620
28 + END:VEVENT
29 + BEGIN:VEVENT
30 + SUMMARY:The Warrior
31 + DTSTART:20250621
32 + DTEND:20250621
33 + END:VEVENT
34 + BEGIN:VEVENT
35 + SUMMARY:Rest or Dynamix
36 + DTSTART:20250622
37 + DTEND:20250622
38 + END:VEVENT
39 + BEGIN:VEVENT
40 + SUMMARY:Total Synergistics
41 + DTSTART:20250623
42 + DTEND:20250623
43 + END:VEVENT
44 + BEGIN:VEVENT
45 + SUMMARY:Agility X
46 + DTSTART:20250624
47 + DTEND:20250624
48 + END:VEVENT
49 + BEGIN:VEVENT
50 + SUMMARY:X3 Yoga
51 + DTSTART:20250625
52 + DTEND:20250625
53 + END:VEVENT
54 + BEGIN:VEVENT
55 + SUMMARY:The Challenge
56 + DTSTART:20250626
57 + DTEND:20250626
58 + END:VEVENT
59 + BEGIN:VEVENT
60 + SUMMARY:CVX
61 + DTSTART:20250627
62 + DTEND:20250627
63 + END:VEVENT
64 + BEGIN:VEVENT
65 + SUMMARY:The Warrior
66 + DTSTART:20250628
67 + DTEND:20250628
68 + END:VEVENT
69 + BEGIN:VEVENT
70 + SUMMARY:Rest or Dynamix
71 + DTSTART:20250629
72 + DTEND:20250629
73 + END:VEVENT
74 + BEGIN:VEVENT
75 + SUMMARY:Total Synergistics
76 + DTSTART:20250630
77 + DTEND:20250630
78 + END:VEVENT
79 + BEGIN:VEVENT
80 + SUMMARY:Agility X
81 + DTSTART:20250701
82 + DTEND:20250701
83 + END:VEVENT
84 + BEGIN:VEVENT
85 + SUMMARY:X3 Yoga
86 + DTSTART:20250702
87 + DTEND:20250702
88 + END:VEVENT
89 + BEGIN:VEVENT
90 + SUMMARY:The Challenge
91 + DTSTART:20250703
92 + DTEND:20250703
93 + END:VEVENT
94 + BEGIN:VEVENT
95 + SUMMARY:CVX
96 + DTSTART:20250704
97 + DTEND:20250704
98 + END:VEVENT
99 + BEGIN:VEVENT
100 + SUMMARY:The Warrior
101 + DTSTART:20250705
102 + DTEND:20250705
103 + END:VEVENT
104 + BEGIN:VEVENT
105 + SUMMARY:Rest or Dynamix
106 + DTSTART:20250706
107 + DTEND:20250706
108 + END:VEVENT
109 + BEGIN:VEVENT
110 + SUMMARY:Isometrics
111 + DTSTART:20250707
112 + DTEND:20250707
113 + END:VEVENT
114 + BEGIN:VEVENT
115 + SUMMARY:Dynamix
116 + DTSTART:20250708
117 + DTEND:20250708
118 + END:VEVENT
119 + BEGIN:VEVENT
120 + SUMMARY:Accelerator
121 + DTSTART:20250709
122 + DTEND:20250709
123 + END:VEVENT
124 + BEGIN:VEVENT
125 + SUMMARY:Pilates X
126 + DTSTART:20250710
127 + DTEND:20250710
128 + END:VEVENT
129 + BEGIN:VEVENT
130 + SUMMARY:CVX
131 + DTSTART:20250711
132 + DTEND:20250711
133 + END:VEVENT
134 + BEGIN:VEVENT
135 + SUMMARY:X3 Yoga
136 + DTSTART:20250712
137 + DTEND:20250712
138 + END:VEVENT
139 + BEGIN:VEVENT
140 + SUMMARY:Rest or Dynamix
141 + DTSTART:20250713
142 + DTEND:20250713
143 + END:VEVENT
144 + BEGIN:VEVENT
145 + SUMMARY:Eccentric Upper
146 + DTSTART:20250714
147 + DTEND:20250714
148 + END:VEVENT
149 + BEGIN:VEVENT
150 + SUMMARY:Triometrics
151 + DTSTART:20250715
152 + DTEND:20250715
153 + END:VEVENT
154 + BEGIN:VEVENT
155 + SUMMARY:X3 Yoga
156 + DTSTART:20250716
157 + DTEND:20250716
158 + END:VEVENT
159 + BEGIN:VEVENT
160 + SUMMARY:Eccentric Lower
161 + DTSTART:20250717
162 + DTEND:20250717
163 + END:VEVENT
164 + BEGIN:VEVENT
165 + SUMMARY:Incinerator
166 + DTSTART:20250718
167 + DTEND:20250718
168 + END:VEVENT
169 + BEGIN:VEVENT
170 + SUMMARY:MMX
171 + DTSTART:20250719
172 + DTEND:20250719
173 + END:VEVENT
174 + BEGIN:VEVENT
175 + SUMMARY:Rest or Dynamix
176 + DTSTART:20250720
177 + DTEND:20250720
178 + END:VEVENT
179 + BEGIN:VEVENT
180 + SUMMARY:Eccentric Upper
181 + DTSTART:20250721
182 + DTEND:20250721
183 + END:VEVENT
184 + BEGIN:VEVENT
185 + SUMMARY:Triometrics
186 + DTSTART:20250722
187 + DTEND:20250722
188 + END:VEVENT
189 + BEGIN:VEVENT
190 + SUMMARY:X3 Yoga
191 + DTSTART:20250723
192 + DTEND:20250723
193 + END:VEVENT
194 + BEGIN:VEVENT
195 + SUMMARY:Eccentric Lower
196 + DTSTART:20250724
197 + DTEND:20250724
198 + END:VEVENT
199 + BEGIN:VEVENT
200 + SUMMARY:Incinerator
201 + DTSTART:20250725
202 + DTEND:20250725
203 + END:VEVENT
204 + BEGIN:VEVENT
205 + SUMMARY:MMX
206 + DTSTART:20250726
207 + DTEND:20250726
208 + END:VEVENT
209 + BEGIN:VEVENT
210 + SUMMARY:Rest or Dynamix
211 + DTSTART:20250727
212 + DTEND:20250727
213 + END:VEVENT
214 + BEGIN:VEVENT
215 + SUMMARY:Eccentric Upper
216 + DTSTART:20250728
217 + DTEND:20250728
218 + END:VEVENT
219 + BEGIN:VEVENT
220 + SUMMARY:Triometrics
221 + DTSTART:20250729
222 + DTEND:20250729
223 + END:VEVENT
224 + BEGIN:VEVENT
225 + SUMMARY:X3 Yoga
226 + DTSTART:20250730
227 + DTEND:20250730
228 + END:VEVENT
229 + BEGIN:VEVENT
230 + SUMMARY:Eccentric Lower
231 + DTSTART:20250731
232 + DTEND:20250731
233 + END:VEVENT
234 + BEGIN:VEVENT
235 + SUMMARY:Incinerator
236 + DTSTART:20250801
237 + DTEND:20250801
238 + END:VEVENT
239 + BEGIN:VEVENT
240 + SUMMARY:MMX
241 + DTSTART:20250802
242 + DTEND:20250802
243 + END:VEVENT
244 + BEGIN:VEVENT
245 + SUMMARY:Rest or Dynamix
246 + DTSTART:20250803
247 + DTEND:20250803
248 + END:VEVENT
249 + BEGIN:VEVENT
250 + SUMMARY:Isometrics
251 + DTSTART:20250804
252 + DTEND:20250804
253 + END:VEVENT
254 + BEGIN:VEVENT
255 + SUMMARY:Dynamix
256 + DTSTART:20250805
257 + DTEND:20250805
258 + END:VEVENT
259 + BEGIN:VEVENT
260 + SUMMARY:Accelerator
261 + DTSTART:20250806
262 + DTEND:20250806
263 + END:VEVENT
264 + BEGIN:VEVENT
265 + SUMMARY:Pilates X
266 + DTSTART:20250807
267 + DTEND:20250807
268 + END:VEVENT
269 + BEGIN:VEVENT
270 + SUMMARY:CVX
271 + DTSTART:20250808
272 + DTEND:20250808
273 + END:VEVENT
274 + BEGIN:VEVENT
275 + SUMMARY:X3 Yoga
276 + DTSTART:20250809
277 + DTEND:20250809
278 + END:VEVENT
279 + BEGIN:VEVENT
280 + SUMMARY:Rest or Dynamix
281 + DTSTART:20250810
282 + DTEND:20250810
283 + END:VEVENT
284 + BEGIN:VEVENT
285 + SUMMARY:Decelerator
286 + DTSTART:20250811
287 + DTEND:20250811
288 + END:VEVENT
289 + BEGIN:VEVENT
290 + SUMMARY:Agility X
291 + DTSTART:20250812
292 + DTEND:20250812
293 + END:VEVENT
294 + BEGIN:VEVENT
295 + SUMMARY:The Challenge
296 + DTSTART:20250813
297 + DTEND:20250813
298 + END:VEVENT
299 + BEGIN:VEVENT
300 + SUMMARY:X3 Yoga
301 + DTSTART:20250814
302 + DTEND:20250814
303 + END:VEVENT
304 + BEGIN:VEVENT
305 + SUMMARY:Triometrics
306 + DTSTART:20250815
307 + DTEND:20250815
308 + END:VEVENT
309 + BEGIN:VEVENT
310 + SUMMARY:Total Synergistics
311 + DTSTART:20250816
312 + DTEND:20250816
313 + END:VEVENT
314 + BEGIN:VEVENT
315 + SUMMARY:Rest or Dynamix
316 + DTSTART:20250817
317 + DTEND:20250817
318 + END:VEVENT
319 + BEGIN:VEVENT
320 + SUMMARY:Decelerator
321 + DTSTART:20250818
322 + DTEND:20250818
323 + END:VEVENT
324 + BEGIN:VEVENT
325 + SUMMARY:MMX
326 + DTSTART:20250819
327 + DTEND:20250819
328 + END:VEVENT
329 + BEGIN:VEVENT
330 + SUMMARY:Eccentric Upper
331 + DTSTART:20250820
332 + DTEND:20250820
333 + END:VEVENT
334 + BEGIN:VEVENT
335 + SUMMARY:Triometrics
336 + DTSTART:20250821
337 + DTEND:20250821
338 + END:VEVENT
339 + BEGIN:VEVENT
340 + SUMMARY:Pilates X
341 + DTSTART:20250822
342 + DTEND:20250822
343 + END:VEVENT
344 + BEGIN:VEVENT
345 + SUMMARY:Eccentric Lower
346 + DTSTART:20250823
347 + DTEND:20250823
348 + END:VEVENT
349 + BEGIN:VEVENT
350 + SUMMARY:Rest or Dynamix
351 + DTSTART:20250824
352 + DTEND:20250824
353 + END:VEVENT
354 + BEGIN:VEVENT
355 + SUMMARY:Decelerator
356 + DTSTART:20250825
357 + DTEND:20250825
358 + END:VEVENT
359 + BEGIN:VEVENT
360 + SUMMARY:Agility X
361 + DTSTART:20250826
362 + DTEND:20250826
363 + END:VEVENT
364 + BEGIN:VEVENT
365 + SUMMARY:The Challenge
366 + DTSTART:20250827
367 + DTEND:20250827
368 + END:VEVENT
369 + BEGIN:VEVENT
370 + SUMMARY:X3 Yoga
371 + DTSTART:20250828
372 + DTEND:20250828
373 + END:VEVENT
374 + BEGIN:VEVENT
375 + SUMMARY:Triometrics
376 + DTSTART:20250829
377 + DTEND:20250829
378 + END:VEVENT
379 + BEGIN:VEVENT
380 + SUMMARY:Total Synergistics
381 + DTSTART:20250830
382 + DTEND:20250830
383 + END:VEVENT
384 + BEGIN:VEVENT
385 + SUMMARY:Rest or Dynamix
386 + DTSTART:20250831
387 + DTEND:20250831
388 + END:VEVENT
389 + BEGIN:VEVENT
390 + SUMMARY:Decelerator
391 + DTSTART:20250901
392 + DTEND:20250901
393 + END:VEVENT
394 + BEGIN:VEVENT
395 + SUMMARY:MMX
396 + DTSTART:20250902
397 + DTEND:20250902
398 + END:VEVENT
399 + BEGIN:VEVENT
400 + SUMMARY:Eccentric Upper
401 + DTSTART:20250903
402 + DTEND:20250903
403 + END:VEVENT
404 + BEGIN:VEVENT
405 + SUMMARY:Triometrics
406 + DTSTART:20250904
407 + DTEND:20250904
408 + END:VEVENT
409 + BEGIN:VEVENT
410 + SUMMARY:Pilates X
411 + DTSTART:20250905
412 + DTEND:20250905
413 + END:VEVENT
414 + BEGIN:VEVENT
415 + SUMMARY:Eccentric Lower
416 + DTSTART:20250906
417 + DTEND:20250906
418 + END:VEVENT
419 + BEGIN:VEVENT
420 + SUMMARY:Rest or Dynamix
421 + DTSTART:20250907
422 + DTEND:20250907
423 + END:VEVENT
424 + BEGIN:VEVENT
425 + SUMMARY:Isometrics
426 + DTSTART:20250908
427 + DTEND:20250908
428 + END:VEVENT
429 + BEGIN:VEVENT
430 + SUMMARY:Accelerator
431 + DTSTART:20250909
432 + DTEND:20250909
433 + END:VEVENT
434 + BEGIN:VEVENT
435 + SUMMARY:Pilates X
436 + DTSTART:20250910
437 + DTEND:20250910
438 + END:VEVENT
439 + BEGIN:VEVENT
440 + SUMMARY:X3 Yoga
441 + DTSTART:20250911
442 + DTEND:20250911
443 + END:VEVENT
444 + BEGIN:VEVENT
445 + SUMMARY:Dynamix
446 + DTSTART:20250912
447 + DTEND:20250912
448 + END:VEVENT
449 + BEGIN:VEVENT
450 + SUMMARY:Rest or Dynamix
451 + DTSTART:20250913
452 + DTEND:20250913
453 + END:VEVENT
454 + END:VCALENDAR
p90x3cal.py
@@ -95,7 +95,6 @@ for workout in schedule:
95 95 formattedDate = date.strftime("%Y%m%d")
96 96 print(f'DTSTART:{formattedDate}')
97 97 print(f'DTEND:{formattedDate}')
98 - print(f'DTSTAMP:')
99 98 print("END:VEVENT")
100 99
101 100 date = date + datetime.timedelta(days=1)

jblu revised this gist 1 year ago · 6429fc0

1 file changed, 1 insertion, 1 deletion

p90x3cal.py
@@ -4,7 +4,7 @@ def date(s):
4 4 try:
5 5 return datetime.datetime.strptime(s, "%Y-%m-%d")
6 6 except ValueError:
7 - raise argparse.ArgumentTypeError("Not a valid date: '{0}'. Date must be in format 'YYYY-MM-DD'".format(s))
7 + raise argparse.ArgumentTypeError(f"Not a valid date: '{s}'. Date must be in format 'YYYY-MM-DD'")
8 8
9 9 parser = argparse.ArgumentParser(description='Generate a P90X3 schedule in iCalendar format.')
10 10 parser.add_argument('--start', type=date, default=datetime.date.today(), help='start date (YYYY-MM-DD) (default: today)')

jblu revised this gist 1 year ago · fc37e2c

1 file changed, 103 insertions

p90x3cal.py (file created)
@@ -0,0 +1,103 @@
1 + import argparse, datetime
2 +
3 + def date(s):
4 + try:
5 + return datetime.datetime.strptime(s, "%Y-%m-%d")
6 + except ValueError:
7 + raise argparse.ArgumentTypeError("Not a valid date: '{0}'. Date must be in format 'YYYY-MM-DD'".format(s))
8 +
9 + parser = argparse.ArgumentParser(description='Generate a P90X3 schedule in iCalendar format.')
10 + parser.add_argument('--start', type=date, default=datetime.date.today(), help='start date (YYYY-MM-DD) (default: today)')
11 + parser.add_argument('--variant', choices=["classic", "lean", "mass"], default="classic", help="calendar variant (default: classic)")
12 + parser.add_argument('--prefix', type=str, default='', help="prefix to add to all event names")
13 + parser.add_argument('--suffix', type=str, default='', help="suffix to add to all event names")
14 + args = parser.parse_args()
15 +
16 + TOTAL = "Total Synergistics"
17 + CVX = "CVX"
18 + AGILITY = "Agility X"
19 + TRIO = "Triometrics"
20 + CHALLENGE = "The Challenge"
21 + INCINERATOR = "Incinerator"
22 + WARRIOR = "The Warrior"
23 + MMX = "MMX"
24 + YOGA = "X3 Yoga"
25 + PILATES = "Pilates X"
26 + ISOMETRICS = "Isometrics"
27 + DYNAMIX = "Dynamix"
28 + ACCELERATOR = "Accelerator"
29 + DECELERATOR = "Decelerator"
30 + UPPER = "Eccentric Upper"
31 + LOWER = "Eccentric Lower"
32 + REST = "Rest or Dynamix"
33 +
34 + SCHEDULES = {
35 + "classic": [
36 + TOTAL, AGILITY, YOGA, CHALLENGE, CVX, WARRIOR, REST,
37 + TOTAL, AGILITY, YOGA, CHALLENGE, CVX, WARRIOR, REST,
38 + TOTAL, AGILITY, YOGA, CHALLENGE, CVX, WARRIOR, REST,
39 + ISOMETRICS, DYNAMIX, ACCELERATOR, PILATES, CVX, YOGA, REST,
40 + UPPER, TRIO, YOGA, LOWER, INCINERATOR, MMX, REST,
41 + UPPER, TRIO, YOGA, LOWER, INCINERATOR, MMX, REST,
42 + UPPER, TRIO, YOGA, LOWER, INCINERATOR, MMX, REST,
43 + ISOMETRICS, DYNAMIX, ACCELERATOR, PILATES, CVX, YOGA, REST,
44 + DECELERATOR, AGILITY, CHALLENGE, YOGA, TRIO, TOTAL, REST,
45 + DECELERATOR, MMX, UPPER, TRIO, PILATES, LOWER, REST,
46 + DECELERATOR, AGILITY, CHALLENGE, YOGA, TRIO, TOTAL, REST,
47 + DECELERATOR, MMX, UPPER, TRIO, PILATES, LOWER, REST,
48 + ISOMETRICS, ACCELERATOR, PILATES, YOGA, DYNAMIX, REST,
49 + ],
50 + "lean": [
51 + ACCELERATOR, WARRIOR, YOGA, CVX, ISOMETRICS, AGILITY, REST,
52 + ACCELERATOR, WARRIOR, YOGA, CVX, ISOMETRICS, AGILITY, REST,
53 + ACCELERATOR, WARRIOR, YOGA, CVX, ISOMETRICS, AGILITY, REST,
54 + ISOMETRICS, DYNAMIX, ACCELERATOR, PILATES, AGILITY, YOGA, REST,
55 + TRIO, WARRIOR, YOGA, MMX, INCINERATOR, CVX, REST,
56 + TRIO, WARRIOR, YOGA, MMX, INCINERATOR, CVX, REST,
57 + TRIO, WARRIOR, YOGA, MMX, INCINERATOR, CVX, REST,
58 + ISOMETRICS, DYNAMIX, ACCELERATOR, PILATES, DECELERATOR, YOGA, REST,
59 + DECELERATOR, MMX, LOWER, YOGA, TRIO, UPPER, REST,
60 + MMX, DECELERATOR, TRIO, PILATES, DECELERATOR, CVX, REST,
61 + DECELERATOR, MMX, LOWER, YOGA, TRIO, UPPER, REST,
62 + MMX, DECELERATOR, TRIO, PILATES, DECELERATOR, CVX, REST,
63 + ISOMETRICS, ACCELERATOR, PILATES, YOGA, DYNAMIX, REST,
64 + ],
65 + "mass": [
66 + TOTAL, AGILITY, YOGA, CHALLENGE, PILATES, INCINERATOR, REST,
67 + TOTAL, AGILITY, YOGA, CHALLENGE, PILATES, INCINERATOR, REST,
68 + TOTAL, AGILITY, YOGA, CHALLENGE, PILATES, INCINERATOR, REST,
69 + ISOMETRICS, DYNAMIX, WARRIOR, PILATES, AGILITY, YOGA, REST,
70 + UPPER, LOWER, YOGA, UPPER, LOWER, MMX, REST,
71 + UPPER, LOWER, YOGA, UPPER, LOWER, MMX, REST,
72 + UPPER, LOWER, YOGA, UPPER, LOWER, MMX, REST,
73 + ISOMETRICS, DYNAMIX, WARRIOR, PILATES, DECELERATOR, YOGA, REST,
74 + UPPER, LOWER, YOGA, UPPER, LOWER, MMX, REST,
75 + TOTAL, AGILITY, YOGA, CHALLENGE, PILATES, INCINERATOR, REST,
76 + UPPER, LOWER, YOGA, UPPER, LOWER, MMX, REST,
77 + TOTAL, AGILITY, YOGA, CHALLENGE, PILATES, INCINERATOR, REST,
78 + ISOMETRICS, YOGA, DECELERATOR, UPPER, LOWER, REST,
79 + ]
80 + }
81 +
82 + prefix = '' if args.prefix == '' else args.prefix + ' '
83 + suffix = '' if args.suffix == '' else ' ' + args.suffix
84 +
85 + print("BEGIN:VCALENDAR")
86 + print("VERSION:2.0")
87 + print("PRODID:-//jonb.io//p90x3iCalgen 1.0//EN")
88 + schedule = SCHEDULES[args.variant]
89 + date = args.start
90 +
91 + for workout in schedule:
92 + print("BEGIN:VEVENT")
93 + print(f'SUMMARY:{prefix}{workout}{suffix}')
94 +
95 + formattedDate = date.strftime("%Y%m%d")
96 + print(f'DTSTART:{formattedDate}')
97 + print(f'DTEND:{formattedDate}')
98 + print(f'DTSTAMP:')
99 + print("END:VEVENT")
100 +
101 + date = date + datetime.timedelta(days=1)
102 +
103 + print("END:VCALENDAR")