Ansel eredita da Darktable la sua struttura portante di database: le cronologie di modifica non distruttive vengono salvate per ogni immagine in un database SQLite, insieme ai metadati e ad altri dati definiti dall’utente. Rendere il database consapevole di nuove immagini avviene tramite l’«importazione» delle immagini da un disco o da una scheda di memoria. È qui che entra in gioco lo strumento di importazione.
Purtroppo, l’importatore di Darktable è un’altra di quelle cose massacrate intorno al 2020 e trasformate in qualcosa di profondamente sconcertante, essendo un file browser che non somiglia a nessun file browser precedentemente noto, e che riesce a mancare di funzioni basilari (come Ctrl+F o l’anteprima EXIF) pur restando appesantito da funzioni inutili (vedi sotto). È qui che perdiamo molti futuri utenti, ed è solo lo step 0 del flusso di lavoro. Che magnifica vetrina di ciò che una «app per il flusso di lavoro» sa fare!
Una revisione del design di ciò che il design per comitato ti riserva
Dunque Darktable ha i pulsanti di importazione su un widget della barra laterale. Ce ne sono 3 se hai collegato una fotocamera tramite USB, 2 altrimenti:

Molti post nei forum si sono persi nello spiegare più e più volte quale fosse la differenza tra aggiungi alla libreria e importa e copia (importa in realtà significa aggiungi alla libreria). Vale anche la pena di menzionare che il pulsante montaggio fotocamera non fa nulla di più di ciò che qualsiasi driver PTP o MTP di sistema fa per te: montare la scheda SD interna come archivio USB esterno, tramite la porta USB della fotocamera. Su Windows questo richiede l’installazione di un driver USB personalizzato che impedirà alla tua fotocamera di funzionare con il resto del sistema operativo. Su Linux, a seconda che il tuo sistema operativo abbia il «montaggio automatico» abilitato, potresti dover prima smontare la fotocamera dal file browser del desktop, altrimenti bloccherà il collegamento. Su tutti i sistemi operativi, questo richiede di rimanere in ascolto di nuovi dispositivi in background continuamente affinché l’applicazione possa reagire al collegamento a caldo, che tu abbia intenzione o meno di usare la funzione.
E poi ci sono i parametri. Dal 2022, il team di Darktable si è perdutamente innamorato di quei cassetti richiudibili che nascondono il superfluo sotto altro superfluo. E il superfluo che ci trovi non fa nulla di più che premere Ctrl+A (seleziona tutte le immagini), e poi 0 o 1 (per assegnare una valutazione iniziale di 0 o 1 stella) o riempire le informazioni dei metadati (in blocco) nell’omonimo modulo, che sta nell’interfaccia del tavolo luminoso che ti piaccia o no, e supporta i preset nel caso tu riutilizzi sempre gli stessi metadati. Il motivo per cui aggiungere questi parametri lì fosse addirittura un requisito in primo luogo mi supera. Qualcuno, da qualche parte, sta probabilmente risparmiando 0,5 s per sessione di importazione, che il resto del mondo perde scorrendo più altezza.
Dunque, ammesso che tu abbia compreso le differenze tra tutte quelle opzioni, ora clicchi su importa e copia, che è probabilmente la più usata, dato che qualsiasi fotografo ha bisogno di svuotare le schede SD in un archivio più permanente. E poi…

Questo equivale sostanzialmente ad ammettere che il design è così terribile da rasentare l’inutilizzabilità senza leggere la documentazione. Ma aspetta, cosa stavamo facendo di preciso? Stiamo copiando immagini. Stiamo copiando immagini? E allora hai superato il tuo esame di copia delle immagini e ottenuto la tua laurea in copia delle immagini? Se non l’hai fatto, dovresti. Attenzione, potrebbero trasformarlo in un quiz in una versione futura e disabilitare la funzione se lo fallisci.
Dunque clicchi su quel pulsante minaccioso che dichiara che ti assumi la piena responsabilità di qualsiasi danno possa derivare dal copiare immagini. Oppure non lo fai, visto che sembra un po’ spaventoso. Ma diciamo che lo fai…

Aspetta, dove sono le immagini? È forse un lettore di log? Tira un dado a 12 facce, e se fai un 8, scoprirai che quelle icone a forma di occhio sono reattive e, una volta cliccate, mostrano una miniatura. Anzi, se clicchi sull’occhio nell’intestazione della colonna, mostrerà tutte le miniature in una volta. E scombussolerà la spaziatura delle righe, ma qui puntiamo alla medaglia di cioccolato, quindi è più che giusto:

