3 luglio 2014 01:22
Cataloghi Lightroom e database SQLite
Come avevo accennato in questo post, un catalogo di Adobe Lightroom altro non è che un database SQLite che si può aprire con un qualsiasi tool di management. Ne esistono moltissimi, io mi sono trovato abbastanza bene con Sqlite Database Browser, che è free e offre un editor di query molto semplice ma che fa il suo lavoro; un tool più professionale ma a pagamento può essere Sqlite Maestro.
È ovvio che sul database non dovremmo MAI andare a scrivere (a meno che non sappiamo esattamente costa stiamo facendo), pena la possibile corruzione del catalogo, così come dovremo avere chiuso il programma Lightroom che apre il db in modo esclusivo. Il mio consiglio è quello di farsi una copia del catalogo e operare su quello, soprattutto per i primi esperimenti.
Le tabelle che compongono il database sono molte (94) e non è sicuramente mia intenzione documentarle tutte: purtroppo non lo fa nemmeno Adobe in quanto non ho trovato una descrizione esaustiva della struttura di tabelle e campi. Fortunatamente i nomi sono abbastanza autoesplicanti, quindi con un po’ di pazienza si riesce a capire cosa contengono e quali sono le relazioni tra una e l’altra.
La tabella principale da cui partire è la Adobe_Images che contiene tutte le immagini che abbiamo importato con i dati salienti della fotografia (formatofile, risoluzione, data di scatto, aspect ratio, ecc.); interessante già solo con questa tabella avere una statistica di quale è la percentuale di scatti che facciamo in orizzontale o in verticale (campo orientation che vale ‘AB’ per le landscape e ‘BC’ per le portrait). Esempio:
select COUNT(*), orientation from Adobe_images
GROUP by orientation
La seconda tabella principe è la AgLibraryFile in cui invece troviamo i dettagli del file fisico; le due tabelle sono legate tra di loro tramite il campo AgLibraryFile.id_local (che è sempre il nome della chiave primaria di ogni tabella) e il campo Adobe_Images.rootFile
Ci si aspetterebbe che le due tabelle avessero lo stesso numero di record, mentre invece spesso non è così; ad esempio se abbiamo creato delle Virtual Copy di una foto, i record nella Adobe_Images sono in numero maggiore, occhio quindi da che verso facciamo la join se non vogliamo perdere record o se vogliamo statistiche univoche (tutte le virtual copies sono facilmente ricavabili filtrando per il campo Adobe_Images.masterImage > 0).
Per avere i riferimenti al path fisico dove si trova il file dobbiamo interrogare due ulteriori tabelle: la AgLibraryRootFolder contiene i drive e i folder di più alto livello che abbiamo importato, mentre la AGlibraryFolder contiene tutti i subfolders
select id_local, absolutePath, name, relativePathFromCatalog from AglibraryRootFolder
select root.Name, folder.pathfromRoot from aglibraryFolder folder
JOIN AgLibraryRootFolder root ON root.id_local = folder.rootFolder
where absolutepath like 'C:%'
Possiamo avere quindi il nome completo del file con un semplice append di campi (che in SQLite si ottiene come in Oracle con l’operatore || )
SELECT image.id_Global, file.id_local , root.absolutePath || folder.pathFromRoot || file.baseName || '.' || file.extension AS fullName
FROM Adobe_images image
JOIN AGlibraryFile file ON file.id_local = image.rootfile
JOIN AGlibraryFolder folder ON folder.id_local = file.folder
JOIN AgLibraryRootFolder root ON root.id_local = folder.rootFolder
Order by root.absolutePath || folder.pathFromRoot || file.baseName || '.' || file.extension
La struttura di queste tabelle basi è quindi questa:
Se vogliamo cominciare a divertirci con le statistiche sui valori EXIF dobbiamo iniziare dalla tabella AgHarvestedExifMetadata (linkata con il campo image a Adobe_Images) che contiene diaframma, tempo esposizione, ISO, lunghezza focale ed eventuali informazioni GPS se la foto fosse geotaggata. Per estrarre i nomi del modello di camera e dell’obiettivo usati, dobbiamo linkare due tabelle di lookup chiamate AgInternedExifCameraModel e AgInternedExifLens
Attenzione che alcune immagini (es. un jpg salvato “save from web” da Photoshop) potrebbero non avere all’interno i dati Exif, quindi è sempre meglio usare una LEFT JOIN per evitare di perdere record nei conteggi. Ecco un esempio di query per estrarre quello che vediamo anche nelle finestre Metadata di LightRoom
SELECT file.idx_filename, Camera.Value as Camera, LensRef.value as LensName, FocalLength, ISOSpeedRating
FROM Adobe_images image
JOIN AGlibraryFile file on image.rootfile = file.id_local
JOIN AgharvestedExifMetadata metadata ON image.id_local = metadata.image
LEFT JOIN AgInternedExifLens LensRef ON LensRef.id_Local = metadata.lensRef
LEFT JOIN AgInternedExifCameraModel Camera ON Camera.id_local = metadata.cameraModelRef
ORDER BY Camera.Value, LensRef.Value
Per chi come me fa largo uso delle Collection, sono utili le tabelle AgLibraryCollection (che contengono anche le Smart Collection e i Collection Set) e la AgLibraryCollectionImage che è la tabella di join n a n con le immagini. Analogamente la AgLibraryKeyword contiene le singole occorrenze delle Keyword usate e la AgLibraryKeywordImage è la tabella di join.
Mi fermo qui, in quanto penso di aver dato abbastanza spunti per chi fosse interessato all’argomento. Il fatto di usare un normalissimo database non proprietario è sicuramente un vantaggio e un pregio di questo fantastico programma; farsi un programma via web, client o una app mobile per estrarsi statistiche, mirroring di dati o integrazioni con altro software diventa quindi un’operazione “semplice” e fattibile. Speriamo che Adobe continui a mantenere aperto il db e in questo formato.