summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoruser@node5.net <user@node5.net>2026-07-05 17:37:30 +0200
committeruser@node5.net <user@node5.net>2026-07-05 18:57:22 +0200
commit54cf46883c2afc2a71de1066c272520367bfa6c3 (patch)
tree95293ec8e9c5269539703dc7d4f5bcda72ce1fc6 /src
parent2826c97f429c4edb584f692d169544129944a1cc (diff)
dynamic width url parameter
Diffstat (limited to 'src')
-rwxr-xr-xsrc/program_parser.py11
-rw-r--r--src/static/main.css5
-rw-r--r--src/templates/index.html4
-rw-r--r--src/text_tv.py40
4 files changed, 38 insertions, 22 deletions
diff --git a/src/program_parser.py b/src/program_parser.py
index 1fae528..a104ecf 100755
--- a/src/program_parser.py
+++ b/src/program_parser.py
@@ -27,9 +27,8 @@ class ProgramParser:
'''
Parse the JSON program into dataformat for easy processing
'''
- def __init__(self, program_path:os.PathLike=None, title_max_length:int=34, override_date:datetime.datetime|None=None):
+ def __init__(self, program_path:os.PathLike=None, 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' : "⭐",
@@ -74,7 +73,7 @@ class ProgramParser:
program = sorted(program, key=lambda x: x.start_date)
return program
- def get_events_to_show(self, program: list[Event], lines=1000) -> list[Event]:
+ def get_events_to_show(self, program: list[Event], lines=1000,title_max_length:int=34) -> 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
@@ -86,12 +85,12 @@ class ProgramParser:
events_to_show.append(event)
def format_program(event: Event) -> str:
- if len(event.title) > self.title_max_length:
+ if len(event.title) > title_max_length:
# Truncate title by deleting was 1-3 chars and putting ...
- event.short = f'{event.title[:self.title_max_length - 3]}...'
+ event.short = f'{event.title[:title_max_length - 3]}...'
else:
event.short = event.title
- event.spacer = "." * (self.title_max_length - len(event.title)) # Pad title
+ event.spacer = "." * (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')
diff --git a/src/static/main.css b/src/static/main.css
index 817887f..c0002a1 100644
--- a/src/static/main.css
+++ b/src/static/main.css
@@ -31,10 +31,6 @@ hr {
/* Program */
-:root {
- --line-height: 1.5em;
-}
-
#program {
white-space-collapse: collapse; /* Allow program template to be spaced legibly */
line-height: var(--line-height);
@@ -57,7 +53,6 @@ hr {
.program-text {
position: absolute;
- width: 120%;
}
.program-text > * {
diff --git a/src/templates/index.html b/src/templates/index.html
index 084a67c..a637300 100644
--- a/src/templates/index.html
+++ b/src/templates/index.html
@@ -41,6 +41,10 @@
zoom: {{ scale }};
}
{% endif %}
+
+ :root {
+ --line-height: {{ line_height }};
+ }
</style>
{% endblock %}
diff --git a/src/text_tv.py b/src/text_tv.py
index 21ff2e8..abd86e2 100644
--- a/src/text_tv.py
+++ b/src/text_tv.py
@@ -12,33 +12,51 @@ app = flask.Flask(__name__, template_folder='templates', static_folder='static',
debug = 'PROD' not in os.environ
-
+@app.route('/top', defaults={'width': 34})
+@app.route('/top/<width>')
@app.route('/top')
-def top():
+def top(width: int):
now = datetime.datetime.now() if not program_parser.override_date else program_parser.override_date
- return ' '.join(['BornHack', 'S105', now.strftime("%a %d %b"), now.strftime("%R:%S")])
+ parts = ['BornHack', 'S105', now.strftime("%a %d %b"), now.strftime("%R:%S")]
+ parts_length = len(''.join(parts))
+ padding_length = width - parts_length
+ padding = int(padding_length / (len(parts) - 1))
+ top = (' ' * padding).join(parts)
+ remainder = width - len(top)
+ top = top + " " * remainder
+ return top
@app.route('/update')
def update():
return top() + '\n' + flask.render_template('program.html', parts=text())
-@app.route('/program.json')
-def program():
- events_to_show: list[Event] = program_parser.get_events_to_show(program_parser.get_program())
+@app.route('/program.json', defaults={'width': 34})
+@app.route('/program.json/<width>')
+def program(width: int):
+ title_max_length = width - 17 # Truncate the title minus the length of the date, icon and associated whitespace
+ print(f'title_max_length: {title_max_length}')
+ events_to_show: list[Event] = program_parser.get_events_to_show(program_parser.get_program(), title_max_length=title_max_length)
#{event.title} {day} {start_time}-{end_time} {icon}
return events_to_show
-@app.route('/text')
-def text() -> dict[str, str]:
- return {part: eval(part)() for part in ['top', 'program']}
+@app.route("/text/", defaults={'width': 34})
+@app.route("/text/<width>")
+def text(width: int) -> dict[str, str]:
+ return {part: eval(part)(width=width) for part in ['top', 'program']}
@app.route('/')
def index():
- scale = flask.request.args.get("scale", "2")
- return flask.render_template('index.html', parts=text(), scale=scale)
+ arg_defaults = {
+ 'scale': 2,
+ 'line_height': 1.5,
+ 'width': 50,
+ }
+ args = {key: flask.request.args.get(key, value) for key, value in arg_defaults.items()}
+ args['width'] = int(args['width'])
+ return flask.render_template('index.html', parts=text(width=args['width']), **args)
def main():