GitHub - gcomneno/gyte: GiadaWare YouTube Transcript Extractor (original) (raw)

GiadaWare YouTube Toolkit Extractor — extract transcript, audio e video da YouTube via yt-dlp + bash.

GYTE è una mini–suite da linea di comando per scaricare da YouTube in modo pulito:

Basato su yt-dlp, con script pensati per corsi interi e playlist lunghe.

⚠️ GYTE non aggira alcuna protezione DRM.
Usa YouTube tramite yt-dlp così com'è.
Sta a te rispettare Termini di Servizio e copyright dei contenuti.


Requisiti


🔍 gyte-doctor

Per verificare velocemente se l'ambiente è pronto per usare GYTE:

Controlla:

Ritorna exit code 0 se le dipendenze essenziali sono OK, 1 altrimenti.


Installazione

Clona il repository:

git clone https://github.com/gcomneno/gyte.git cd gyte

Installazione rapida (script di install)

Dalla root del progetto:

chmod +x install/gyte-install ./install/gyte-install

Di default gli script verranno symlinkati in:

Puoi scegliere una directory diversa usando:

./install/gyte-install --prefix "/percorso/personalizzato"

oppure

./install/gyte-install --prefix "/percorso/personalizzato"

Assicurati che la directory scelta sia nel tuo PATH.
In caso di dubbi, puoi usare anche:

per verificare rapidamente l’ambiente.

Installare ffmpeg

GYTE usa ffmpeg per:

Esempi di installazione:

Ubuntu / Debian

sudo apt update sudo apt install ffmpeg ffmpeg -version

macOS (Homebrew)

brew install ffmpeg ffmpeg -version

Su altri sistemi operativi puoi installare ffmpeg tramite il gestore di pacchetti distribuzione-specifico oppure scaricare un build precompilato e aggiungerlo al PATH.


🚀 Installazione CLI (user-level, no sudo)

GYTE fornisce una serie di comandi gyte-* accessibili da qualunque directory del sistema. L’installazione è locale all’utente, non richiede privilegi elevati e non modifica componenti globali.

✔ Installazione standard

Dalla root del repository:

Questo installer:

Al termine, se ~/.local/bin è nel tuo PATH, puoi usare direttamente:

gyte-transcript gyte-transcript-pl gyte-audio gyte-video gyte-translate gyte-reflow-text gyte-merge-pl gyte-whisper-local ...

✔ Installazione in una directory scelta dall’utente

Puoi scegliere una directory personalizzata, purché sia sotto $HOME:

./install/gyte-install --prefix "$HOME/bin"

oppure tramite variabile d’ambiente:

./install/gyte-install --prefix "$HOME/bin"

⚠ Nota di sicurezza

L’installer è progettato per ambienti user-level: se scegli cartelle esterne a $HOME, l’operazione potrebbe fallire (e non è consigliata). Nessun file viene mai sovrascritto senza che venga segnalato. Nessuna chiave API viene letta, usata o memorizzata durante l’installazione. Se la directory di destinazione non è nel PATH, lo script mostra un messaggio con la riga da aggiungere al tuo ~/.bashrc.


Comandi disponibili

1. Trascrizioni — gyte-transcript

Video singolo o playlist: scarica sottotitoli (normali o auto–generati) e produce, per ogni video, i file di testo/markup seguenti nella directory di output.

Esempio base:

gyte-transcript 'https://www.youtube.com/watch?v=VIDEO_ID'

Per ogni video ottieni:

Di default lo script prova le lingue it,en (prima italiano, poi inglese).
Le lingue sono configurabili via env:

YT_TRANSCRIPT_LANGS="en,fr" gyte-transcript 'https://www.youtube.com/watch?v=VIDEO_ID'

In caso di errori temporanei (es. HTTP 429 da YouTube), lo script prova comunque a pulire i .vtt eventualmente scaricati.

Directory di output

Per default i file vengono creati nella directory corrente.

Puoi cambiare la cartella di output in due modi:

via variabile d’ambiente

GYTE_OUTDIR="/tmp/gyte-out" gyte-transcript 'https://www.youtube.com/watch?v=VIDEO_ID'

via flag (ha priorità su GYTE_OUTDIR)

gyte-transcript --outdir "/tmp/gyte-out" 'https://www.youtube.com/watch?v=VIDEO_ID'

Priorità:

  1. --outdir
  2. GYTE_OUTDIR
  3. directory corrente

2. Trascrizioni su playlist — gyte-transcript-pl

Pensato per corsi interi / playlist lunghe.

Esempio:

gyte-transcript-pl 'https://www.youtube.com/playlist?list=PLXXXXX' 4

