From f451317b6f42d1c254437638a2ba0c07bdf3d69c Mon Sep 17 00:00:00 2001 From: "vladimir.buzalka" Date: Fri, 16 Jan 2026 13:10:07 +0100 Subject: [PATCH] z230 --- 81 TorrentManipulation.py | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 81 TorrentManipulation.py diff --git a/81 TorrentManipulation.py b/81 TorrentManipulation.py new file mode 100644 index 0000000..a014742 --- /dev/null +++ b/81 TorrentManipulation.py @@ -0,0 +1,76 @@ +# ============================== +# 🧹 HANDLE COMPLETED + DEAD +# ============================== + +def handle_completed_and_dead(): + global stat_completed, stat_dead + + # Načteme info o torrentech + torrents = qb.torrents_info() + + for t in torrents: + t_hash = t.hash + state = t.state + progress = float(t.progress) + + # Získání dostupnosti (availability) - defaultně -1 pokud není k dispozici + availability = float(getattr(t, "availability", -1)) + + # Získání času přidání + added_ts = getattr(t, "added_on", 0) + added_dt = datetime.fromtimestamp(added_ts) if added_ts > 0 else datetime.now() + age_in_minutes = (datetime.now() - added_dt).total_seconds() / 60 + + # --------------------------- + # 1. ✔ COMPLETED (Hotovo) + # --------------------------- + # (This logic remains unchanged) + if progress >= 1.0 or state in {"completed", "uploading", "stalledUP", "queuedUP"}: + stat_completed += 1 + deleted_completed.append(t.name) + + try: + # Smažeme z QB, ale necháme data na disku + qb.torrents_delete(torrent_hashes=t_hash, delete_files=False) + except Exception as e: + print(f"⚠️ delete (keep data) failed for {t.name}: {e}") + + cursor.execute(""" + UPDATE torrents + SET qb_state='completed', + qb_progress=100, + qb_completed_datetime=NOW(), + qb_last_update=NOW() + WHERE qb_hash=%s OR torrent_hash=%s + """, (t_hash, t_hash)) + continue + + # --------------------------- + # 2. ❌ DEAD (Mrtvý) + # --------------------------- + # UPDATED LOGIC: + # 1. Must be older than limit (3 days) + # 2. Availability < 1.0 (nobody has full file) + # 3. AND MUST NOT BE QUEUED (queuedDL, queuedUP, etc.) + + is_old_enough = age_in_minutes > DEAD_TORRENT_MINUTES + is_unavailable = availability < 1.0 + # Check if state contains 'queued' (covers 'queuedDL', 'queuedUP', etc.) + is_queued = "queued" in state + + if is_old_enough and is_unavailable and not is_queued: + stat_dead += 1 + deleted_dead.append(f"{t.name} (Avail: {availability:.2f}, State: {state})") + + try: + # Smažeme z QB včetně nedotažených souborů + qb.torrents_delete(torrent_hashes=t_hash, delete_files=True) + except Exception as e: + print(f"⚠️ delete (files) failed for {t.name}: {e}") + + cursor.execute(""" + UPDATE torrents + SET qb_state='dead', + qb_last_update=NOW() + WHERE qb_hash=%s OR torrent_hash=%s + """, (t_hash, t_hash)) \ No newline at end of file