Files
torrents/82 Reporting.py
2026-02-01 07:18:20 +01:00

153 lines
4.4 KiB
Python

#!/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()