Oppure partendo da una URL con watch + list=:

gyte-transcript-pl 'https://www.youtube.com/watch?v=AAA&list=PLXXXXX' 4

Cosa fa:

  1. Normalizza l'URL in
    https://www.youtube.com/playlist?list=PLXXXXX
  2. Recupera il titolo della playlist
  3. Crea una cartella:
yt-playlist-NOME_PLAYLIST  
  1. Dentro quella cartella:
    • salva urls.txt con tutte le URL dei video
    • lancia fino a MAX_JOBS processi gyte-transcript in parallelo (default: 4)
    • genera, per ogni video, i file .txt, .srt, .md descritti sopra
    • genera playlist.md, con:
      * # Playlist: NOME_PLAYLIST in testa (se disponibile)
      * una sezione ## ... per ogni video, in ordine playlist, con il relativo transcript Markdown

Suggerimento: se YouTube inizia a rispondere con molti HTTP 429 (Too Many Requests), puoi ridurre il parallelismo, ad esempio:

gyte-transcript-pl 'https://www.youtube.com/playlist?list=PLXXXXX' 1

Oppure usare la modalità sequenziale (--no-parallel) con una pausa tra un video e l’altro:

GYTE_SLEEP_BETWEEN=2 gyte-transcript-pl --no-parallel 'https://www.youtube.com/watch?v=AAA&list=PLXXXXX'


3. Merge transcript di playlist — gyte-merge-pl

Dopo aver generato i transcript di una playlist con gyte-transcript-pl, puoi unire tutti i .txt in un unico file “merged” ordinato:

cd yt-playlist-NOME_PLAYLIST gyte-merge-pl

Cosa fa:

# [N] Titolo video (ID)  
# File: filename.txt  

Utile per avere un unico “malloppone” di testo per l’intera playlist.


4. Solo audio — gyte-audio

Scarica solo l'audio dei video (o playlist) e lo converte in MP3 (o altro formato supportato da ffmpeg).

Esempio:

gyte-audio 'https://www.youtube.com/watch?v=VIDEO_ID'

Impostazioni di default:

Qualità e formato (audio)

Puoi personalizzare il formato / la qualità in due modi.

API storica (ancora supportata):

AUDIO_FORMAT=opus AUDIO_QUALITY=160K gyte-audio 'https://www.youtube.com/watch?v=VIDEO_ID'

API GYTE (ha priorità se impostata):

GYTE_AUDIO_FORMAT=opus GYTE_AUDIO_QUALITY=160K gyte-audio 'https://www.youtube.com/watch?v=VIDEO_ID'

Priorità:

  1. GYTE_AUDIO_FORMAT / GYTE_AUDIO_QUALITY
  2. AUDIO_FORMAT / AUDIO_QUALITY
  3. default interni dello script (mp3 / 192K)

Funziona anche con playlist (--yes-playlist è già attivo), salvando un file audio per ogni video.


5. Video completo — gyte-video

Scarica il miglior video+audio disponibili e li unisce in un unico file.

Esempio:

gyte-video 'https://www.youtube.com/watch?v=VIDEO_ID'

Caratteristiche:

Formato di output (video)

Puoi cambiare il formato container di output (quando supportato da yt-dlp/ffmpeg) impostando:

GYTE_VIDEO_FORMAT=mkv gyte-video 'https://www.youtube.com/watch?v=VIDEO_ID'

Se GYTE_VIDEO_FORMAT non è impostato, lo script usa il formato predefinito (mp4), come nelle versioni precedenti.

Supporta anche playlist:

gyte-video 'https://www.youtube.com/playlist?list=PLXXXXX'


6. Reflow testo — gyte-reflow-text

Normalizza un .txt (ad esempio generato da gyte-transcript) in modo “comodo da leggere / diffare / dare in pasto ad AI”.

Di default fa entrambi:

Modalità esplicite:

Opzioni utili:

Esempi:

default: paragraphs + sentences

gyte-reflow-text lecture1.en.txt > lecture1.en.sentences.txt

solo compattazione

gyte-reflow-text --paragraphs lecture1.en.txt > lecture1.en.paragraphs.txt

solo split in frasi (input già compattato)

gyte-reflow-text --sentences lecture1.en.paragraphs.txt > lecture1.en.sentences.txt

output più “terminal/diff friendly”

gyte-reflow-text --max-width 100 lecture1.en.txt > lecture1.en.wrap.txt

stats (non sporca lo stdout)

gyte-reflow-text --stats lecture1.en.txt > /dev/null

Nota: lo splitter è “smarter” e prova a NON spezzare su abbreviazioni IT/EN (Prof., e.g., Mr.), decimali/versioni (3.14, v1.2) ed enumerazioni (1., A.).

