feat: daily paper rss generator with dockerfile + entrypoint
This commit is contained in:
82
server.py
Normal file
82
server.py
Normal file
@@ -0,0 +1,82 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user