From 1219f840c6fd74799ddf81cb050a9da581e4a6b2 Mon Sep 17 00:00:00 2001 From: Vladimir Buzalka Date: Sun, 8 Feb 2026 13:08:00 +0100 Subject: [PATCH] git --- Seedbox/40 ČištěníCompleted.py | 91 +++++++++++++++-------- Seedbox/41 ČištěníOneTimeTest.py | 124 +++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+), 33 deletions(-) create mode 100644 Seedbox/41 ČištěníOneTimeTest.py diff --git a/Seedbox/40 ČištěníCompleted.py b/Seedbox/40 ČištěníCompleted.py index f1e03e0..190dbae 100644 --- a/Seedbox/40 ČištěníCompleted.py +++ b/Seedbox/40 ČištěníCompleted.py @@ -6,7 +6,7 @@ from datetime import datetime # CONFIG # ============================================================ -DRY_RUN = False # ← změň na True pokud chceš test +DRY_RUN = False # ← change to True for testing QBT_URL = "https://vladob.zen.usbx.me/qbittorrent" QBT_USER = "vladob" @@ -22,7 +22,6 @@ DB_CONFIG = { "autocommit": True, } - # ============================================================ # CONNECT # ============================================================ @@ -49,6 +48,8 @@ def connect_db(): def main(): print("🚀 UltraCC completed torrent cleanup") + print(f"DRY_RUN = {DRY_RUN}") + print("------------------------------------------------") qbt = connect_qbt() db = connect_db() @@ -58,11 +59,12 @@ def main(): removed_count = 0 skipped_count = 0 + updated_db_count = 0 for t in torrents: # ---------------------------------------------------- - # Test completed via completion_on + # Only completed torrents # ---------------------------------------------------- if not t.completion_on: continue @@ -70,11 +72,10 @@ def main(): thash = t.hash.lower() name = t.name state = t.state - completion_dt = datetime.fromtimestamp(t.completion_on) # ---------------------------------------------------- - # Skip pokud už DB má completion + # Check DB # ---------------------------------------------------- cursor.execute(""" SELECT qb_completed_datetime @@ -84,40 +85,64 @@ def main(): row = cursor.fetchone() - if row and row[0]: - skipped_count += 1 + # ==================================================== + # CASE 1 — Torrent completed in qBittorrent but NOT in DB + # → Update DB + Remove torrent + # ==================================================== + if not row or not row[0]: + + print(f"✔ COMPLETED (DB update required): {name}") + print(f" Completion time: {completion_dt}") + + if not DRY_RUN: + cursor.execute(""" + UPDATE torrents + SET + qb_state = %s, + qb_progress = 1, + qb_completed_datetime = %s, + qb_last_update = NOW() + WHERE torrent_hash = %s + """, (f"completed_removed ({state})", completion_dt, thash)) + + updated_db_count += 1 + + # Remove torrent + if DRY_RUN: + print(" [DRY] Would remove torrent") + else: + qbt.torrents_delete(delete_files=False, torrent_hashes=thash) + removed_count += 1 + continue - print(f"✔ COMPLETED: {name}") - print(f" Completion time: {completion_dt}") + # ==================================================== + # CASE 2 — Torrent completed in qBittorrent AND already completed in DB + # → Just remove torrent + # ==================================================== + if row and row[0]: - # ---------------------------------------------------- - # UPDATE DB - # ---------------------------------------------------- - if not DRY_RUN: - cursor.execute(""" - UPDATE torrents - SET - qb_state = %s, - qb_progress = 1, - qb_completed_datetime = %s, - qb_last_update = NOW() - WHERE torrent_hash = %s - """, (f"completed_removed ({state})", completion_dt, thash)) + print(f"✔ COMPLETED (Already in DB → removing): {name}") - # ---------------------------------------------------- - # REMOVE TORRENT - # ---------------------------------------------------- - if DRY_RUN: - print(" [DRY] Would remove torrent") - else: - qbt.torrents_delete(delete_files=False, torrent_hashes=thash) - removed_count += 1 + if DRY_RUN: + print(" [DRY] Would remove torrent") + else: + qbt.torrents_delete(delete_files=False, torrent_hashes=thash) + removed_count += 1 + continue + + skipped_count += 1 + + # ========================================================= + # SUMMARY + # ========================================================= + print("------------------------------------------------") + print(f"Removed torrents : {removed_count}") + print(f"DB updated : {updated_db_count}") + print(f"Skipped torrents : {skipped_count}") + print(f"DRY_RUN : {DRY_RUN}") print("------------------------------------------------") - print(f"Removed torrents : {removed_count}") - print(f"Skipped torrents : {skipped_count}") - print(f"DRY_RUN = {DRY_RUN}") if __name__ == "__main__": diff --git a/Seedbox/41 ČištěníOneTimeTest.py b/Seedbox/41 ČištěníOneTimeTest.py new file mode 100644 index 0000000..00874c9 --- /dev/null +++ b/Seedbox/41 ČištěníOneTimeTest.py @@ -0,0 +1,124 @@ +import pymysql +import qbittorrentapi +from datetime import datetime + +# ============================================================ +# CONFIG +# ============================================================ + +QBT_URL = "https://vladob.zen.usbx.me/qbittorrent" +QBT_USER = "vladob" +QBT_PASS = "jCni3U6d#y4bfcm" + +DB_CONFIG = { + "host": "192.168.1.50", + "port": 3306, + "user": "root", + "password": "Vlado9674+", + "database": "torrents", + "charset": "utf8mb4", + "autocommit": True, +} + +# ============================================================ +# CONNECT +# ============================================================ + +def connect_qbt(): + qbt = qbittorrentapi.Client( + host=QBT_URL, + username=QBT_USER, + password=QBT_PASS, + VERIFY_WEBUI_CERTIFICATE=False + ) + qbt.auth_log_in() + return qbt + + +def connect_db(): + return pymysql.connect(**DB_CONFIG) + + +# ============================================================ +# MAIN AUDIT +# ============================================================ + +def main(): + + print("🔎 UltraCC → DB COMPLETION AUDIT") + print("READ ONLY MODE") + print("------------------------------------------------") + + qbt = connect_qbt() + db = connect_db() + cursor = db.cursor() + + torrents = qbt.torrents_info() + + total_completed = 0 + not_in_db = 0 + db_no_completion = 0 + db_completed = 0 + + for t in torrents: + + # Only completed torrents + if not t.completion_on: + continue + + total_completed += 1 + + thash = t.hash.lower() + name = t.name + completion_dt = datetime.fromtimestamp(t.completion_on) + + # --------------------------------------------- + # Query DB + # --------------------------------------------- + cursor.execute(""" + SELECT qb_completed_datetime + FROM torrents + WHERE torrent_hash = %s + """, (thash,)) + + row = cursor.fetchone() + + # --------------------------------------------- + # Status classification + # --------------------------------------------- + if not row: + status = "❌ NOT_IN_DB" + not_in_db += 1 + + elif row[0] is None: + status = "⚠ DB_NO_COMPLETION" + db_no_completion += 1 + + else: + status = "✅ DB_COMPLETED" + db_completed += 1 + + # --------------------------------------------- + # Output + # --------------------------------------------- + print(f"{status} | {name}") + print(f" Hash: {thash}") + print(f" UltraCC completion: {completion_dt}") + if row and row[0]: + print(f" DB completion : {row[0]}") + print() + + # ================================================= + # SUMMARY + # ================================================= + print("------------------------------------------------") + print("📊 SUMMARY") + print(f"Completed torrents in UltraCC : {total_completed}") + print(f"NOT IN DB : {not_in_db}") + print(f"DB WITHOUT COMPLETION : {db_no_completion}") + print(f"DB COMPLETED : {db_completed}") + print("------------------------------------------------") + + +if __name__ == "__main__": + main()