You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmftools/bookscraper/app.py

65 lines
1.5 KiB

# 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)