# app.py from flask import Flask, request, Response, render_template import time import queue import redis import os from scraper.book_scraper import BookScraper from scraper.sites import BookSite from scraper.logger import add_listener, remove_listener, LOG_BUFFER app = Flask(__name__) r = redis.Redis.from_url("redis://redis:6379/0") @app.route("/") def index(): return render_template("index.html") # ---------------------------------------------------------- # RUN SCRAPER # ---------------------------------------------------------- @app.route("/run", methods=["POST"]) def run_scraper(): data = request.json site = BookSite() scraper = BookScraper(site, data["url"]) result = scraper.execute() return { "title": result["title"], "buffer": LOG_BUFFER.getvalue() } # ---------------------------------------------------------- # REALTIME LOG STREAM (SSE) # ---------------------------------------------------------- @app.route("/stream") def stream(): def event_stream(): pub = r.pubsub() pub.subscribe("logs") for msg in pub.listen(): if msg["type"] == "message": yield f"data: {msg['data'].decode()}\n\n" return Response(event_stream(), mimetype="text/event-stream") # ---------------------------------------------------------- if __name__ == "__main__": debug = os.getenv("FLASK_DEBUG", "0") == "1" host = os.getenv("HOST", "0.0.0.0") port = int(os.getenv("PORT", "5000")) app.run(debug=debug, host=host, port=port)