feat: daily paper rss generator with dockerfile + entrypoint

This commit is contained in:
Kunthawat Greethong
2026-06-27 14:36:43 +07:00
parent ffe8769875
commit 23fed6dd64
5 changed files with 242 additions and 33 deletions

82
server.py Normal file
View 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()