summaryrefslogtreecommitdiff
path: root/src/program_parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/program_parser.py')
-rwxr-xr-xsrc/program_parser.py157
1 files changed, 74 insertions, 83 deletions
diff --git a/src/program_parser.py b/src/program_parser.py
index 67103b1..66c0858 100755
--- a/src/program_parser.py
+++ b/src/program_parser.py
@@ -1,13 +1,10 @@
-#!/run/current-system/sw/bin/python
import os
import json
import datetime
-import copy
import dataclasses
+import logging
-input_file_path = './program.json'
-
-title_max_length = 34
+logger = logging.getLogger(__name__) # Set the logger name, to the name of the module
@dataclasses.dataclass
class Event:
@@ -22,89 +19,83 @@ class Event:
pretty: str = None
progress: int = None
-icons = {
- 'Startent at Info Desk' : "⭐",
- 'Speakers Tent': "🏕",
- 'Workshop Room': "🛠️",
- 'Bar Meetup Area': "🍺",
- 'Bar Area': "🍺",
- 'External': "🚗",
- 'Pyjam.as Village in Party Area': "🐍",
- 'Workshop Room (possibly outside of it)': "🛠️(🏞️)",
- 'Workshop Room (sofa area)': "🛠️(🛋️)",
- 'NWWC Village in Party Area': "🔊",
- 'Wellness area': "🛀",
- 'Online': "🌐",
-}
+class ProgramParser:
+ def __init__(self, program_path:os.PathLike, title_max_length:int=34, override_date:datetime.datetime|None=None):
+ self.program_path = program_path
+ self.title_max_length = title_max_length
+ self.override_date = override_date
+ self.icons = {
+ 'Startent at Info Desk' : "⭐",
+ 'Speakers Tent': "🏕",
+ 'Workshop Room': "🛠️",
+ 'Bar Meetup Area': "🍺",
+ 'Bar Area': "🍺",
+ 'External': "🚗",
+ 'Pyjam.as Village in Party Area': "🐍",
+ 'Workshop Room (possibly outside of it)': "🛠️(🏞️)",
+ 'Workshop Room (sofa area)': "🛠️(🛋️)",
+ 'NWWC Village in Party Area': "🔊",
+ 'Wellness area': "🛀",
+ 'Online': "🌐",
+ }
-def get_program() -> list[Event]:
- program: list[Event] = []
- # Parse program into data format (interpret datetime, and such)
- with open(input_file_path, "r") as json_file:
- program_raw = json.load(json_file)
- for event_raw in program_raw:
- event = Event()
- #print(event_raw["title"])
- for d in ["title", "room"]: # 1 to 1 mapping
- setattr(event, d, event_raw[d])
- event.start_date = datetime.datetime.strptime(event_raw["date"], "%Y-%m-%dT%H:%M:%S+00:00")
- event.start_date += datetime.timedelta(hours=2) # Hvad er vinter tid?
- end_bogus = datetime.datetime.strptime(event_raw["duration"],"%H:%M:%S")
- event.duration = datetime.timedelta(hours=end_bogus.hour, minutes=end_bogus.minute, seconds=end_bogus.second)
- event.end_date = event.start_date + event.duration
- #print('Start date: ', event["start_date"])
- #print("End date: ", event["end_date"])
- #print()
- program.append(event)
+ def get_program(self) -> list[Event]:
+ program: list[Event] = []
+ # Parse program into data format (interpret datetime, and such)
+ with open(self.program_path, "r") as json_file:
+ program_raw = json.load(json_file)
+ for event_raw in program_raw:
+ event = Event()
+ #print(event_raw["title"])
+ for d in ["title", "room"]: # 1 to 1 mapping
+ setattr(event, d, event_raw[d])
+ event.start_date = datetime.datetime.strptime(event_raw["date"], "%Y-%m-%dT%H:%M:%S+00:00")
+ event.start_date += datetime.timedelta(hours=2) # Hvad er vinter tid?
+ end_bogus = datetime.datetime.strptime(event_raw["duration"],"%H:%M:%S")
+ event.duration = datetime.timedelta(
+ hours=end_bogus.hour, minutes=end_bogus.minute, seconds=end_bogus.second)
+ event.end_date = event.start_date + event.duration
+ #print('Start date: ', event["start_date"])
+ #print("End date: ", event["end_date"])
+ #print()
+ program.append(event)
- program = sorted(program, key=lambda x: x.start_date)
- return program
+ program = sorted(program, key=lambda x: x.start_date)
+ return program
-def get_events_to_show(program: list[Event], programs_to_show_count=4) -> list[Event]:
- current_datetime = datetime.datetime.now()
- #current_datetime = datetime.datetime(year=2025, month=7, day=18, hour=15, minute=30) # DEBUG
- # Get events to show
- events_to_show = []
- for event in program:
- if len(events_to_show) >= programs_to_show_count:
- break
- if event.end_date > current_datetime:
- events_to_show.append(event)
+ def get_events_to_show(self, program: list[Event], programs_to_show_count=4) -> list[Event]:
+ current_datetime = datetime.datetime.now() if not self.override_date else self.override_date
+ #current_datetime = datetime.datetime(year=2025, month=7, day=18, hour=15, minute=30) # DEBUG
+ # Get events to show
+ events_to_show = []
+ for event in program:
+ if len(events_to_show) >= programs_to_show_count:
+ break
+ if event.end_date > current_datetime:
+ events_to_show.append(event)
- def format_program(event: Event, cli=False) -> str:
- if len(event.title) > title_max_length:
- event.title = f'{event.title[:title_max_length - 3]}...' # Truncate title by deleting was 1-3 chars and putting ...
- else:
- event.title += " " * (title_max_length - len(event.title)) # Pad title
- event.day = event.start_date.strftime('%a')
- start_time = event.start_date.strftime('%H:%M')
- end_time = event.end_date.strftime('%H:%M')
- event.icon = icons.get(event.room)
- if event.icon == None:
- event.icon = '?'
- print(f"NEW ICON NEEDED!!! for {event.room}")
- event.time = f"{start_time}-{end_time}"
- return f"{event.title} {event.day} {start_time}-{end_time} {event.icon}"
-
- for event_to_show in events_to_show:
- event_to_show.pretty = format_program(event_to_show)
- duration_sec = (event_to_show.end_date - event_to_show.start_date).total_seconds()
- progress_sec = (current_datetime - event_to_show.end_date).total_seconds()
- event_to_show.progress = 100 + (progress_sec / duration_sec) * 100
+ def format_program(event: Event, cli=False) -> str:
+ if len(event.title) > self.title_max_length:
+ # Truncate title by deleting was 1-3 chars and putting ...
+ event.title = f'{event.title[:self.title_max_length - 3]}...'
+ else:
+ event.title += " " * (self.title_max_length - len(event.title)) # Pad title
+ event.day = event.start_date.strftime('%a')
+ start_time = event.start_date.strftime('%H:%M')
+ end_time = event.end_date.strftime('%H:%M')
+ event.icon = self.icons.get(event.room)
+ if event.icon == None:
+ event.icon = '?'
+ logger.warning(f"NEW ICON NEEDED!!! for {event.room}")
+ event.time = f"{start_time}-{end_time}"
+ return f"{event.title} {event.day} {start_time}-{end_time} {event.icon}"
- return events_to_show
+ for event_to_show in events_to_show:
+ event_to_show.pretty = format_program(event_to_show)
+ duration_sec = (event_to_show.end_date - event_to_show.start_date).total_seconds()
+ progress_sec = (current_datetime - event_to_show.end_date).total_seconds()
+ event_to_show.progress = 100 + (progress_sec / duration_sec) * 100
-program: list[Event] = get_program()
-events_to_show: list[Event] = get_events_to_show(program)
+ return events_to_show
-'''
-# Convert to the output string
-events_to_show_string = '\n'.join([a.pretty for a in events_to_show])
-print(f"{events_to_show_string}\n")
-# Write to output file
-with open(tmp_file_path, 'w') as tmp_file:
- tmp_file.write(events_to_show_string)
-os.rename(tmp_file_path, output_file_path)
-print(f'Written to {output_file_path} length: {len(events_to_show_string)}')
-'''