countdowngen/app.py
2025-08-12 22:28:56 -03:00

69 lines
2.2 KiB
Python

from flask import Flask, render_template, request, redirect, url_for
from urllib.parse import urlencode
import datetime
app = Flask(__name__)
def coerce_bool(val, default=False):
if val is None:
return default
s = str(val).lower()
return s in ("1","true","yes","y","on")
@app.template_filter("default_if_none")
def default_if_none(value, default):
return default if value is None or value == "" else value
@app.route("/")
def index():
# Prefill from query if present, so users can tweak and regenerate
q = request.args
context = {
"title": q.get("title", "Big Day"),
"target": q.get("target", ""),
"scheme": q.get("scheme", "dark"),
"accent": q.get("accent", "#8b5cf6"), # violet-500
"radius": q.get("radius", "16"),
"shadow": q.get("shadow", "lg"),
"font": q.get("font", "system-ui"),
"show_millis": coerce_bool(q.get("millis"), False),
"rounded_unit": q.get("rounded_unit", "none"), # none, minutes, hours, days
"bg": q.get("bg", "#0b0b10"),
"fg": q.get("fg", "#e5e7eb"),
}
return render_template("index.html", **context)
@app.route("/preview", methods=["POST"])
def preview():
data = request.form.to_dict(flat=True)
# sanitize minimal
# Build query string and redirect to /countdown
return redirect(url_for("countdown") + "?" + urlencode(data))
@app.route("/countdown")
def countdown():
q = request.args
# Provide sane defaults if not supplied
params = {
"title": q.get("title", "Big Day"),
"target": q.get("target", ""),
"scheme": q.get("scheme", "dark"),
"accent": q.get("accent", "#8b5cf6"),
"radius": q.get("radius", "16"),
"shadow": q.get("shadow", "lg"),
"font": q.get("font", "system-ui"),
"millis": q.get("millis", "0"),
"rounded_unit": q.get("rounded_unit", "none"),
"bg": q.get("bg", "#0b0b10"),
"fg": q.get("fg", "#e5e7eb"),
}
# If no target specified, bounce user to setup screen
if not params["target"]:
return redirect(url_for("index"))
return render_template("countdown.html", **params)
if __name__ == "__main__":
# Helpful for local dev
app.run(debug=True, host="0.0.0.0", port=5000)