Quattro giorni fa ho raccontato che Titan funzionava, finché non l’ha letto Opus 5.5. Lo stesso trattamento è toccato all’altro programma che tengo in piedi per Runtime Radio, Runtime FeedDownloader Pro: quello che scarica e conserva interi archivi di podcast.
Dal 19 agosto non l’avevo più toccato. Ad agosto era diventato software libero, l’aggiornamento automatico aveva retto la prova sul campo, e io avevo smesso di guardarci dentro. Il 23 ottobre è uscita la 1.6.0, scritta con Claude Opus 5.5: cinque difetti gravi, diciannove medi, dieci lievi, un’interfaccia rifatta da capo e un gruppo di funzioni nuove pensate per chi archivia.

Si poteva già, ma non si capiva
Tutto è partito da una domanda mia, insieme alla richiesta di una revisione completa: si può scaricare un podcast «dal giorno X al giorno Y»?
Si poteva. Il filtro per data c’era, solo che stava dietro un pulsante a scomparsa, e il comando per scaricare diceva «Scarica tutto». Chi filtrava un anno e premeva quel pulsante scaricava davvero solo l’anno filtrato, ma per arrivarci bisognava fidarsi di un’etichetta che diceva il contrario. Se lo chiedevo io, che il programma l’ho fatto, non poteva capirlo nessun altro.

Nella 1.6 la fascia dei filtri è sempre aperta e ha il Periodo: gli ultimi 30 o 90 giorni, gli ultimi dodici mesi, quest’anno, l’anno scorso, oppure due date scelte a mano. Il pulsante dice che cosa farà, «Scarica i 22 filtrati», e il pannello a destra aggiorna il conto e lo spazio stimato a ogni filtro che cambi.

Prima di partire, una conferma riepiloga periodo, spazio stimato, spazio libero sul disco e cartella di destinazione.

Il guardiano che dava l’allarme per tutto
A maggio avevo raccontato di aver costruito una cassaforte e poi provato a scassinarla. Una delle serrature era l’impronta SHA-256: a ogni download FeedDownloader calcola l’impronta del file e la registra, e la Verifica dell’archivio la ricalcola per accorgersi se un file si è guastato sul disco.
Il difetto più grave stava proprio lì. Chi aveva acceso i tag ID3, cioè titolo, autore e copertina scritti dentro il file MP3, si ritrovava con un archivio in cui ogni episodio risultava «corrotto». L’impronta veniva registrata un attimo prima che i tag riscrivessero il file: la Verifica confrontava il file finito con la fotografia di un file che non esisteva più, e il ritrovamento dei file spostati, che si basa sulla stessa impronta, non trovava niente. Adesso l’ordine è quello giusto, prima i tag e poi l’impronta, e per i file già colpiti c’è Accetta i file attuali come riferimento.
Gli altri quattro gravi hanno lo stesso sapore.
- La scrittura dei tag cancellava quelli dell’editore, compresi capitoli e copertina originale, e bloccava l’interfaccia mentre rileggeva e riscriveva l’intero file.
- L’archivio era legato alla cartella corrente. Bastava cambiare la cartella di download nelle Impostazioni perché l’intera libreria risultasse «mancante», con l’invito a segnarla da riscaricare. Ora ogni episodio ricorda dove sta, e cambiando cartella il programma chiede se spostare l’archivio o usare la cartella nuova solo per i prossimi download.
- Senza rete, l’avviso diceva «download in pausa», ma nessuno li fermava. Un calo di linea trasformava un lotto intero in una fila di errori nel giro di un minuto. Adesso la coda si ferma da sola e riparte dal punto in cui era quando torna la connessione.
- I download avviati da un singolo episodio erano invisibili: il pannello compariva solo per i lotti, e quel download non si poteva né fermare né mettere in pausa.

E poi diciannove medi
Nessuno, da solo, rompeva il programma. Messi in fila descrivono un’app che andava benissimo finché non le chiedevi qualcosa di insolito. La coda si perdeva a ogni chiusura. «Sincronizza» accodava tutti gli episodi mancanti di un feed senza chiedere niente. Un file M4A senza estensione nell’indirizzo diventava un .mp3. Il limite di banda valeva per ogni singolo file, così tre download a 500 KB/s ne facevano 1,5 MB/s. La playlist M3U era ordinata per il testo della data, cioè in pratica per giorno della settimana. Nelle versioni installate restava il menu di Electron, e un Ctrl+R distratto ricaricava l’interfaccia a metà download.
Uno riguarda la riservatezza: i caratteri dell’interfaccia arrivavano da Google Fonts a ogni avvio, una richiesta di rete e un indirizzo IP consegnato a terzi per disegnare delle lettere. Adesso sono dentro il programma. L’elenco completo, voce per voce, sta nel changelog della 1.6.0.

Un programma da archivista
FeedDownloader non è un lettore di podcast e non vuole diventarlo. Serve a chi un archivio lo vuole tenere tutto, su un disco o su un NAS, e la 1.6 aggiunge le funzioni che a quel lavoro mancavano.
L’archivio automatico si accende feed per feed: quando un controllo trova episodi nuovi, li scarica senza chiedere. La coda sopravvive alla chiusura e a un blocco del programma, e al riavvio propone di riprendere. Accanto a ogni file si possono salvare i metadati dell’episodio, con note, numerazione e impronta, e per ogni podcast un podcast.json con la copertina. Il modello dei nomi dei file accetta anche stagione ed episodio.
La Verifica ora ha due modi. La rapida controlla che ogni file ci sia e abbia la dimensione giusta, e dura pochi secondi. La completa ricalcola tutte le impronte: su un NAS può volerci molto, e per questo adesso ha l’avanzamento e un pulsante per fermarla, cosa che prima non aveva.

La schermata iniziale è diventata la Libreria: una tabella di tutti i feed con gli episodi, quanti sono archiviati, quanti mancano, lo spazio occupato e l’ultimo controllo, ordinabile per colonna.

Viola, e in orizzontale
L’interfaccia è gemella di quella di Titan, nella catena viola del marchio di FeedDownloader invece che in blu. Ogni coppia di colori, cinquantanove in tutto, è controllata da uno script contro le soglie WCAG 2.2 AA, nessun testo scende sotto i 12 pixel e tutto si ingrandisce dall’80 al 180 per cento.
Su un punto ho dovuto insistere più di una volta. FeedDownloader è un programma da scrivania, e lo schermo di un computer è largo: i pannelli stanno affiancati, ognuno con il proprio scorrimento, invece di impilarsi uno sotto l’altro come in una pagina web vista dal telefono. Le prime viste della 1.6 erano nate impilate, e le ho fatte rifare.
Quello che resta
Come per Titan, il conto si può fare. I test automatici sono passati da 394 a 440, e le correzioni sono state provate nell’app vera, con un profilo separato e un podcast pubblico, senza toccare la mia libreria: periodo, pausa e ripresa, stacco della rete, chiusura con la coda piena, cambio di cartella.
A maggio scrivevo che una cassaforte si giudica dalla serratura. Stavolta la serratura teneva, ma il guardiano che doveva controllarla dava l’allarme per tutto, e la chiave stava appesa a una cartella che bastava spostare.
FeedDownloader resta gratuito e sotto licenza MIT, per Windows e Linux. Si scarica dalla pagina su Ecosystem oppure dalle release su GitHub.