Demo rapida: examples/reflow-splitter-demo.sh (con sample in examples/reflow-splitter-sample.txt).

Preset AI-friendly

Transcript -> reflow "AI-friendly" -> translate (comando AI esterno)

gyte-transcript URL --outdir out/ gyte-reflow-text --ai-friendly out/video.it.txt > out/video.it.ai.txt GYTE_AI_CMD='gyte-openai --model gpt-4.1-mini' gyte-translate --to en out/video.it.ai.txt

Sanitizzazione UTF-8 (opt-in)

Esempio file "sporco" (byte non UTF-8)

printf 'ok\xffbad\n' > /tmp/dirty.txt

Ripulisce e garantisce stdout UTF-8 valido

gyte-reflow-text --strict-utf8 /tmp/dirty.txt > /tmp/dirty.clean.txt


7. Traduzione AI dei transcript — gyte-translate

Usa un comando AI esterno (configurato via GYTE_AI_CMD) per tradurre i transcript generati da GYTE (.txt, .md, ecc.).

Esempio:

export GYTE_AI_CMD='my-ai-wrapper --model gpt4' gyte-translate --to en lecture.it.txt

-> produce: lecture.en.txt

Regole di naming default:


8. Trascrizione locale MP4/audio — gyte-whisper-local

gyte-whisper-local usa un comando di speech-to-text locale (di default whisper) per estrarre transcript da file locali (.mp4, .mp3, ecc.), senza passare da YouTube.

Esempio base:

gyte-whisper-local lesson1.mp4

Cosa fa:

Opzioni principali:

Env utili:

Esempi:

Modello small, lingua auto, output nella cwd

gyte-whisper-local "Git-GitHub-CrashCourse.mp4"

Forza lingua inglese e mette tutto in ./transcripts

GYTE_OUTDIR="transcripts" gyte-whisper-local --lang en "Git-GitHub-CrashCourse.mp4"

Usa un binario STT alternativo (es. wrapper personale)

GYTE_STT_BIN="my-whisper-wrapper" gyte-whisper-local lesson1.mkv

Dopo la generazione puoi combinare con gli altri strumenti GYTE, ad esempio:

gyte-reflow-text "Git-GitHub-CrashCourse.txt" > "Git-GitHub-CrashCourse.en.sentences.txt"

gyte-translate --from en --to it "Git-GitHub-CrashCourse.en.sentences.txt"


📦 Output filesystem & Manifest API

gyte-explain produce un output strutturato su filesystem. Questa struttura è stabile e pensata come API per script, tooling e post-processing automatico.

Struttura generale

out/
└── gyte-explain-YYYYMMDD-HHMMSS/
    ├── manifest.json              # RUN manifest
    └── items/
        └── 001/
            ├── manifest.json      # ITEM manifest
            ├── title.txt
            ├── url.txt
            ├── langs.txt
            ├── row.tsv
            ├── transcript.txt     # se disponibile
            ├── summary.txt        # se generato
            └── transcript_error.txt  # in caso di errore

RUN manifest — out/<run>/manifest.json

Contiene:

Esempio (ridotto):

{ "schema": "gyte.manifest.run.v1", "gyte_version": "v1.1.0", "run": { "id": "gyte-explain-20260203-124339", "status": "ok" }, "config": { "ai_mode": "local", "langs": ["it", "en"], "argv": ["gyte-explain", "1", "--ai", "local"] }, "counts": { "items_total": 1, "items_ok": 1, "items_error": 0 }, "items": { "001": { "status": "ok", "path": "items/001/manifest.json" } } }


ITEM manifest — out/<run>/items/<ID>/manifest.json

È sempre scritto, anche in caso di errore.

Campi chiave:

Esempio (errore URL):

{ "schema": "gyte.manifest.item.v1", "id": "001", "status": "invalid_url", "transcript_source": "none", "summary_source": "none", "error_message": "invalid url", "paths": { "title": "title.txt", "url": "url.txt", "transcript_error": "transcript_error.txt" } }

👉 Garanzia: tool esterni possono fidarsi del manifest senza dover inferire stato dai file.


✨ v1.1.0 — Manifest API & determinismo

Novità principali

Garanzie

Perché conta


Modulo AI esterno – gyte-translate

