diff options
author | Gregor Kleen <gkleen@yggdrasil.li> | 2025-08-20 12:22:43 +0200 |
---|---|---|
committer | Gregor Kleen <gkleen@yggdrasil.li> | 2025-08-20 12:22:43 +0200 |
commit | 6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf (patch) | |
tree | 9ce5c10a944890925261579dadc9e9ca7de2545e | |
parent | 1220da3f4e70f5cc6760536afb3059364c52f6a1 (diff) | |
download | nixos-6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf.tar nixos-6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf.tar.gz nixos-6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf.tar.bz2 nixos-6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf.tar.xz nixos-6f5dadf4c1c36d7ff26f1d1533d08399ccee79bf.zip |
...
-rw-r--r-- | hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml | 6 | ||||
-rwxr-xr-x | overlays/worktime/worktime/__main__.py | 57 |
2 files changed, 33 insertions, 30 deletions
diff --git a/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml b/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml index a5319e38..42920069 100644 --- a/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml +++ b/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml | |||
@@ -1,5 +1,5 @@ | |||
1 | { | 1 | { |
2 | "data": "ENC[AES256_GCM,data:60OmHwuLC7RJVNNn8lsCFjIFrtDlmmT3yAm3DYn/K2b8OJB/lzKBhMUCyPpoI2lfMm6y47/DMwXI3ExH3QwfgGRf4i/Tcv7p6FCkjFgDc0RhAM7cXNSnh1gKTff8QYtPoNIzmycFCThNr7iZsPsf2/1npVaVHTnt9nTc+cmDLc+lELlvjSE00JOXch/if7KPwFww9K83XlrFmoRvwybfXR0unJqxK2XLvj+dQuKD4Bhyb88iSgu4dX1yw2uBSZBD16S4Io0DaZ+as5Yw4Kon7WMj3Jd5kz8ZxK+0NCy1CVJHOfJIwgYl0SVPp4DpbAPtJO4R/ciXyDQ/XGpoLtHjxnKXaJlJoSiA7FhuSEk+jB/peLHrYV1obdIRE5Dstly01S5cydKlfQ+A0TSjxFSWBYMEiD89sD09Br3iSJX5FejOoS8d2IQJ5faVzgQl4T5aBKsxCNNwmYrEe8m9HN7o2eer8nTKMln5IxZi3ZWhnjgJfrJ4QTXFndxCb78jo8HroN3+7VhoM136UZkqH1OMrIgAH/XSlW08G8m9MRamKsAWklq9aVflcEsPWTHmYW7rjAapQYf+jyK6BbfHcYmyKM82TFZ5iNB60Pth6EJgb2V8PZiChGvDzQvFYYOO3p9a/J8bVqsnPZBXXYcIBt42ZuRPvyyUTfM+75V1eYE9ZGFML+QlofwNCAg+/Rnl+RRy4z+8xQxd8Dn06geDpHsr4yND72FRUTKLbjxF5xfbzBRcZEXjGkyFdEAF7rB78I8xIqii+n6Yt8uEURmd4geI9KWXRQnwofTz9pklaAnRbER8zy/BJIiIYy8zecUHJn9v/DPnsnksfL6RRmG4tHaRBDbpAag0kVkCrpO/flK6dZOl/wvoVVVqT2O69a9/RpHLSV2f//ZS6L9s6vaYe4pXL0M6QymgA22sNHaws6XggJlTxVOFGRejMGYrKqVWtC+2UNbnel+/J0N1qj4luWfQaf9+1j+fq7vyLSzXYFCiyOLAznpqOhzKu6VWy2IbR0UnCoL5ZbhIba9e2MXM7Czy9Yee4xc=,iv:M0GbtFFl1XUeq+y9H+MiD+9z/ASB9hsd06KhpPzSwEo=,tag:vTLIIf+CeZN6DU25CSP8tw==,type:str]", | 2 | "data": "ENC[AES256_GCM,data:7STcG1J3zLHzlHi2LZgSa+pmKlYU6X1eLvjXcx7gvCuHFkXwa/ldrHdzaBXAMrQ+C+DWM4+cyhdal3ypxXueBuBEvH3P7/KofPP2A519sdZo1vDkXCzYRD3Ow74M+hX5ej6hL1mv21HayrRMPnYfH8HUWk1kd/y69EjpjvDHyCpQuw1WG5M4FDUaTd4Vh51QRCSG/Is29dEkvQowhIvNqnAR4KW9PpfjlbUPHauZ6PQLnlJmI9QCcAGJ8hHtp5T+xctTym82GAlXugTJpHnkqcxnGteu9H7UuiDMQ3aKKGYzZCpWkNHrbD1IRhzPzSjVlN2nIX3Ydp8ENNf61EGOrp5hzmV0MhwRHKfz5rE1FRVuyHcwhwBdJzfhzrL9zXZYzn9Zuf9KWwsF+1+58i9u9hPym63r4c1+RbMjNKzHc1/yhhsRDCrTwvMd/Hc6KfUi3H1wW/r02Va2bOCkYrOkWIQpBdx4ThMgkTaHr94DBMqT8n3Fzhc7+uaUsl6I9gMwTn8QCV3g4U7Mp3+/gnQLOdsCTgKr69x1iPfp7jzzbC29MWhIk+2aig+iWRMVT0n4AWIxooc3cYnfOJNtCdJwKuPUl4xNlZ22NK3XQfxBURSw0pi5KyDO1wgTVRoRJMnXZyin3bZ10OU8QKBqLp22FXpG/+mHrm3Y6yLkqfIP5ry+b86Rb7nWJlxDTwTGSoGi8sJzwNb+H9ioG7LjaSmvr7V+2aSq0+72WopAkIFSBq/yIWX3J/rNZuia6jKMY/8bSLDJz3V/YuzeUJ5feUkOS4KW1J1UkaYd6XxZ9Y8szCS/B7Ocz0YiV8fHmOzZKRn8BTmmXUIoyxO07MmwQ1shYfiVCwXjdjq2f3/CZbXNVOPvhGBYOcutUztftu3H9DRDTKrVae1TnztCVSkBSk1o52uSj0r8t6f4l1r7UG1TviOnVLVh1/6iiJVQey0m8G6ugw22zxfhI0Uea/rB70i+2UuoxrmsOfg+TgnvKBuakEBifp4rx0S5wyz05RYXkBLJTIwi2fVGmulqjZuCQNQnI3cfPI+oGcykob9IQqdo/Dwd118hNPVAwdDHyaiGXGh8eu8N2OCLQxlGZDtkVUveaEasJaZ0WWWaK97FUeoNJfUnB7Y3lNjv5u2rzviZyk4=,iv:jT21FNnHod6btDlBa3UflK3au5VmcsABs5OTMXF6oFA=,tag:Oh8cOL+edT5Wp0I1L5+vwg==,type:str]", |
3 | "sops": { | 3 | "sops": { |
4 | "age": [ | 4 | "age": [ |
5 | { | 5 | { |
@@ -11,8 +11,8 @@ | |||
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiRWFqSHNlY1IvMkkwaEto\ncHZHa2p1Y25SakFkS2JYMlRFcFhnZGY1dVRFCkxSWmxvcHZMampQKzdKRHI0ZVMx\nUTFtR0pHbzFaQ0xQUFA2ZERDSWpwS0UKLS0tIFBaSGczY3VWdy9TKzRDZWZ2SElY\nbVQ4dDNhQllmVmViWGs5c3V4TmNscjQKeugevQJFAN/8JrzeAm4hm2JsQGb26BCb\n3dKYnN1kJU7oVHr1aVfXwMpELNYt9poX6WTY2h9lsdHuRlqoFXAA5Q==\n-----END AGE ENCRYPTED FILE-----\n" | 11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiRWFqSHNlY1IvMkkwaEto\ncHZHa2p1Y25SakFkS2JYMlRFcFhnZGY1dVRFCkxSWmxvcHZMampQKzdKRHI0ZVMx\nUTFtR0pHbzFaQ0xQUFA2ZERDSWpwS0UKLS0tIFBaSGczY3VWdy9TKzRDZWZ2SElY\nbVQ4dDNhQllmVmViWGs5c3V4TmNscjQKeugevQJFAN/8JrzeAm4hm2JsQGb26BCb\n3dKYnN1kJU7oVHr1aVfXwMpELNYt9poX6WTY2h9lsdHuRlqoFXAA5Q==\n-----END AGE ENCRYPTED FILE-----\n" |
12 | } | 12 | } |
13 | ], | 13 | ], |
14 | "lastmodified": "2025-05-10T10:25:15Z", | 14 | "lastmodified": "2025-08-11T07:08:36Z", |
15 | "mac": "ENC[AES256_GCM,data:dhj7e+vF3uiR6I22PR5tdNdM8EyrWmGGTIqjj8H7IdNIsZBHzjeHlBDFOwN7z/JMO0BVwIi4DmhApg2BSPGsQZGDQZ28UTCC8TDtd1zmfGtSP8R8AFHADYdLK/desMtHg6BZTnLv5tpba34WWdflMNOQpwgWPZsIk/DkLaoXdvk=,iv:qkoAZngTz2sfWdxDs+h8Mb2IrkF8gqnQoR5iRoeKjbY=,tag:zXrkBJmPM4ItJxMnX8IDxQ==,type:str]", | 15 | "mac": "ENC[AES256_GCM,data:ZL/dOz+NC8sr8vPBsux+gFOWxUhQqMSmG1az7udhB0ckmOXtnrPBzMM1gs+5pwXLvfLux0m4xzT87+o87axIECnCq35FSuMjtEBK24OUJXsLG/q/tDv5dfRBy/976dM5W7YkBVX/uc03p8CLKf5w4XYNeRKnSwjLvWGd9runDOU=,iv:9ZIeJ5aDVVPHi3/oHqWkWtEfeivV/nFFyQ1lJWJwMu8=,tag:TfkHaopMa+Z0zk38A6/NTA==,type:str]", |
16 | "unencrypted_suffix": "_unencrypted", | 16 | "unencrypted_suffix": "_unencrypted", |
17 | "version": "3.10.2" | 17 | "version": "3.10.2" |
18 | } | 18 | } |
diff --git a/overlays/worktime/worktime/__main__.py b/overlays/worktime/worktime/__main__.py index bf24bbec..6ce1331a 100755 --- a/overlays/worktime/worktime/__main__.py +++ b/overlays/worktime/worktime/__main__.py | |||
@@ -393,9 +393,29 @@ class Worktime(object): | |||
393 | start_day = self.start_date.date() | 393 | start_day = self.start_date.date() |
394 | end_day = self.end_date.date() | 394 | end_day = self.end_date.date() |
395 | 395 | ||
396 | self.extra_days_to_work = dict() | ||
397 | |||
396 | try: | 398 | try: |
397 | with open(Path(config_dir) / "pull-forward", 'r') as excused: | 399 | with open(Path(config_dir) / "days-to-work", 'r') as extra_days_to_work_file: |
398 | for line in excused: | 400 | for line in extra_days_to_work_file: |
401 | stripped_line = line.strip() | ||
402 | if stripped_line: | ||
403 | splitLine = stripped_line.split(' ') | ||
404 | if len(splitLine) == 2: | ||
405 | [hours, datestr] = splitLine | ||
406 | day = datetime.strptime(datestr, date_format).replace(tzinfo=tzlocal()).date() | ||
407 | self.extra_days_to_work[day] = timedelta(hours = float(hours)) | ||
408 | else: | ||
409 | day = datetime.strptime(stripped_line, date_format).replace(tzinfo=tzlocal()).date() | ||
410 | self.extra_days_to_work[day] = self.time_per_day(day) | ||
411 | except IOError as e: | ||
412 | if e.errno != 2: | ||
413 | raise e | ||
414 | |||
415 | |||
416 | try: | ||
417 | with open(Path(config_dir) / "pull-forward", 'r') as pull_forward: | ||
418 | for line in pull_forward: | ||
399 | stripped_line = line.strip() | 419 | stripped_line = line.strip() |
400 | if stripped_line: | 420 | if stripped_line: |
401 | [hours, datestr] = stripped_line.split(' ') | 421 | [hours, datestr] = stripped_line.split(' ') |
@@ -416,15 +436,18 @@ class Worktime(object): | |||
416 | if not d == datetime.strptime(c, date_format).replace(tzinfo=tzlocal()).date(): break | 436 | if not d == datetime.strptime(c, date_format).replace(tzinfo=tzlocal()).date(): break |
417 | else: | 437 | else: |
418 | if d >= self.end_date.date(): | 438 | if d >= self.end_date.date(): |
419 | self.pull_forward[d] = min(timedelta(hours = float(hours)), self.time_per_day(d) - (holidays[d] if d in holidays else timedelta())) | 439 | time_for_day = self.time_per_day(d) if d.isoweekday() in self.workdays else timedelta() |
440 | if d in self.extra_days_to_work: | ||
441 | time_for_day += self.extra_days_to_work[d] | ||
442 | self.pull_forward[d] = min(timedelta(hours = float(hours)), time_for_day) | ||
420 | except IOError as e: | 443 | except IOError as e: |
421 | if e.errno != 2: | 444 | if e.errno != 2: |
422 | raise e | 445 | raise e |
423 | 446 | ||
424 | self.days_to_work = dict() | 447 | self.days_to_work = dict() |
425 | 448 | ||
426 | if self.pull_forward: | 449 | # if self.pull_forward: |
427 | end_day = max(end_day, max(list(self.pull_forward))) | 450 | # end_day = max(end_day, max(self.pull_forward.keys())) |
428 | 451 | ||
429 | for day in [start_day + timedelta(days = x) for x in range(0, (end_day - start_day).days + 1)]: | 452 | for day in [start_day + timedelta(days = x) for x in range(0, (end_day - start_day).days + 1)]: |
430 | if day.isoweekday() in self.workdays: | 453 | if day.isoweekday() in self.workdays: |
@@ -432,26 +455,6 @@ class Worktime(object): | |||
432 | if time_to_work > timedelta(): | 455 | if time_to_work > timedelta(): |
433 | self.days_to_work[day] = time_to_work | 456 | self.days_to_work[day] = time_to_work |
434 | 457 | ||
435 | self.extra_days_to_work = dict() | ||
436 | |||
437 | try: | ||
438 | with open(Path(config_dir) / "days-to-work", 'r') as extra_days_to_work_file: | ||
439 | for line in extra_days_to_work_file: | ||
440 | stripped_line = line.strip() | ||
441 | if stripped_line: | ||
442 | splitLine = stripped_line.split(' ') | ||
443 | if len(splitLine) == 2: | ||
444 | [hours, datestr] = splitLine | ||
445 | day = datetime.strptime(datestr, date_format).replace(tzinfo=tzlocal()).date() | ||
446 | self.extra_days_to_work[day] = timedelta(hours = float(hours)) | ||
447 | else: | ||
448 | day = datetime.strptime(stripped_line, date_format).replace(tzinfo=tzlocal()).date() | ||
449 | self.extra_days_to_work[day] = self.time_per_day(day) | ||
450 | except IOError as e: | ||
451 | if e.errno != 2: | ||
452 | raise e | ||
453 | |||
454 | |||
455 | self.now_is_workday = self.is_workday(self.now.date()) | 458 | self.now_is_workday = self.is_workday(self.now.date()) |
456 | 459 | ||
457 | self.time_worked = timedelta() | 460 | self.time_worked = timedelta() |
@@ -467,7 +470,7 @@ class Worktime(object): | |||
467 | 470 | ||
468 | self.time_to_work = sum([self.days_to_work[day] for day in self.days_to_work.keys() if day <= self.end_date.date()], timedelta()) | 471 | self.time_to_work = sum([self.days_to_work[day] for day in self.days_to_work.keys() if day <= self.end_date.date()], timedelta()) |
469 | for day in [d for d in list(self.pull_forward) if d > self.end_date.date()]: | 472 | for day in [d for d in list(self.pull_forward) if d > self.end_date.date()]: |
470 | days_forward = set([d for d in self.days_to_work.keys() if d >= self.end_date.date() and d < day and (not d in self.pull_forward or d == self.end_date.date())]) | 473 | days_forward = set([d for d in [start_day + timedelta(days = x) for x in range(0, (max(end_day, max(self.pull_forward.keys())) - start_day).days + 1)] if d >= self.end_date.date() and d < day and (not d in self.pull_forward or d == self.end_date.date())]) |
471 | extra_days_forward = set([d for d in self.extra_days_to_work.keys() if d >= self.end_date.date() and d < day and (not d in self.pull_forward or d == self.end_date.date())]) | 474 | extra_days_forward = set([d for d in self.extra_days_to_work.keys() if d >= self.end_date.date() and d < day and (not d in self.pull_forward or d == self.end_date.date())]) |
472 | days_forward = days_forward.union(extra_days_forward) | 475 | days_forward = days_forward.union(extra_days_forward) |
473 | 476 | ||
@@ -483,7 +486,7 @@ class Worktime(object): | |||
483 | self.extra_days_to_work[extra_day] += extra_day_time * (day_time / extra_day_time_left) | 486 | self.extra_days_to_work[extra_day] += extra_day_time * (day_time / extra_day_time_left) |
484 | 487 | ||
485 | hours_per_day_forward = time_forward / len(days_forward) if len(days_forward) > 0 else timedelta() | 488 | hours_per_day_forward = time_forward / len(days_forward) if len(days_forward) > 0 else timedelta() |
486 | days_forward.discard(self.end_date.date()) | 489 | # days_forward.discard(self.end_date.date()) |
487 | 490 | ||
488 | self.time_pulled_forward += time_forward - hours_per_day_forward * len(days_forward) | 491 | self.time_pulled_forward += time_forward - hours_per_day_forward * len(days_forward) |
489 | 492 | ||