""" status_server.py – tiny HTTP server on port 7860 Serves a live-updating log page so you can watch conversion progress directly from the HF Space URL. Usage: python status_server.py /path/to/conversion.log """ import sys import os import time from http.server import BaseHTTPRequestHandler, HTTPServer from pathlib import Path LOG_FILE = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("/workspace/output/conversion.log") START_TIME = time.time() def read_log() -> str: try: return LOG_FILE.read_text(errors="replace") if LOG_FILE.exists() else "(log not yet created)" except Exception as e: return f"(error reading log: {e})" def elapsed() -> str: s = int(time.time() - START_TIME) h, m = divmod(s, 3600) m, s = divmod(m, 60) return f"{h:02d}:{m:02d}:{s:02d}" class Handler(BaseHTTPRequestHandler): def log_message(self, *args): pass # suppress access log noise def do_GET(self): log_content = read_log() # Detect done/failed for status badge if "✔ Conversion complete" in log_content or "✔ All done" in log_content: status = "✔ COMPLETE" status_color = "#2ecc71" elif "✘ Conversion FAILED" in log_content: status = "✘ FAILED" status_color = "#e74c3c" else: status = "⟳ RUNNING" status_color = "#3498db" # Escape for HTML safe_log = (log_content .replace("&", "&") .replace("<", "<") .replace(">", ">")) html = f""" DeepSeek-Math-V2 Converter

DeepSeek-Math-V2 → GGUF Converter

{status}
Elapsed: {elapsed()}  |  Page auto-refreshes every 15 s
{safe_log}
""" body = html.encode() self.send_response(200) self.send_header("Content-Type", "text/html; charset=utf-8") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) if __name__ == "__main__": server = HTTPServer(("0.0.0.0", 7860), Handler) print(f"Status server listening on :7860 (log: {LOG_FILE})") server.serve_forever() # Keep-alive ping logged every 10 minutes so HF Spaces sees activity import threading def keepalive(): while True: time.sleep(600) try: with open(LOG_FILE, "a") as f: f.write(f"[keepalive] {time.strftime('%H:%M:%S')} – container alive\n") except Exception: pass threading.Thread(target=keepalive, daemon=True).start()