Il blog di Sandro Rizzetto

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
imageimage

 

select root.Name, folder.pathfromRoot from aglibraryFolder folder 
JOIN AgLibraryRootFolder root ON root.id_local = folder.rootFolder 
where absolutepath like 'C:%' 
imageimage

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:

diag1

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

diag2

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


image

image

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.

diag3

image

 

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.

Commenti (1) -

  • Roberto

    03/07/2014 10:27:58 | Rispondi

    Grande, farò una prova al più presto.
    Vediamo quali sono le focali e le aperture che uso di più, oltre alle lenti

Pingbacks and trackbacks (2)+

Aggiungi Commento

Copyright © 1997-2017 Sandro Rizzetto | All Rights Reserved | Riproduzione delle fotografie vietata | Powered by me