the database
The Lytro Desktop stores metadata about the pictures and stories in a local database. The database is powered by SQLite, an engine storing data in isolated files. In this case, it is the database.db (library.db on Mac) file right in the Lytro library.
Not owning a Mac, I am unable to track updates there. See the archive page for Mac for database in the first version of the Lytro Desktop. The schema below is for version 3.
The database is required for the desktop software only. Although it too contains picture metadata, these are only duplicated from the picture files for performance purposes.
events, albums and pictures
Events, albums and pictures are the core building pieces of a library. Library is defined by a folder, each library has its own database. The process of importing anything into the library makes an event. In previous versions, users could name the individual events (stories) in order to group several pictures, however, this feature was replaced by the concept of albums. A library has a set of albums, and each album has a set of pictures.
tables
event |
| id (PK, int, not null) | row identifier, autoincrement |
| uuid (text, not null) | event id, unique |
| library_uuid (text, not null) | id of the library the pictures were imported into |
| time (text, not null) | timestamp of the import, yyyy-mmm-dd hh:MM:ss format |
| title (text, null) | name of the story (legacy) |
Each import creates a line in this table. Import always must happen into a library, if none is specified, a new one is created. If an old library with stories is imported, the names of the stories are preserved. Rows in this table are never deleted.
imported_picture_history |
| id (PK, int, not null) | row identifier, autoincrement |
| hash (text, not null) | picture hash |
The purpose of the this table is to remember which pictures were already imported to the computer and which not. This is used when you connect a camera to the computer and want to see new pictures only. Note that these rows are not deleted either, so if you import a picture and delete it from the computer, it still will not be visible under new pictures.
As everywhere else, the hash used is SHA1. This is the value of /picture/derivationArray metadata in the picture.
album |
| id (PK, int, not null) | row identifier, autoincrement |
| uuid (text, not null) | album id, unique |
| name (text, not null) | album name |
| description (text, not null) | album description, currently not accessible from UI |
| creation_date (text, not null) | timestamp of the album, yyyy-mmm-dd hh:MM:ss format |
| user_id (text, not null) | not used, zero guids |
| flagged (integer, not null) | not used, 0 |
| public (integer, not null) | not used, 1 |
| sort_order (integer, not null) | for custom album sort |
Basic information about the albums. The unused fields are conspicuously similar to the fields that are used for publishing photos online. When an album is deleted, it is removed from the table.
picture |
| id (PK, int, not null) | row identifier, autoincrement |
| uuid (int, not null) | picture id, unique |
| hash (text, not null) | picture hash |
| name (text, not null) | LFP file name, or, img###### if imported from camera |
| imagebin_uuid (FK, text, not null) | name of the folder in the library where the picture is |
| event_uuid (text, not null) | import event id |
| caption (text, not null) | picture title, currently not accessible from UI |
| capture_date (text, not null) | when the picture was taken, yyyy-mm-dd hh:MM:ss format |
| import_date (text, not null) | when the picture was imported, yyyy-mm-dd hh:MM:ss format |
| flag_status (int, not null) | 1 if picture marked as favorite, 0 otherwise |
| rating (int, not null) | number of stars the picture received in the desktop application, -1 if rejected |
| image_height (int, not null) | picture height in pixels |
| image_width (int, not null) | picture width in pixels |
| aspect_ratio (real, not null) | the ratio of picture width to height |
| lfe_state (int, not null) | state of processing, zero bit — has refocus stack, first bit — has perspective stack |
| crop_width (int, not null) | not used, 0 |
| crop_height (int, not null) | not used, 0 |
| translation_x (int, not null) | not used, 0 |
| translation_y (int, not null) | not used, 0 |
This is the primary table for pictures. The date fields can have 'not-a-date-time' value. Other suggests that we can expect cropping feature soon. When a picture is deleted, it is remove from the table. However, the folders (image bins) are kept on the disk even if all pictures in them are deleted. There is separate table, image_bin which just holds the name of the folders ever used.
picture_metadata |
| id (PK, int, not null) | row identifier, autoincrement |
| uuid (FK, text, not null) | picture id, unique |
| camera_serial_number (text, not null) | camera serial number |
| camera_model (text, not null) | 0 Firefly (the only one published), 1 Blitzen |
| camera_mode (int, not null) | 1 Everyday Mode, 2 Creative Mode |
| demod_mode (int, not null) | how image was demodulated, 0 wasn't, 1 using metadata, 2 using calibration data |
| lfe_minor (int, not null) | light field engine minor version |
| lfe_major (int, not null) | light field engine major version |
| refocus_lambda (real, not null) | depth at which the picture was focused (the lesser number the closer to lens) |
| rotation (real, not null) | number of degress counter-clockwise the picture was rotated (multiples of 90°) |
| orientation (real, not null) | number of degress counter-clockwise the camera was rotated (multiples of 90°) |
| overscan (real, not null) | ? (either 0.0 or 1.05263 in my case, regardless of the camera used) |
| fnumber (real, not null) | aperture the picture was taken with |
| iso (int, not null) | sensitivity the picture was taken with |
| iso_set_manually (int, not null) | 0 automatic value, 1 manually set |
| focal_length (real, not null) | zoom factor, for the A1 model ranging from 42.9064 to 340.8256 |
| exposure (real, not null) | exposure value (EV), should be 0.0 if automatic control was happy |
| internal_nd_used (int, not null) | 0 neutral-density filter off, 1 filter on |
| shutter_speed (real, not null) | exposition time the picture was taken with |
| shutter_speed_set_manually (int, not null) | 0 automatic value, 1 manually set |
| depth_score (real, not null) | 0.0—1.0 score of how much depth is in the picture, -1.0 if not evaluated |
| postfilter_name (text, not null) | the name of filter applied |
| affine_transform (text, not null) | not used, empty |
The metadata cached from the picture files, for the info panel of the desktop software. Modifying them does not modify the underlying files. From the previous releases, exposure is a new information, set even in the automatic control, as well as depth score. Affine transform might promise some feature to look forward for.
The post filter names can be: '8-Track', 'Blur+', 'Carnival', 'Crayon', 'Film Noir', 'Glass', 'Line Art', 'Mosaic' and 'Pop'.
Apart from the tables above, the database file contains also two system tables, library_metadata and sqlite_sequence. Database encoding is UTF-8.
thumbnails
In contrast to the previous versions (or Mac), thumbnails are now kept and managed together with the light field files, at the dimensions of 300×300 pixels.
When a camera is connected to the computer and thumbnails from it fetched, they are stored at %TEMP%\nitro\library, where they are kept even when the pictures are deleted, at the dimensions of 128×128 pixels.
Disclaimer: Jan Kučera and miloush.net are not affiliated with or endorsed by Lytro, Inc. and the above information is not confirmed.