import os import pymysql import sys import blake3 # Nutné: pip install blake3 # ============================== # ⚙️ NASTAVENÍ # ============================== LOCAL_ROOT = r"U:\#Syncthing" # !!! AŽ SI BUDEŠ JISTÝ, ZMĚŇ NA True !!! DELETE_MODE = False # Hledáme shodu pouze v souborech, které jsou na serveru v této cestě: REMOTE_FOLDER_FILTER = "/#ColdData/Porno/" # DB Nastavení DB_HOST = "192.168.1.76" DB_PORT = 3307 DB_USER = "root" DB_PASS = "Vlado9674+" DB_NAME = "torrents" DB_TABLE = "file_md5_index" # ============================== def get_db_connection(): try: return pymysql.connect( host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASS, database=DB_NAME, cursorclass=pymysql.cursors.DictCursor ) except Exception as e: sys.exit(f"❌ Chyba DB: {e}") def calculate_blake3(file_path): """Spočítá BLAKE3 hash souboru""" h = blake3.blake3() try: with open(file_path, "rb") as f: while True: chunk = f.read(4 * 1024 * 1024) # 4MB chunks if not chunk: break h.update(chunk) return h.digest() except OSError: return None def main(): print(f"🚀 TERMINÁTOR: Mazání podle obsahu (BLAKE3)") print(f" 📂 Zdroj: {LOCAL_ROOT}") print(f" 🎯 DB filtr: {REMOTE_FOLDER_FILTER}") print(f" 🛠 Mód: {'🔴 OSTRÝ (MAZÁNÍ)' if DELETE_MODE else '🟢 SIMULACE (BEZPEČNÝ)'}") print("=====================================================") # 1. NAČTENÍ HASHŮ Z DB print("📡 Stahuji hashe ze serveru...") remote_hashes = set() conn = get_db_connection() with conn.cursor() as cursor: sql = f"SELECT blake3 FROM {DB_TABLE} WHERE full_path LIKE %s" cursor.execute(sql, (f"%{REMOTE_FOLDER_FILTER}%",)) rows = cursor.fetchall() for row in rows: remote_hashes.add(row['blake3']) print(f"✅ V paměti mám {len(remote_hashes):,} unikátních hashů ze serveru.") print("=====================================================") # 2. SKENOVÁNÍ A MAZÁNÍ count_scanned = 0 count_match = 0 size_freed = 0 for root, dirs, files in os.walk(LOCAL_ROOT): # Přeskočit syncthing složky if ".stfolder" in dirs: dirs.remove(".stfolder") if ".stversions" in dirs: dirs.remove(".stversions") for filename in files: file_path = os.path.join(root, filename) count_scanned += 1 # Výpis práce print(f"⏳ [{count_scanned}] Zpracovávám: {filename}") # Spočítat lokální hash local_hash = calculate_blake3(file_path) if local_hash is None: print(f" ⚠️ Chyba čtení souboru!") continue # Zobrazíme kousek hashe pro kontrolu (převedeme na hex text) hash_preview = local_hash.hex()[:8] # JE TEN HASH V DATABÁZI? if local_hash in remote_hashes: count_match += 1 file_size = os.path.getsize(file_path) size_freed += file_size print(f" ✅ SHODA (Hash: {hash_preview}...) -> {'🗑️ MAŽU' if DELETE_MODE else '📦 NAŠEL BYCH'}") if DELETE_MODE: try: os.remove(file_path) # Pokus o smazání prázdné složky try: os.rmdir(root) except: pass except OSError as e: print(f" ❌ Chyba mazání: {e}") else: print(f" ❌ Žádná shoda (Hash: {hash_preview}...) -> Nechávám být") print("\n\n📊 VÝSLEDEK") print("=====================================================") print(f"🔎 Prošlo rukama: {count_scanned:,} souborů") print(f"🗑️ Smazáno/Shoda: {count_match:,} souborů") print(f"💾 Ušetřené místo: {size_freed / (1024 * 1024):.2f} MB") print("=====================================================") if not DELETE_MODE and count_match > 0: print("💡 TIP: Až budeš připraven, změň v kódu: DELETE_MODE = True") if __name__ == "__main__": main()