#!/usr/bin/env python3 """ Minimal HTTP server to serve generated RSS feed files. Usage: python server.py # port 8080, dir ./feeds python server.py --dir /data --port 8080 """ import argparse import http.server import os import sys import datetime class RSSFeedHandler(http.server.SimpleHTTPRequestHandler): """Custom handler with CORS headers and auto-refresh.""" def __init__(self, *args, directory=None, **kwargs): super().__init__(*args, directory=directory, **kwargs) def end_headers(self): # CORS — allow RSS readers to fetch from any origin self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "GET, OPTIONS") self.send_header("Cache-Control", "no-cache, no-store, must-revalidate") self.send_header("Pragma", "no-cache") self.send_header("Expires", "0") super().end_headers() def do_OPTIONS(self): self.send_response(204) self.end_headers() def log_message(self, format, *args): timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") sys.stderr.write(f"[{timestamp}] {args[0]} {args[1]} {args[2]}\n") def main(): parser = argparse.ArgumentParser(description="RSS Feed HTTP Server") parser.add_argument("--dir", default=os.path.join(os.getcwd(), "feeds"), help="Directory containing RSS feeds") parser.add_argument("--port", type=int, default=8080, help="Port to serve on") parser.add_argument("--host", default="0.0.0.0", help="Host to bind to") args = parser.parse_args() feed_dir = os.path.abspath(args.dir) if not os.path.exists(feed_dir): print(f"[server.py] Creating feed directory: {feed_dir}") os.makedirs(feed_dir, exist_ok=True) # Ensure at least one feed exists feeds = sorted(f for f in os.listdir(feed_dir) if f.endswith(".xml")) if feeds: print(f"[server.py] Found {len(feeds)} feed(s): {', '.join(feeds)}") else: print(f"[server.py] No feeds yet in {feed_dir}. Run 'run.py' first or wait for cron.") class Handler(RSSFeedHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=feed_dir, **kwargs) server = http.server.HTTPServer((args.host, args.port), Handler) print(f"[server.py] Serving RSS feeds from {feed_dir}") print(f"[server.py] Listening on http://{args.host}:{args.port}") print(f"[server.py] Feed URLs:") print(f" http://localhost:{args.port}/feed.xml (daily)") print(f" http://localhost:{args.port}/feed_weekly.xml (weekly)") print(f" http://localhost:{args.port}/feed_monthly.xml (monthly)") try: server.serve_forever() except KeyboardInterrupt: print("\n[server.py] Shutting down...") server.server_close() if __name__ == "__main__": main()