refactors to use redis & celery

This commit is contained in:
2025-02-20 19:56:37 +01:00
parent f68ada7204
commit 5994d8ae7b
10 changed files with 427 additions and 154 deletions

View File

@@ -1,4 +1,3 @@
# filepath: /home/michaelb/Dokumente/TornActivityTracker/app/api.py
from flask import jsonify, request, Response, send_from_directory, current_app
import threading
import os
@@ -10,6 +9,7 @@ from app.models import Scraper
from app.util import create_zip, delete_old_zips, tail
from app.config import load_config
from app.forms import ScrapingForm
from app.tasks import start_scraping_task, stop_scraping_task, get_redis
scraping_thread = None
scraper = None
@@ -18,42 +18,40 @@ scrape_lock = threading.Lock()
def register_api(app):
@app.route('/start_scraping', methods=['POST'])
def start_scraping():
global scraping_thread, scraper
with scrape_lock:
scraper = current_app.config.get('SCRAPER')
if scraper is not None and scraper.scraping_active:
current_app.logger.warning("Can't start scraping process: scraping already in progress")
form = ScrapingForm()
if form.validate_on_submit():
redis_client = get_redis()
faction_id = form.faction_id.data
# Check if scraping is already active
if redis_client.hget(f"scraper:{faction_id}", "scraping_active") == "1":
return jsonify({"status": "Scraping already in progress"})
form = ScrapingForm()
if form.validate_on_submit():
faction_id = form.faction_id.data
fetch_interval = form.fetch_interval.data
run_interval = form.run_interval.data
scraper = Scraper(faction_id, fetch_interval, run_interval, app)
scraper.scraping_active = True
scraping_thread = threading.Thread(target=scraper.start_scraping, args=(app,))
scraping_thread.daemon = True
scraping_thread.start()
current_app.config['SCRAPER'] = scraper
current_app.config['SCRAPING_THREAD'] = scraping_thread
return jsonify({"status": "Scraping started"})
return jsonify({"status": "Invalid form data"})
# Convert config to a serializable dict with only needed values
config_dict = {
'DATA': {'DATA_DIR': current_app.config['DATA']['DATA_DIR']},
'DEFAULT': {'API_KEY': current_app.config['DEFAULT']['API_KEY']}
}
start_scraping_task.delay(
faction_id,
int(form.fetch_interval.data), # Ensure this is an int
int(form.run_interval.data), # Ensure this is an int
config_dict
)
return jsonify({"status": "Scraping started"})
return jsonify({"status": "Invalid form data"})
@app.route('/stop_scraping', methods=['POST'])
def stop_scraping():
scraper = current_app.config.get('SCRAPER')
if scraper is None or not scraper.scraping_active:
return jsonify({"status": "Scraping is not running"})
redis_client = get_redis()
faction_id = redis_client.get("current_faction_id")
if not faction_id:
return jsonify({"status": "No active scraping session"})
stop_scraping_task.delay(faction_id)
return jsonify({"status": "Stopping scraping"})
scraper.stop_scraping()
current_app.config['SCRAPING_ACTIVE'] = False
current_app.logger.debug("Scraping stopped by user")
return jsonify({"status": "Scraping stopped"})
@app.route('/logfile', methods=['GET'])
def logfile():
log_file_name = current_app.logger.handlers[0].baseFilename
@@ -196,20 +194,37 @@ def register_api(app):
@app.route('/scraping_status', methods=['GET'])
def scraping_status():
if scraper is None:
current_app.logger.debug("Scraper is not initialized.")
redis_client = get_redis()
current_faction_id = redis_client.get("current_faction_id")
if not current_faction_id:
return jsonify({"scraping_active": False})
if scraper.scraping_active:
current_app.logger.debug("Scraping is active.")
return jsonify({"scraping_active": True})
else:
current_app.logger.debug("Scraping is not active.")
scraping_active = redis_client.hget(f"scraper:{current_faction_id}", "scraping_active")
# If we have a faction_id but scraping is not active, clean up the stale state
if not scraping_active or scraping_active == "0":
redis_client.delete("current_faction_id")
return jsonify({"scraping_active": False})
return jsonify({
"scraping_active": True,
"faction_id": current_faction_id
})
@app.route('/scraping_get_end_time')
def scraping_get_end_time():
if scraper is None:
current_app.logger.debug("Scraper is not initialized.")
return jsonify({"scraping_active":False})
return jsonify({"end_time": scraper.end_time})
redis_client = get_redis()
current_faction_id = redis_client.get("current_faction_id")
if not current_faction_id:
return jsonify({"scraping_active": False})
end_time = redis_client.hget(f"scraper:{current_faction_id}", "end_time")
if not end_time:
return jsonify({"scraping_active": False})
return jsonify({
"end_time": end_time,
"faction_id": current_faction_id
})