From f5ff82d7293b50ec412231e65b4480d6bf206fcc Mon Sep 17 00:00:00 2001 From: "user@node5.net" Date: Tue, 23 Jun 2026 00:39:08 +0200 Subject: nixify repo, 2026 headline design, debug environment variables --- src/program_parser.py | 157 ++++++++++++++++++++++++-------------------------- 1 file changed, 74 insertions(+), 83 deletions(-) (limited to 'src/program_parser.py') 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)}') -''' -- cgit v1.3.1