110 lines
4.7 KiB
Python
Executable File
110 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: UTF-8 -*-
|
|
import sqlite3
|
|
from datetime import datetime
|
|
|
|
|
|
def extractor(dt_file, start, end):
|
|
catalog = {}
|
|
conn = sqlite3.connect(dt_file)
|
|
cursor = conn.cursor()
|
|
req = "SELECT id, model, lens, exposure, aperture, iso, focal_length, datetime_taken, width, height FROM images;"
|
|
cursor.execute(req)
|
|
res = cursor.fetchall()
|
|
for data in res:
|
|
img_date = datetime.strptime(data[7], "%Y:%m:%d %H:%M:%S")
|
|
if start <= img_date <= end:
|
|
catalog.update({
|
|
data[0]:
|
|
{
|
|
'camera': data[1],
|
|
'lens': data[2],
|
|
'shutter': float(data[3]*1000),
|
|
'aperture': round(float(data[4]), 1),
|
|
'iso': int(data[5]),
|
|
'focal': float(data[6]),
|
|
'datetime': img_date,
|
|
'height': int(data[9]),
|
|
'width': int(data[8])
|
|
}
|
|
})
|
|
cameras, lenses, focals, apertures, shutter_speeds = {}, {}, {}, {}, {}
|
|
isos, dimensions, cameras_lenses, dates = {}, {}, {}, {}
|
|
cameras_list, lenses_list, focals_list, apertures_list, shutter_speeds_list = [], [], [], [], []
|
|
isos_list, dimensions_list, cameras_lenses_list, dates_list = [], [], [], []
|
|
for item in catalog.keys():
|
|
cameras_list.append(catalog[item]['camera'])
|
|
lenses_list.append(catalog[item]['lens'])
|
|
if catalog[item]['lens'] and "---" not in catalog[item]['lens']:
|
|
cameras_lenses_list.append(
|
|
"{} + {}".format(catalog[item]['camera'], catalog[item]['lens']))
|
|
focals_list.append(round(float(catalog[item]['focal']), 1))
|
|
apertures_list.append(catalog[item]['aperture'])
|
|
shutter_speeds_list.append(catalog[item]['shutter'])
|
|
isos_list.append(catalog[item]['iso'])
|
|
dimensions_list.append(
|
|
round(((catalog[item]['height']*catalog[item]['width'])/10**6), 1))
|
|
dates_list.append(catalog[item]['datetime'].strftime("%Y%m%d"))
|
|
for camera in list(set(cameras_list)):
|
|
if camera:
|
|
cameras.update({camera: cameras_list.count(camera)})
|
|
for lens in list(set(lenses_list)):
|
|
if lens and "---" not in lens:
|
|
lenses.update({lens: lenses_list.count(lens)})
|
|
for camera_lense in list(set(cameras_lenses_list)):
|
|
if camera_lense:
|
|
cameras_lenses.update(
|
|
{camera_lense: cameras_lenses_list.count(camera_lense)})
|
|
for focal in list(set(focals_list)):
|
|
if focal:
|
|
focals.update({focal: focals_list.count(focal)})
|
|
for aperture in list(set(apertures_list)):
|
|
if aperture:
|
|
apertures.update({aperture: apertures_list.count(aperture)})
|
|
for shutter_speed in list(set(shutter_speeds_list)):
|
|
if shutter_speed:
|
|
shutter_speeds.update(
|
|
{shutter_speed: shutter_speeds_list.count(shutter_speed)})
|
|
for iso in list(set(isos_list)):
|
|
if iso:
|
|
isos.update({iso: isos_list.count(iso)})
|
|
for dimension in list(set(dimensions_list)):
|
|
if dimension:
|
|
dimensions.update({dimension: dimensions_list.count(dimension)})
|
|
for date in list(set(dates_list)):
|
|
if date:
|
|
dates.update({date: dates_list.count(date)})
|
|
return {
|
|
"total": len(catalog.keys()),
|
|
"date": dates,
|
|
"cameras": cameras,
|
|
"lenses": lenses,
|
|
"cameras+lenses": cameras_lenses,
|
|
"focals": focals,
|
|
"apertures": apertures,
|
|
"shutter_speeds": shutter_speeds,
|
|
"isos": isos,
|
|
"dimensions": dimensions
|
|
}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
import json
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("infile", help="darktable library")
|
|
parser.add_argument("-s", "--start-date", help="start date as YYYYMMDD. If omitted, begin of the collection.", const=None)
|
|
parser.add_argument("-e", "--end-date", help="end date as YYYYMMDD. If omitted, today", const=None)
|
|
args = parser.parse_args()
|
|
if not args.start_date:
|
|
args.start_date = "18250101" # Ok, that's the year of the 1st photography by Nicéphore Niépce. Shoul'd be enough for a start date.
|
|
if not args.end_date:
|
|
args.end_date = datetime.strftime(datetime.now(), "%Y%m%d")
|
|
try:
|
|
datetime.strptime(args.start_date, "%Y%m%d")
|
|
datetime.strptime(args.end_date, "%Y%m%d")
|
|
except ValueError:
|
|
print("Date must be YYYYMMDD.")
|
|
exit()
|
|
print(json.dumps(extractor(args.infile, datetime.strptime(args.start_date, "%Y%m%d"), datetime.strptime(args.end_date, "%Y%m%d")), indent=4, sort_keys=True))
|