#!/usr/bin/env python3 # -*- coding: utf-8 -*- import pymysql import pandas as pd import os from datetime import datetime # ============================== # ⚙ KONFIGURACE # ============================== DB_CONFIG = { "host": "192.168.1.76", "port": 3307, "user": "root", "password": "Vlado9674+", "database": "torrents", "charset": "utf8mb4" } # Cílová složka (používám 'r' před řetězcem pro bezpečné načtení zpětných lomítek) OUTPUT_DIR = r"u:\Dropbox\!!!Days\Downloads Z230" FILE_NAME = f"Torrents_Report_{datetime.now():%Y-%m-%d}.xlsx" # Spojíme cestu a název souboru FULL_OUTPUT_PATH = os.path.join(OUTPUT_DIR, FILE_NAME) # ============================== # 📥 NAČTENÍ DAT # ============================== def get_data(): print("⏳ Připojuji se k databázi a stahuji data...") conn = pymysql.connect(**DB_CONFIG) query = """ SELECT id, category, title_visible AS 'Název', size_pretty AS 'Velikost', added_datetime AS 'Přidáno do DB', qb_state AS 'Stav v QB', qb_progress AS 'Postup (%)', qb_savepath AS 'Cesta na disku', qb_completed_datetime AS 'Dokončeno', qb_last_update AS 'Poslední info' FROM torrents ORDER BY added_datetime DESC """ df = pd.read_sql(query, conn) conn.close() return df # ============================== # 🎨 FORMÁTOVÁNÍ EXCELU # ============================== def auto_adjust_columns(writer, df, sheet_name): """Bezpečné automatické nastavení šířky sloupců""" worksheet = writer.sheets[sheet_name] for idx, col in enumerate(df.columns): series = df[col] max_len = len(str(col)) # minimálně délka hlavičky for val in series: if val is None or (isinstance(val, float) and pd.isna(val)): length = 0 else: length = len(str(val)) if length > max_len: max_len = length max_len = min(max_len + 2, 60) worksheet.set_column(idx, idx, max_len) # ============================== # 🚀 HLAVNÍ LOGIKA # ============================== def generate_report(): # 1. Kontrola cesty if not os.path.exists(OUTPUT_DIR): print(f"❌ CHYBA: Cílová složka neexistuje nebo není dostupná: {OUTPUT_DIR}") print(" Ujistěte se, že je disk U: připojen.") return df = get_data() print(f"✅ Načteno {len(df)} záznamů.") # 2. ÚPRAVA DAT df['Postup (%)'] = df['Postup (%)'].fillna(0).astype(float).round(1) # 3. FILTROVÁNÍ # A) DEAD mask_dead = df['Stav v QB'].isin(['dead', 'invalid']) df_dead = df[mask_dead].copy() # B) COMPLETED mask_completed = ( (df['Stav v QB'] == 'completed') | (df['Postup (%)'] >= 100) ) & (~mask_dead) df_completed = df[mask_completed].copy() # C) ACTIVE / QUEUED mask_active = (~mask_dead) & (~mask_completed) df_active = df[mask_active].copy() # Seřazení df_active = df_active.sort_values(by=['Postup (%)', 'Přidáno do DB'], ascending=[False, False]) df_completed = df_completed.sort_values(by='Dokončeno', ascending=False) df_dead = df_dead.sort_values(by='Poslední info', ascending=False) # 4. EXPORT print(f"💾 Ukládám do: {FULL_OUTPUT_PATH}") try: with pd.ExcelWriter(FULL_OUTPUT_PATH, engine='xlsxwriter') as writer: # List 1: Ke stažení df_active.to_excel(writer, sheet_name='Ke stažení', index=False) auto_adjust_columns(writer, df_active, 'Ke stažení') # List 2: Hotovo df_completed.to_excel(writer, sheet_name='Hotovo', index=False) auto_adjust_columns(writer, df_completed, 'Hotovo') # List 3: Dead df_dead.to_excel(writer, sheet_name='Smazáno (Dead)', index=False) auto_adjust_columns(writer, df_dead, 'Smazáno (Dead)') # List 4: Vše df.to_excel(writer, sheet_name='Kompletní DB', index=False) auto_adjust_columns(writer, df, 'Kompletní DB') print("🎉 Hotovo! Report byl úspěšně uložen na disk U:") except Exception as e: print(f"❌ Chyba při zápisu souboru: {e}") if __name__ == "__main__": generate_report()