--- aliases: ["ImdbUpdate"] type: progetto --- # CLAUDE.md — ImdbUpdate **Ultimo aggiornamento:** 2026-04-11 (v2.1) ## Scopo Aggiornamento settimanale del database IMDb aziendale. Scarica 7 dataset IMDb (~5 GB), li elabora via DuckDB in-memory, produce `imdb.parquet` e `db_split_IMDB.accdb` (~1.25M titoli) e li distribuisce in `MonitorLinker` e `GemmaLoader.accdb`. **Scheduling:** ogni giovedì 14:00 via Frank (job #9, hostname W1251000160) **Durata run:** ~10-20 min (v2, DuckDB) | **Spazio temp:** ~5-8 GB (auto-cleanup al termine) ## Architettura (v2 — DuckDB) ``` IMDb datasets (imdbws.com) ↓ download (~1.5 min) Temp/*.tsv.gz → decompressione ↓ DuckDB read_csv in-memory, 4 step materializzati (~8-15 min) parquet/imdb.parquet (1.25M righe, ~51 MB, NO OTT_EMESSO) ↓ export batch pyodbc (~5-8 min) Temp/db_split_IMDB.accdb (Access ~500 MB) ↓ UPDATE via tabella OTT linkata (in template) IMDB.OTT_EMESSO popolato da db_split_OTT.accdb (linked table) ↓ copia I:\...\MonitorLinker\db_split_IMDB.accdb I:\SOFTWARE\PYTHON_SRV\PYTHON_LOCAL\MyICR_Suite\local_db\parquet\imdb.parquet C:\IcrMonitor\MonitorLinker\db_split_IMDB.accdb GemmaLoader.accdb (Acquisti — opzionale, legge da parquet) ``` ## Struttura ``` ImdbUpdate/ ├── src/ │ ├── downloader.py # Download + gzip decompression (invariato) │ ├── transformer.py # DuckDB: legge TSV, 4-step materializzati, scrive parquet │ └── access_exporter.py # Parquet→Access, enrich OTT via linked table, copia destinazioni, GemmaLoader ├── Empty/ │ └── db_split_IMDB.accdb # Template Access con schema e indici ├── parquet/ │ └── imdb.parquet # Output primario (non in git) ├── config.py # Path, URL, parametri processing ├── main.py # Pipeline v2: 5 step └── RUN.bat # Launcher con auto-detect ODBC 32/64-bit ``` ## Pipeline v2.1 (main.py) ``` 0-cleanup_on_startup | 1-prep_temp | 2-download 3-transform→parquet (DuckDB) | 4-access+enrich_OTT | 5-gemma | 6-log | 7-cleanup ``` Step 4 dettaglio: 1. Copia template Empty/db_split_IMDB.accdb (ha tabella OTT linkata → db_split_OTT.accdb) 2. Import parquet → tabella IMDB (11 colonne, no OTT_EMESSO) 3. UPDATE IMDB.OTT_EMESSO via tabella OTT linkata (SVOD, MAX data inizio) 4. Copia accdb in destinazioni (I:\, C:\IcrMonitor) ## Python embedded Due versioni embedded (NON in git — copiare manualmente da C:\SCHEDULAZIONI\PYTHON\ImdbUpdate\): - `python64/` — per ODBC Access 64-bit (default su A) - `python32/` — per ODBC Access 32-bit (fallback) `RUN.bat` auto-rileva quale driver ODBC è installato e usa il Python appropriato. ## Dipendenze (incluse nell'embedded) - `duckdb` — transform in-memory (core v2) - `requests` — download dataset - `pyodbc` — ODBC Access (bridge OTT + write Access + GemmaLoader) - `tqdm` — progress bars ## Dipendenze inter-progetto - **`C:\PYTHON\ParquetToAccess`** — usato da `access_exporter.py` per la conversione parquet→Access (`core.exporter.export()`). Deve essere presente sulla macchina. ## Gotcha - **Password GemmaLoader** in `config.py` (`GEMMA_LOADER_PASSWORD`) — non mettere in git - **GemmaLoader** è opzionale: se la connessione fallisce (rete/permessi) il processo continua - **OTT enrichment** avviene via tabella OTT linkata nel template Access (`Empty/db_split_IMDB.accdb`), punta a `I:\SOFTWARE\ProcedureICR\ICRmonitor\MonitorLinker\db_split_OTT.accdb`. Se non raggiungibile, OTT_EMESSO resta NULL, non blocca - **Tabella OTT linkata**: collegata manualmente in Access al template — se il template viene ricreato da zero, va ricollegata (Dati Esterni → Database Access → Collega tabelle) - **DuckDB in-memory**: ~2-4 GB RAM durante transform (title_akas ~50M righe) — verificare RAM disponibile su macchina schedulatrice - **LOG_DIR** punta a `I:\SOFTWARE\ProcedureICR\...` — deve essere raggiungibile - **Parquet path Windows**: DuckDB richiede forward slash (`/`) — convertito automaticamente in transformer.py e access_exporter.py - **Spazio temp**: ~5-8 GB (solo TSV, no SQLite) — auto-eliminati a fine run - Progetto originale in `C:\SCHEDULAZIONI\PYTHON\ImdbUpdate\` — non eliminare (backup v1) ## Opzioni CLI ```bat RUN.bat # Esecuzione completa (schedulazione) RUN.bat --debug # Finestra aperta al termine RUN.bat --skip-download # Usa file già scaricati in Temp/ RUN.bat --keep-temp # Non eliminare file temporanei ```