Mettiti seduto per il resto, non sei pronto:
- Il coso cartelle nella colonna di sinistra è in realtà un pulsante: quando lo clicchi, cambia l’ordine di comparsa di quelle cartelle.
- Il riquadro luoghi cerca di emulare i preferiti o i segnalibri del gestore desktop del tuo sistema operativo, ma non li importa.
- La casella directory ricorsiva non è un’opzione, è un’azione. Ma poi non agisce su ciò che hai selezionato nella colonna di destra, perché quelle sono solo immagini. Ciò che fa è prendere la cartella selezionata nella colonna di sinistra e popolare l’elenco delle immagini scansionando ricorsivamente la cartella selezionata e le sue sottocartelle.
- Il seleziona nuove immagini è, ancora una volta, non un’opzione ma un’azione, ovvero qualcosa che il resto del mondo mette in un pulsante.
- Il campo sovrascrivi la data odierna è un espediente per il fatto che la data
EXIFdell’immagine non può essere usata nei pattern delle cartelle, quindi per impostazione predefinita usiamo la data odierna. Tranne se questo campo è compilato. Ma deve essere compilato con una data e ora che seguano il formato ISO 8601. Cosa che qui non ho fatto, e la finestra non si lamenta affatto perché la validazione degli input dei moduli è meno divertente che lasciare che gli utenti scoprano allo step successivo di dover ricominciare da zero a causa di un formato di data e ora errato. Cavolo, quante conoscenze pregresse per compilare una benedetta data, sono davvero fortunato ad aver imparato tutto questo leggendo il codice sorgente. - L’opzione mantieni il nome file originale è del tutto ridondante rispetto all’uso del pattern di denominazione
$(FILE_NAME).$FILE_EXTENSION), - I pattern di denominazione usano maschere di variabili
$()che vengono sostituite in fase di esecuzione dalle proprietà effettive del file, ma devi conoscerle per poterle usare. Come se un tale di nome Houz non avesse scritto una libreria intorno al 2011 per implementare il completamento automatico negli input di testo per quelle variabili, che puoi semplicemente richiamare nel tuo codice per farlo funzionare in 2 righe (è usata nel modulo di esportazione). - I pattern di denominazione che trovi lì sono duplicati nel popup delle preferenze di Darktable, perché potresti aver bisogno di cambiarli quando non stai importando nulla.
Questo è fatto della materia della frustrazione. Ciò che è davvero incredibile è quante persone abbiano lavorato a questa funzione nel corso degli anni per arrivare a questo. Qualcuno lo chiamerebbe intelligenza collettiva , ma in realtà si chiama design per comitato .
Un nuovo approccio, ovvero cancellare la trasandatezza dallo step 0
Importare immagini è davvero lo step 0 del lavoro con qualsiasi applicazione di editing delle immagini. È inaccettabile perdere utenti così presto, soprattutto dato che ci aspettiamo tanto da loro in seguito, quando si tratta di comprendere la luce e il colore. Ma sosterrò che luce e colore sono il pane quotidiano di qualsiasi artista grafico, e sembra giusto aspettarsi che gli utenti di editing fotografico padroneggino le basi del loro mestiere a un certo punto.1 D’altro canto, chiedere agli utenti di conseguire il master in copia dei file è inaccettabile.
Guillaume Stutin e io abbiamo quindi riscritto interamente lo strumento di importazione, prima il front-end e poi il back-end. Ecco il risultato.

L’opzione per montare direttamente la scheda di memoria delle fotocamere da GPhoto2 è stata rimossa del tutto, dato che il sistema operativo può gestire questo passaggio direttamente se necessario. C’è un solo punto di accesso per l’importazione. Poi ottieni la finestra di selezione dei file:

Il file browser è un widget file chooser Gtk nativo, il che significa che i segnalibri del sistema operativo (e persino qui le cartelle sincronizzate di Nextcloud) vengono importati automaticamente dall’ambiente desktop. L’anteprima dell’immagine è stata estesa con i metadati EXIF per identificare meglio le immagini. Una ricerca nel database della libreria mostra se l’immagine era già stata importata o meno in Ansel o Darktable, e dove.2
I tipi di immagine (raw, non raw o tutti) vengono filtrati usando i filtri nativi di Gtk e l’elenco completo dei file da importare viene costruito direttamente nell’interfaccia, senza congetture nel back-end. Quando vengono selezionate delle cartelle, il loro contenuto viene automaticamente scansionato in modo ricorsivo e viene mostrata la prima immagine della raccolta. Il numero finale di immagini rilevate viene visualizzato sotto il file chooser:

Molte opzioni di ordinamento e visualizzazione sono gestite nativamente dal file chooser Gtk, inclusa la ricerca (tramite Ctrl+F), senza lavoro aggiuntivo:

L’opzione di gestione dei file abilita l’importazione con o senza copia, l’etichetta spiega la differenza a parole intere:

La data del progetto è automaticamente impostata a quella odierna, senza sovrascritture o alcunché che suggerisca che qualcosa di non dichiarato stia altrimenti avvenendo per impostazione predefinita. Per impostare la data viene fornito un widget calendario che formatta automaticamente la data nel corretto formato ISO. Se la data viene digitata direttamente nell’input di testo, viene eseguita una validazione del formato e viene visualizzato un riscontro di errore:


