diff --git a/info/status.json b/info/status.json new file mode 100644 index 0000000..ce0141f --- /dev/null +++ b/info/status.json @@ -0,0 +1,15 @@ +{ + "last_updated": "2025-07-22T18:03:27.822459Z", + "files": { + "Artists.html": { + "hash": "a84bdea4d1a9c64637bb3237f0f9cc7eef6aa54be17561c2ba2c605c6e9a3579", + "last_archived": "2025-07-22T18:03:27.822475Z" + }, + "artists.csv": { + "hash": "86dddcdc83796c995216a1e8019ed8e4e5864ef05962bf9f93113e60d6836e4c" + }, + "artists.xlsx": { + "hash": "01b93bd2653b3fff4621fc5a173fe80ac2f9729304b6d54b0d98ee7e6b0efe7d" + } + } +} \ No newline at end of file diff --git a/main.py b/main.py index 89b6564..bbbbe5e 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,16 @@ -from flask import Flask, send_file, send_from_directory +from flask import Flask, send_file, send_from_directory, jsonify from flask_cors import CORS import threading +import os +import json from config import HTML_FILENAME, CSV_FILENAME, XLSX_FILENAME from update_loop import update_loop -from archive import test_archive app = Flask(__name__) CORS(app) +# Serve main files @app.route("/artists.html") def serve_artists_html(): return send_file(HTML_FILENAME, mimetype="text/html") @@ -21,6 +23,7 @@ def serve_artists_csv(): def serve_artists_xlsx(): return send_file(XLSX_FILENAME, mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") +# Serve index and frontend assets @app.route("/") @app.route("/index") @app.route("/index.html") @@ -31,13 +34,63 @@ def serve_index(): def serve_next_static(filename): return send_from_directory("templates/_next", filename) +# Serve /info JSON +@app.route("/info") +def info_json(): + info_path = os.path.join("info", "status.json") + if os.path.exists(info_path): + with open(info_path) as f: + return jsonify(json.load(f)) + return {"error": "Info not available"}, 404 + +# Serve /info HTML +@app.route("/info/html") +def info_html(): + info_path = os.path.join("info", "status.json") + if os.path.exists(info_path): + with open(info_path) as f: + data = json.load(f) + html = f""" + +
Last Updated: {data.get('last_updated')}
+Status info not available.
", 404 + +# 404 page @app.errorhandler(404) def page_not_found(e): return send_file("templates/404.html", mimetype="text/html"), 404 +# Start app and updater if __name__ == "__main__": + # Run update loop in background threading.Thread(target=update_loop, daemon=True).start() + + # Optional: perform initial download/generation if needed from downloader import download_zip_and_extract_html, download_xlsx from parser import generate_csv + # Uncomment below if you want to do initial sync before serving + # download_zip_and_extract_html() + # download_xlsx() + # generate_csv() + app.run(host="0.0.0.0", port=5000) diff --git a/update_loop.py b/update_loop.py index 6b541df..dedec42 100644 --- a/update_loop.py +++ b/update_loop.py @@ -1,4 +1,7 @@ +import json +import os import time +from datetime import datetime from downloader import download_zip_and_extract_html, download_xlsx from parser import generate_csv @@ -9,6 +12,27 @@ from utils import hash_file last_html_hash = None last_csv_data = {} +INFO_PATH = "info/status.json" + +def write_info(html_hash, csv_hash, xlsx_hash): + os.makedirs("info", exist_ok=True) + info = { + "last_updated": datetime.utcnow().isoformat() + "Z", + "files": { + "Artists.html": { + "hash": html_hash, + "last_archived": datetime.utcnow().isoformat() + "Z" + }, + "artists.csv": { + "hash": csv_hash + }, + "artists.xlsx": { + "hash": xlsx_hash + } + } + } + with open(INFO_PATH, "w") as f: + json.dump(info, f, indent=2) def update_loop(): global last_html_hash, last_csv_data @@ -19,13 +43,15 @@ def update_loop(): download_xlsx() generate_csv() - # Hash the Artists.html instead of artists.csv - current_hash = hash_file("Artists.html") + html_hash = hash_file("Artists.html") + csv_hash = hash_file("artists.csv") + xlsx_hash = hash_file("artists.xlsx") + current_data = read_csv_to_dict("artists.csv") if last_html_hash is None: print("ℹ️ Initial HTML hash stored.") - elif current_hash != last_html_hash: + elif html_hash != last_html_hash: print("🔔 Artists.html has changed! Archiving URLs...") changes = detect_changes(last_csv_data, current_data) @@ -39,7 +65,9 @@ def update_loop(): else: print("ℹ️ Artists.html unchanged. No archiving needed.") - last_html_hash = current_hash + write_info(html_hash, csv_hash, xlsx_hash) + + last_html_hash = html_hash last_csv_data = current_data except Exception as e: