from flask import Flask, render_template, jsonify, request import subprocess import threading import time import os import logging import torrent_vahti app = Flask(__name__) log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) vahti_prosessia = None loki_sisalto = [] def lue_lokit(process): global loki_sisalto for line in iter(process.stdout.readline, ''): if line: loki_sisalto.append(line) if len(loki_sisalto) > 500: loki_sisalto.pop(0) def suorita_haku_prosessi(): global vahti_prosessia if vahti_prosessia is None or vahti_prosessia.poll() is not None: loki_sisalto.append(f"\n--- Haku käynnistetty: {time.strftime('%H:%M:%S')} ---\n") vahti_prosessia = subprocess.Popen( ['python', '-u', 'torrent_vahti.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) t = threading.Thread(target=lue_lokit, args=(vahti_prosessia,)) t.daemon = True t.start() @app.route('/') def index(): return render_template('index.html') @app.route('/status') def status(): kaikki_data = torrent_vahti.lataa_kaikki_data() loki_teksti = ''.join(loki_sisalto) try: with open(torrent_vahti.LOKI_TIEDOSTO, "r", encoding="utf-8") as f: loki_torrentit = f.read() except: loki_torrentit = "Historiaa ei löytynyt." return jsonify({ 'status': 'ok', 'hakukohteet': kaikki_data.get("hakukohteet", []), 'asetukset': kaikki_data.get("asetukset", {}), 'indeksorit': kaikki_data.get("indeksorit", []), 'loki_skripti': loki_teksti, 'loki_torrentit': loki_torrentit }) @app.route('/tallenna_asetukset', methods=['POST']) def tallenna_asetukset(): data = request.json kaikki_data = torrent_vahti.lataa_kaikki_data() kaikki_data["asetukset"] = { "jackett_url": data.get('jackett_url', ''), "jackett_api_key": data.get('jackett_api_key', ''), "qbit_url": data.get('qbit_url', ''), "qbit_user": data.get('qbit_user', 'admin'), "qbit_pass": data.get('qbit_pass', ''), "haku_vali": int(data.get('haku_vali', 900)) } torrent_vahti.tallenna_kaikki_data(kaikki_data) return jsonify({'status': 'ok'}) @app.route('/paivita_indeksorit', methods=['POST']) def paivita_indeksorit(): uusi_lista = request.json.get("indeksorit", []) kaikki_data = torrent_vahti.lataa_kaikki_data() kaikki_data["indeksorit"] = uusi_lista torrent_vahti.tallenna_kaikki_data(kaikki_data) return jsonify({'status': 'ok'}) @app.route('/lisaa_kohde', methods=['POST']) def lisaa_kohde(): data = request.json kaikki_data = torrent_vahti.lataa_kaikki_data() kaikki_data["hakukohteet"].append({ "jackett_haku": data['jackett_haku'], "regex_suodatin": data.get('regex_suodatin', '.*'), "kohdekansio": data['kohdekansio'], "paivat": data.get('paivat', [0, 1, 2, 3, 4, 5, 6]) }) torrent_vahti.tallenna_kaikki_data(kaikki_data) return jsonify({'status': 'ok'}) @app.route('/poista_kohde/', methods=['DELETE']) def poista_kohde(index): kaikki_data = torrent_vahti.lataa_kaikki_data() if 0 <= index < len(kaikki_data["hakukohteet"]): kaikki_data["hakukohteet"].pop(index) torrent_vahti.tallenna_kaikki_data(kaikki_data) return jsonify({'status': 'ok'}) @app.route('/paivita_kohde/', methods=['POST']) def paivita_kohde(index): data = request.json kaikki_data = torrent_vahti.lataa_kaikki_data() if 0 <= index < len(kaikki_data.get("hakukohteet", [])): kaikki_data["hakukohteet"][index] = { "jackett_haku": data['jackett_haku'], "regex_suodatin": data.get('regex_suodatin', '.*'), "kohdekansio": data['kohdekansio'], "paivat": data.get('paivat', [0, 1, 2, 3, 4, 5, 6]) } torrent_vahti.tallenna_kaikki_data(kaikki_data) return jsonify({'status': 'ok'}) return jsonify({'status': 'error', 'message': 'Virheellinen indeksi'}), 400 @app.route('/poista_historiarivi', methods=['POST']) def poista_historiarivi(): data = request.json rivi_poistettavaksi = data.get('rivi') if os.path.exists(torrent_vahti.LOKI_TIEDOSTO): with open(torrent_vahti.LOKI_TIEDOSTO, "r", encoding="utf-8") as f: rivit = f.readlines() uudet_rivit = [r for r in rivit if r.strip() != rivi_poistettavaksi.strip()] with open(torrent_vahti.LOKI_TIEDOSTO, "w", encoding="utf-8") as f: f.writelines(uudet_rivit) return jsonify({'status': 'ok'}) return jsonify({'status': 'error'}), 404 @app.route('/suorita_haku', methods=['POST']) def suorita_haku(): suorita_haku_prosessi() return jsonify({'status': 'ok'}) @app.route('/tyhjenna_loki', methods=['POST']) def tyhjenna_loki(): if os.path.exists(torrent_vahti.LOKI_TIEDOSTO): os.remove(torrent_vahti.LOKI_TIEDOSTO) return jsonify({'status': 'ok'}) if __name__ == '__main__': def automaattinen_ajastin(): while True: kaikki_data = torrent_vahti.lataa_kaikki_data() vali = kaikki_data["asetukset"].get("haku_vali", 900) time.sleep(vali) suorita_haku_prosessi() ajastin_saie = threading.Thread(target=automaattinen_ajastin) ajastin_saie.daemon = True ajastin_saie.start() app.run(host='0.0.0.0', port=5000)