| 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 |
jblu / p90x3cal.py
Last active 6 months ago
| 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(f"Not a valid date: '{s}'. Date must be in format 'YYYY-MM-DD'") |
| 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("END:VEVENT") |
| 99 | |
| 100 | date = date + datetime.timedelta(days=1) |
| 101 | |
| 102 | print("END:VCALENDAR") |