Adds full PWA compliance: web app manifest, service worker with cache-first static / network-first scoreboard strategy, and a generated hockey puck icon (512, 192, 180, 32px) on the app's dark navy background. Includes all required meta tags for iOS standalone mode and a /favicon.ico route. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
import json
|
|
|
|
from flask import render_template, jsonify, send_from_directory
|
|
|
|
from app import app
|
|
from app.config import SCOREBOARD_DATA_FILE
|
|
from app.games import parse_games
|
|
|
|
|
|
@app.route("/manifest.json")
|
|
def manifest():
|
|
return send_from_directory(app.static_folder, "manifest.json")
|
|
|
|
|
|
@app.route("/sw.js")
|
|
def service_worker():
|
|
response = send_from_directory(app.static_folder, "sw.js")
|
|
response.headers["Service-Worker-Allowed"] = "/"
|
|
response.headers["Cache-Control"] = "no-cache"
|
|
return response
|
|
|
|
|
|
@app.route("/favicon.ico")
|
|
def favicon():
|
|
return send_from_directory(
|
|
app.static_folder, "icon-32x32.png", mimetype="image/png"
|
|
)
|
|
|
|
|
|
@app.route("/")
|
|
def index():
|
|
return render_template("index.html")
|
|
|
|
|
|
@app.route("/scoreboard")
|
|
def get_scoreboard():
|
|
try:
|
|
with open(SCOREBOARD_DATA_FILE, "r") as json_file:
|
|
scoreboard_data = json.load(json_file)
|
|
except FileNotFoundError:
|
|
return jsonify({"error": "Failed to retrieve scoreboard data. File not found."})
|
|
except json.JSONDecodeError:
|
|
return jsonify(
|
|
{"error": "Failed to retrieve scoreboard data. Invalid JSON format."}
|
|
)
|
|
|
|
if scoreboard_data:
|
|
games = parse_games(scoreboard_data)
|
|
return jsonify(
|
|
{
|
|
"live_games": [g for g in games if g["Game State"] == "LIVE"],
|
|
"pre_games": [g for g in games if g["Game State"] == "PRE"],
|
|
"final_games": [g for g in games if g["Game State"] == "FINAL"],
|
|
}
|
|
)
|
|
else:
|
|
return jsonify({"error": "Failed to retrieve scoreboard data"})
|