reporter
This commit is contained in:
123
10Library.py
Normal file
123
10Library.py
Normal file
@@ -0,0 +1,123 @@
|
||||
import os
|
||||
import psycopg2
|
||||
from psycopg2 import extras
|
||||
from tqdm import tqdm
|
||||
import time
|
||||
import sys
|
||||
|
||||
# --- KONFIGURACE ---
|
||||
DB_CONFIG = {
|
||||
"host": "192.168.1.76", # Doplňte IP adresu svého Unraidu/Postgresu
|
||||
"database": "files",
|
||||
"user": "vladimir.buzalka",
|
||||
"password": "Vlado7309208104++",
|
||||
"port": "5432"
|
||||
}
|
||||
|
||||
DIRECTORY_TO_SCAN = "//tower/Library"
|
||||
BATCH_SIZE = 2000 # Zvýšeno na 2000 pro ještě lepší efektivitu u 5M souborů
|
||||
|
||||
|
||||
# --------- ----------
|
||||
|
||||
def scan_to_postgres():
|
||||
conn = None
|
||||
total_count = 0
|
||||
files_batch = []
|
||||
|
||||
try:
|
||||
conn = psycopg2.connect(**DB_CONFIG)
|
||||
cur = conn.cursor()
|
||||
|
||||
# Inicializace tabulky
|
||||
cur.execute("""
|
||||
CREATE TABLE IF NOT EXISTS library_files
|
||||
(
|
||||
id
|
||||
SERIAL
|
||||
PRIMARY
|
||||
KEY,
|
||||
file_path
|
||||
TEXT
|
||||
NOT
|
||||
NULL,
|
||||
file_name
|
||||
TEXT
|
||||
NOT
|
||||
NULL,
|
||||
file_size_bytes
|
||||
BIGINT,
|
||||
indexed_at
|
||||
TIMESTAMP
|
||||
DEFAULT
|
||||
CURRENT_TIMESTAMP
|
||||
);
|
||||
""")
|
||||
conn.commit()
|
||||
|
||||
print(f"🚀 Zahajuji indexaci: {DIRECTORY_TO_SCAN}")
|
||||
|
||||
# Progress bar s automatickým škálováním jednotek (k, M)
|
||||
pbar = tqdm(
|
||||
unit=" soubor",
|
||||
unit_scale=True,
|
||||
unit_divisor=1000,
|
||||
desc="Probíhá skenování",
|
||||
dynamic_ncols=True
|
||||
)
|
||||
|
||||
def save_batch(batch_data):
|
||||
"""Pomocná funkce pro zápis do DB"""
|
||||
insert_query = "INSERT INTO library_files (file_path, file_name, file_size_bytes) VALUES %s"
|
||||
psycopg2.extras.execute_values(cur, insert_query, batch_data)
|
||||
conn.commit()
|
||||
|
||||
# Rychlé procházení pomocí os.scandir
|
||||
for root, dirs, files in os.walk(DIRECTORY_TO_SCAN):
|
||||
for name in files:
|
||||
full_path = os.path.join(root, name)
|
||||
try:
|
||||
# Získání metadat (velikost)
|
||||
file_size = os.path.getsize(full_path)
|
||||
files_batch.append((full_path, name, file_size))
|
||||
total_count += 1
|
||||
|
||||
if len(files_batch) >= BATCH_SIZE:
|
||||
save_batch(files_batch)
|
||||
pbar.update(len(files_batch))
|
||||
files_batch = []
|
||||
except (OSError, PermissionError):
|
||||
continue
|
||||
|
||||
# Uložení posledního neúplného zbytku
|
||||
if files_batch:
|
||||
save_batch(files_batch)
|
||||
pbar.update(len(files_batch))
|
||||
|
||||
pbar.close()
|
||||
print(f"\n✅ Hotovo! Celkem zaindexováno {total_count} souborů.")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n⚠️ Skenování přerušeno uživatelem. Ukládám rozpracovaná data...")
|
||||
if files_batch:
|
||||
try:
|
||||
save_batch(files_batch)
|
||||
print(f"Posledních {len(files_batch)} záznamů uloženo.")
|
||||
except:
|
||||
print("Nepodařilo se uložit poslední dávku.")
|
||||
sys.exit(0)
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ Chyba: {e}")
|
||||
finally:
|
||||
if conn:
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_time = time.time()
|
||||
scan_to_postgres()
|
||||
duration = time.time() - start_time
|
||||
print(
|
||||
f"⏱️ Celkový čas: {duration / 60:.2f} minut (rychlost: {int(5000000 / duration if duration > 0 else 0)} souborů/s)")
|
||||
Reference in New Issue
Block a user