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.
72 lines
1.7 KiB
72 lines
1.7 KiB
# app.py
|
|
from flask import Flask, request, Response, render_template
|
|
import time
|
|
import queue
|
|
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__)
|
|
|
|
|
|
@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():
|
|
q = queue.Queue()
|
|
|
|
# push logregels van BookScraper naar SSE
|
|
def listener(line):
|
|
q.put(line)
|
|
|
|
add_listener(listener)
|
|
|
|
try:
|
|
while True:
|
|
msg = q.get() # blokkeert totdat logregel binnenkomt
|
|
yield f"data: {msg}\n\n"
|
|
except GeneratorExit:
|
|
pass
|
|
finally:
|
|
remove_listener(listener)
|
|
|
|
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)
|