Recon-ul pe practitioner M1 arată că unele lecții n-au nici audio nici
Vimeo iframe — doar un link "Descarcă rezumat PDF" (/resurse/*.pdf).
Scraperul vechi le clasifica drept "text" și le marca failed (HTML body
avea <50 chars).
- classify_lesson: detectează acum a[href$=".pdf"] → type="pdf".
- download_pdf_and_extract: download PDF via session autentificat
(pypdf reader) → transcript .txt cu header + conținut pe pagini →
șterge PDF sursă (preferință utilizator: nu păstrez sursele).
- Branch în main loop pentru type=="pdf".
- requirements.txt: + pypdf.
- transcribe.py: skip type in ("text", "pdf") — transcript e deja scris
de download.py.
Limitări: PDF-uri cu conținut vizual (infografice, diagrame) extrag
puțin text. Titlul și textul inline sunt capturate; restul rămâne
pentru review manual.
Testat pe 4 PDF-uri M1 practitioner (Premisele NLP, Forme de Pacing,
Gesturi de calmare, Exercitiu Pacing): 3/4 extract bun (877-3068 bytes),
1/4 conținut predominant grafic (203 bytes).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Un singur set de scripturi acum rulează pe orice curs configurat în
courses.py. Master rămâne la rădăcina repo (backward-compat M1-M6);
cursuri noi (ex. practitioner la shop.cursnlp.ro) primesc un root
dedicat (nlp-practitioner/) cu propriile artefacte.
- courses.py: config dict (master, practitioner) + course_paths() +
validate_manifest_course() (manifest fără course_key = master).
- download.py: --course + --modules; trei tipuri de lecții (audio HTTP,
Vimeo iframe via yt-dlp audio-only, text-only cu captură HTML);
merge cu manifest existent în loc de replace; strip [Audio] pentru
backward-compat paths.
- transcribe.py: --course + --modules; skip type==text; path-uri prin
course_paths(); validare course_key.
- summarize.py: --course + --compile; template prompt folosește
course['name']; scrie SUPORT_CURS.md cu LF explicit (WSL2 baseline).
- md_to_pdf.py: --course resolv-ă summaries_dir / pdf_dir per curs.
- run.bat: detectează master|practitioner ca primul argument,
propagă --course la sub-scripturi; backward-compat run.bat [modules].
- requirements.txt: + yt-dlp.
- .gitignore: nlp-practitioner/audio/, audio_wav/, scratch_recon.py, tmp_recon/.
- tests/test_regression.sh: 5 gate-uri read-only (import, schema,
disk-coherence, SUPORT_CURS byte-identic, cross-course isolation).
Regression curs master: PASS (manifest + SUPORT_CURS.md hash
identic cu baseline /tmp/suport_before.md).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adaugă al 4-lea nivel de sumarizare: caiete de facilitator cu corelații
cross-disciplinare (IFS, CNV, attachment theory, Brené Brown, neuroștiință),
exerciții cu script complet, și ghiduri de aplicare cu secvențe de cadrare
pentru 4 contexte (grup NLP, cercetași, CNV, self-coaching).
Fișiere noi (în summaries/, ne-tracked de .gitignore):
- 5 caiete: MODUL{1-5}_{CONCEPT}.md
- 5 aplicări: MODUL{1-5}_{CONCEPT}_APLICARI.md
- 5 cross-modul: INDEX_EXERCITII, HARTA_CONEXIUNI, GLOSAR_CREDINTE,
GHID_FACILITARE, METAFORE_POVESTI
Tracked:
- PROMPT_EXPERIENTIAL.md: prompt reutilizabil pentru M6
- TODOS.md: instrucțiuni complete pentru M6 (run.bat 6 + sumarizări + caiet)
- md_to_pdf.py: convertor markdown→PDF pentru summaries
- PROCES_SUMARIZARE.md: documentație proces sumarizare standard
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- run.bat: one-click pipeline (download, convert, transcribe)
- download.py: fetch audio from course platform
- transcribe.py: whisper.cpp batch transcription (CPU, WAV 16kHz)
- MP3->WAV conversion via ffmpeg
- --modules filter for splitting work across machines
- summarize.py: generate summaries from transcripts
- setup_whisper.py: auto-download whisper.cpp, ffmpeg, and model
- Medium model (q5_0) instead of large to avoid VRAM crashes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>