gyte-translate non contiene nessuna logica di AI “interna: si limita a prendere un file di testo e a passarlo a un comando esterno che legge da stdine scrive il risultato sustdout`.

Il comando esterno viene configurato tramite:

export GYTE_AI_CMD='my-ai-wrapper --model gpt4'

Durante l’esecuzione, GYTE imposta due variabili d’ambiente che il comando può usare:

Uso base

gyte-translate --to en lecture.it.txt

-> legge lecture.it.txt

-> invoca: SRC_LANG=auto TARGET_LANG=en bash -c "$GYTE_AI_CMD"

-> salva il risultato in lecture.en.txt

Opzioni principali

Note su chiavi API e limiti

gyte-translate non gestisce chiavi API, token, retry, throttling, ecc.
Tutta la logica di autenticazione e di gestione errori è a carico del comando configurato in GYTE_AI_CMD.

Questo permette di usare:


Integrazione AI (opzionale)

Alcune funzioni (es. gyte-openai + gyte-translate) richiedono il client Python openai.

Installazione opzionale:

python -m venv .venv source .venv/bin/activate pip install -r requirements-optional.txt

Poi esporta:

export OPENAI_API_KEY='sk-...' export GYTE_AI_CMD='gyte-openai --model gpt-4.1-mini'


Esempio: usare gyte-translate con OpenAI (gyte-openai)

Il repository include un wrapper di riferimento per OpenAI:

⚠️ Sicurezza API key

Prerequisiti:

pip install openai export OPENAI_API_KEY="sk-..." # NON committare mai questa riga

Poi puoi configurare GYTE così:

export GYTE_AI_CMD='gyte-openai --model gpt-4.1-mini'

esempio: traduci da italiano a inglese

gyte-translate --from it --to en sample.it.txt

-> produce: sample.en.txt

Se non specifichi --from, gyte-translate usa auto come lingua sorgente (o GYTE_AI_SOURCE_LANG se impostata).

Puoi verificare la configurazione senza chiamare l’API con --dry-run:

echo "Ciao mondo, questo è un test." > sample.it.txt

SRC_LANG=it TARGET_LANG=en gyte-openai --model gpt-4.1-mini --dry-run < sample.it.txt

Il wrapper:


Esempi GYTE

La cartella examples contiene esempi pratici di utilizzo di GYTE:

Questi file sono solo dimostrativi: sostituisci le URL e i nomi file con quelli che ti servono nel tuo contesto reale.


Come impostare la lingua per le trascrizioni

Per impostazione predefinita, gyte-transcript usa:

YT_TRANSCRIPT_LANGS="it,en"

cioè:

Puoi cambiare questo comportamento impostando l'env prima del comando.

Solo inglese

YT_TRANSCRIPT_LANGS="en" gyte-transcript "https://www.youtube.com/watch?v=VIDEO_ID"

Francese con fallback su inglese

YT_TRANSCRIPT_LANGS="fr,en" gyte-transcript "https://www.youtube.com/watch?v=VIDEO_ID"

Se vuoi forzare una lingua meno comune (es. tedesco) sapendo che spesso ci sono solo auto–sub:

Solo tedesco

YT_TRANSCRIPT_LANGS="de" gyte-transcript "https://www.youtube.com/watch?v=VIDEO_ID"

Nota: l’ordine delle lingue in YT_TRANSCRIPT_LANGS è significativo: viene usata la prima disponibile nell’elenco.


🔐 Sicurezza & Privacy

GYTE è progettato secondo i principi DevSecOps minimalisti, con l’obiettivo di evitare rischi comuni nella supply-chain, nell’uso di wrapper AI e negli script shell. Non raccoglie né invia alcun dato proprio: tutto avviene localmente, tramite strumenti standard.

✦ Come GYTE protegge l’utente

Nessuna chiave nel codice o negli script.

Tutti i segreti (es. OPENAI_API_KEY) devono essere forniti solo tramite variabili d’ambiente. GYTE non stampa mai il valore di tali variabili.

Wrapper yt-dlp “blindati”.

Gli script rifiutano opzioni pericolose come:--exec*, --postprocessor-args, --run-postprocessor

impedendo l’esecuzione accidentale di comandi arbitrari.

Validazione input rigorosa.

Le URL devono iniziare con http(s)://(così non possono trasformarsi in opzioni nascoste tipo -someflag).

Nessuna dipendenza remota eseguita automaticamente.

Non esistono sequenze curl | sh, script bootstrap legacy o download silenziosi.

Limitazione volontaria degli input AI.

Gli script di traduzione supportano:

per evitare di inviare per errore file enormi ai provider AI.

File generati esclusi dal repository.

Il .gitignore protegge il repo da:

✦ Cosa non fa GYTE (per scelta)

✦ Buone pratiche consigliate


Roadmap

Vedi il file docs/ROADMAP.md per i dettagli.


Specs & Commands


Licenza

Rilasciato sotto licenza MIT.
Vedi il file LICENSE per i dettagli.