Nota che il widget calendario supporta solo la data (anno, mese, giorno). L’impostazione dell’ora (ore, minuti, secondi) va fatta manualmente nel campo di testo. I sondaggi mostrano che questo serve raramente.
I pattern di denominazione di cartelle e file supportano automaticamente il completamento automatico delle variabili, quando viene digitato $(. Il nuovo back-end di importazione supporta l’uso dei campi EXIF delle immagini per definire i nomi delle cartelle, per esempio un pattern di cartella come $(JOBCODE)-$(EXIF.ISO) suddividerebbe le immagini in diverse cartelle nominate secondo i loro metadati ISO. Quando ciò accade, il tavolo luminoso apre l’ultima cartella creata alla chiusura della finestra di importazione:

Dulcis in fundo, una funzione richiesta dagli utenti: poter visualizzare in anteprima il risultato dei pattern definiti sull’immagine attualmente selezionata:

Il risultato del pattern segue i file e le cartelle selezionati, così come qualsiasi modifica nella cartella principale e nei pattern. Nota che la directory di base (per tutti i progetti) non accetta più pattern, dato che non c’è motivo di mettere pattern ovunque, il che permette di usare un widget di elenco cartelle Gtk sicuro e semplice. In questo modo, almeno la cartella Ansel di livello superiore viene impostata in maniera robusta e intuitiva, e se accadono danni dai pattern di denominazione, saranno racchiusi all’interno di qualcosa di prevedibile.
Conclusione
Va notato che questo design grafico più semplice comporta anche una struttura di codice molto più semplice, meno righe e una logica più lineare. Il front-end necessita di 1200 righe, e il back-end circa 400 righe (commenti inclusi, il nuovo backend ha docstring Doxygen quasi ovunque). Gran parte del volume di codice del front-end proviene dallo scanner ricorsivo delle cartelle, che gira in un thread separato per non bloccare il thread dell’interfaccia, ma aggiorna comunque periodicamente i conteggi dei file per fornire un riscontro. Questo è stato testato con cartelle di più di 60.000 immagini.
Darktable ha più di 2700 righe di front-end e più di 800 righe di back-end (nessuna docstring). Inoltre, l’architettura di Darktable prevede una cartella di destinazione per ogni sessione di importazione, il che vieta di usare gli EXIF di ogni singola immagine nei pattern di denominazione delle cartelle, e ha percorsi di codice completamente diversi per gestire le discrepanze tra con copia/senza copia. Questo rende difficile mantenere i due percorsi sincronizzati perché condividono comunque alcuni pezzi (l’aggiunta al database e l’inizializzazione dei metadati). In Ansel, abbiamo unito i due percorsi con solo un’operazione di I/O iniziale opzionale per copiare i file se necessario.
Il front-end e il back-end di importazione di Ansel comunicano attraverso un elenco stupidamente semplice di percorsi di file, il che significa che il back-end non fa congetture su qualsiasi decisione dell’utente presa nell’interfaccia. Inoltre, tutto il codice dell’interfaccia è stato rimosso dal backend. Questo è un design generico e robusto che permetterà modi alternativi di produrre un elenco di file da importare, per esempio in modalità headless (da uno script). In precedenza, cose come il filtraggio dei JPG o il riordino dei file avvenivano nel back-end.3
Il fascino principale del design ripulito è che tutte le informazioni necessarie per capire cosa è cosa sono accessibili direttamente nella finestra, senza dover aprire una documentazione. In caso di conflitti tra nomi di file di destinazione durante l’importazione con copia, gli utenti vengono avvisati con una finestra popup e i file esistenti non vengono mai sovrascritti. Per non parlare del fatto che il tutto somiglia a un tipico file browser.
Alcuni utenti hanno anche espresso il desiderio di usare le funzioni di editing del software senza essere infastiditi dalla stranezza della gestione interna delle risorse digitali (il tavolo luminoso, principalmente). Questo nuovo importatore permette loro di aprire singole immagini direttamente nella camera oscura tramite doppio clic sul file o clic sul file + clic sul pulsante importa, bypassando di fatto interamente il tavolo luminoso.
I pattern di denominazione sono stati, ovviamente, rimossi dal popup delle preferenze (che, tra l’altro, si trova dal menu globale, tramite Modifica → Preferenze, come in qualsiasi software sano).
Molti ringraziamenti a Guillaume Stutin per il suo lavoro certosino su questo argomento.
Note
Il nuovo importatore è disponibile per le versioni di build di Ansel > 0.0.0+780.Translated from English by : Claude. In case of conflict, inconsistency or error, the English version shall prevail.
Yes, I know it’s already too much to ask in most cases. ↩︎
This reuses the Darktable code but with a clearer display. ↩︎
The whole notion of back-end vs. front-end is new to the Darktable ecosystem, as you will find GUI (Gtk) functions pretty much everywhere, protected by a recurring
if(darktable.gui)to prevent segmentation faults when the software runs from CLI. ↩︎