83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
#!/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()
|