-- Darktable Datenbank
Darktable verwendet zum Speichern von Informationen eine einfach aufgebaute Sqlite3 Datenbank mit 16 Tabellen. Die Datenbank ist immer vom User abhängig und abgespeichert unter ~./config/darktable/library,db. Sie können die Datenbank ganz einfach mit z.B. dem Sqlite DB Browser öffnen, aber auch per SQL Befehl auslesen bzw. editieren.
darktable-db utility Revision 0.5
Mit dem unten aufgeführten darktable-db Skirpt können Sie nützliche Informationen aus der Datenbank abrufen und auch Bilder ohne darktable zu öffnen exportieren. Zum Kennzeichnung, welche Bilder exportiert werden sollen werden die Farblabel aus Darktable verwendet. Markieren Sie mit darktable dazu einfach die Foto die Sie exportieren wollen mit z.B. einem geben Punkt. Zwei Farbpunkte für ein Bild sind zwar in darktable möglich, erzeugen aber bei darktable-db Fehler!
Das Skript befindet sich noch in der Entwicklung, daher fehlen noch die Fehlerabfangroutinen bei falschen Eingaben! Bei fehlerfreier Eingabe funktioniert das Utility aber. Bitte führen Sie das Skript nur als normaler user aus. Das Ausführen mit dem root user funktioniert nicht! Wenn Sie nach dem expotieren die Farblable automatisch umstellen wollen, dann erstellen Sie bitte vorher eine Sichungskopie der darktable Datenbank. Wie Sie eine Sicherungskopie der Datenbank erstellen können Sie hier nachlesen.
darktable-db Feature:
- Anzeigen von Informationen zur darktable datenbank (Farbpunkte, Pfade)
- Anzeige von Informationen zum Fotoarchiv (Dateien und Sterne)
- Export von Bildern die in darktable mit einem Farbpunkt gekennzeichnet wurden. Die entwickelten RAW-Daten können als jpg, png, tif, ppm, pfm oder pdf exportiert werden.
- Beim Exportieren kann die Bildgröße angepasst werden
- Export von einem Verzeichnis (Filmrolle) oder rekursiv über alle Verzeichnisse (Filmrollen) aus der Datenbank
- Verschiedene Modi für die Behandlung, wenn schon ein Bitmap im Zielverzeichnis vorhanden ist
- Optional kann bei dem export der Farbpunkt auf eine gewünschte Farbe umgestellt werden
- Die Verwendung von darktable-db mit root ist nicht möglich
- Der Export von Bildern die mit mehr als einem Farbpunkt gekennzeichnet sind ist nicht möglich
- Erstellen von Datenbank Backups und wieder herstellen der Datenbank aus einem Backups
- Sychronisation vom Rating (Sterne) aus der darktable Datenbank mit den Bitmaps in dem Fotoarchiv. Die Bitmap müssen dafür im gleichen Ordner liegen wie die Raw Dateien. Wenn nach dem Export von Bildern das Rating in der Datenbank geändert wird, dann wird das Rating Tag im Bitmap nicht aktualisiert. Mit der Option -u können Sie das korregieren. Das Synchonisieren dauer sehr lange und lohnt sich daher nur, wenn viele Bilder aktualisiert werden sollen. Nur die Bitmaps JPG, PNG und Tif besitzen ein Rating Tag.
darktable-db Anhängigkeiten:
Für die fehlerfreie Ausführung von darktable-db sind die folgenden Programme notwendig
- darktable-cli (Paket darktable)
- sqlite3 (Paket sqlite3)
- ls, wc, cut, rm, whoami, md5sum, printf (Paket coreutils)
- grep (Paket grep)
- exiftool (Paket libimage-exiftool-perl und perl-doc)
darktable-db -h
Usage: -h | -c |-r |-s | -q |-v | -e colorlable | -m write mode | -f export format | -i path | -o path | -l colorlable | -x width | -y hight
Options:
-h Help | Display this help message and exit |
- c Create database backup | Save database file to ~/.config/darktable/db_backups |
- r Replace database file | Overwrites the database file with a selected backup |
-s Show database report | Shows darktable database informations |
-q Quality and quantity report | Shows photo library information |
-u Update bitmap rating | Synchronize darktable rating with bitmaps |
-v Version | Database API version |
-e Export colorlabled bitmap | red, yellow, green, blue, magenta |
-m Write mode |
dav = Delete all exiting image versions and write new version, |
-f Export bitmap format | jpg, png, tif, ppm, pfm, pdf |
-i Input directory | /var/lib/photoarchiv or recursive |
-o Output direktory | Optional if different with input directory /var/lib/photoarchiv/export |
-l Switch colorlable after export to | red, yellow, green, blue, magenta |
-x Image width in pixel | Optional, default without scaling = 0 |
-y Image hight in pixel | Optinnal, default without scaling = 0 |
Beispiel 1:
Sie möchten alle gelb markierten Fotos aus der Filmrolle "2015_Sommerurlaub" als JPEG in voller Auflösung exportieren. Falls ein Foto schon existiert, dann soll das unverändert übersprungen werden.
a) Zuerst holen wir uns die Infomationen zum Pfad über den Befehl:
darktable-db -sAnalysing Darktable Sqlite 3 database...The Darktable database includes:
Filmrolls: 28
Photos: 4698Photos with colorlabels:
Red labels: 1
Yellow labels: 88
Green labels: 511
Blue labels: 1
Magenta labels: 7
Without labels: 4090The filmrolls are saved at direktory:
/var/daten_hdd/home/foto_archiv/2015_Workshopvorbereitung
/var/daten_hdd/home/foto_archiv/2015_Sommerurlaub
b) Mit dem folgenden Befehl exportieren wir die Fotos wie oben beschrieben:
darktable-db -e yellow -m sev -f jpg -i /var/daten_hdd/home/foto_archiv/2015_Sommerurlaub
Exporting 10 yellow labled raw images, from /var/daten_hdd/home/foto_archiv/2015_Sommerurlaub as jpg to /var/daten_hdd/home/foto_archiv/2015_Sommerurlaub ...
Die Jpeg's werden dabei in das Verzeichnis /var/daten_hdd/home/foto_archiv/2015_Sommerurlaub exportiert, da kein Ausgabeverzeichnis angegeben wurde. Falls ein anders Verzeichnis gewünscht wird, dann geben Sie das mit -o /Pfad an.
Beispiel 2:
Sie möchten alle gelb markierten Fotos aus dem Fotoarchiv der darktable Datenbank als PNG in voller Auflösung exportieren. Falls ein Foto in einer oder mehreren Version im Ausgabeverzeichnis schon existiert, dann sollen die Versionen gelöscht werden und eine neue Version exportiert werden. Bei einem recursiven Export sind Eingabe- und Ausgabeverzeichnis immer identisch. Eine Angabe zum Ausgabeverzeichnis wird bei -i recursive nicht beachtet! Nach dem Export soll noch der Farblable von gelb auf grün geändert werden.
Mit dem folgenden Befehl führen Sie das so aus:
darktable-db -e yellow -m dav -f png -i recursive -l green
Beispiel 3:
Sie möchten wissen wieviele Dateien in Ihrem Fotoarchiv vorhanden sind und eine qualitätive Bewertung mit den Sternen bekommen haben. Das Skipt durchsucht bei der Option -q das ganze Fotoarchiv, was je nach Größe des Archives einige Zeit dauern kann!
Mit dem folgenden Befehl führen Sie das so aus:
darktable-db -q
Analysing darktable photo library. Please wait...
The darktable photo library containsRAW filesDNG files: 5
CR2 files: 4847Bitmap files
JPG files: 6999
PNG files: 2
TIF files: 5
Image rating
Images with 0 stars: 817 (14.22%)
Images with 1 stars: 4820 (83.91%)
Images with 2 stars: 24 (.41%)
Images with 3 stars: 43 (.74%)
Images with 4 stars: 14 (.24%)
Images with 5 stars: 26 (.45%)
Beispiel 4:
Es sollen von allen Bitmaps im Fotoarchiv das Rating Tag überprüft werden und falls abweichend zur Darkable Datenbank soll der Status aus der Datenbank in das Bitmap übertragen werden. Die Bitmaps müssen dazu im selben Verzeichnis liegen, wie die Raw- bzw. XMP-Dateien. Die Synchronization dauert sehr lange! Es lohnt sich daher nur ein Rating Update durchzuführen, wenn viele Ratings geändert wurden.
Mit dem folgenden Befehl führen Sie das Rating update aus:
darktable-db -u
Synchronize darktable rating with bitmaps from the whole photo library. The bitmap must be in the same directory as the raw file. This may take a very longer time. Please wait...
976 files from 4868 checked
/var/daten_hdd/home/foto_archiv/2014_Stockholm/img_0627.jpg updated
977 files from 4868 checked
/var/daten_hdd/home/foto_archiv/2014_Stockholm/img_0628.jpg updated
....
draktable-db Skript
Das Skript darktable-db einfach unter /usr/bin abspeichern und ausführbar machen. Sie können das Skript auch hier herunterladen.
Quelltext vom Skript darktable-db Rev. 05 |
#! /bin/sh # ############################################################################# NAME_="darktable-db" HTML_="" PURPOSE_="darktable database tool" SYNOPSIS_="$NAME_ [-s] [-i <input_dir>] -o <output_dir>" REQUIRES_="standard GNU commands" VERSION_="0.5" DATE_="2016-04-02" AUTHOR_="H. Klemm" URL_="www.multimedia4linux.de" CATEGORY_="file" PLATFORM_="Linux" SHELL_="bash" DISTRIBUTE_="yes" DEPENDENCE_="darktable-cli, sqlite3, ls, wc, cut, rm, whoami, md5sum, printf, grep, exiftool"# ############################################################################# # This program is distributed under the terms of the GNU General Public License# HISTORY: # 2016-03-20 v0.2 - add export function # 2016-03-24 v0.3 - add root user blocking # - add reverse export # - add colorlable switch # 2016-03-27 v04 - add quality and quantity report option # 2016-03-29 v05 - add rating syncronization from bitmap with the xmp file # - add database backup function graceful_exit() { ##### # Function called for a graceful exit # No arguments ##### exit } error_exit() { ##### # Function for exit due to fatal program error # Accepts 1 argument # string containing descriptive error message ##### echo "${NAME}: ${1:-"Unknown Error"}" >&2 exit 1 } term_exit() { ##### # Function to perform exit if termination signal is trapped # No arguments ##### echo "${NAME}: Terminated" exit } int_exit() { ##### # Function to perform exit if interrupt signal is trapped # No arguments ##### echo "${NAME}: Aborted by user" exit } usage() { ##### # Function to display usage message (does not exit) # No arguments ##### echo "Usage: ${PROGNAME} -h | -c |-r |-s | -q |-u |-v | -e colorlable | -m write mode | -f export format | -i path | -o path | -l colorlable | -x width | -y hight" } helptext() { ##### # Function to display help message for program # No arguments ##### usage echo "Options:\n"echo "-h, Help Display this help message and exit" echo "-c Create database backup Save database file to ~/.config/darktable/db_backups" echo "-r Replace database file Overwrites the database file with a selected backup" echo "-s Show database report Shows darktable database informations" echo "-q Quality and quantity report Shows photo library information" echo "-u Update bitmap rating Synchronize darktable rating with bitmaps" echo "-v Version Database API version" echo "-e Export colorlabled bitmap red, yellow, green, blue, magenta" echo "-m Write mode dav = Delete all existing image versions and write new," echo " env = Export new version," echo " sev = Skip image if exist" echo "-f Export bitmap format jpg, png, tif, ppm, pfm, pdf" echo "-i Input directory /var/lib/photoarchiv or recursive" echo "-o Output direktory Optional if different with input directory" echo " /var/lib/photoarchiv/hdtv_export" echo "-l Switch colorlable after export to red, yellow, green, blue, magenta" echo "-x Image width in pixel Optional, default without scaling = 0" echo "-y Image hight in pixel Optinnal, default without scaling = 0" echo " -y 1080 for HDTV resolution" exit } create_database_backup() { checksumme=`md5sum ~/.config/darktable/library.db | cut -d" " -f1` datum=`date +"%Y-%m-%d_%H:%M"` if [ -d ~/.config/darktable/db_backups ] then cp ~/.config/darktable/library.db ~/.config/darktable/db_backups/library.db_$datum checksumme_backup=`md5sum ~/.config/darktable/db_backups/library.db_$datum | cut -d" " -f1` if [ "$checksumme" = "$checksumme_backup" ] then echo "Backup file ~/.config/darktable/db_backups/library.db_$datum successfully saved" exit else echo "Error backup file! Pleasure ckeck the backup." exit fi else mkdir ~/.config/darktable/db_backups cp ~/.config/darktable/library.db ~/.config/darktable/db_backups/library.db_$datum checksumme_backup=`md5sum ~/.config/darktable/db_backups/library.db_$datum | cut -d" " -f1` if [ "$checksumme" = "$checksumme_backup" ] then echo "Backup file library.db_$datum successfully saved. You can check it with the command darktable --library ~/.config/darktable/db_backups/library.db_$datum" exit else echo "Error backup file! Pleasure ckeck the backup." exit fi fi }replace_database() { ls -l ~/.config/darktable/db_backups | cut -d" " -f10 read -p "Please enter the file to which you want to replace the database: " replace_file if [ -e ~/.config/darktable/db_backups/$replace_file ] then if [ -e ~/.config/darktable/library.db ] then read -p "Are you sure that you want overwrite the library.db [Y/n]" overwrite if [ "$overwrite" = "Y" ] then cp -f ~/.config/darktable/db_backups/$replace_file ~/.config/darktable/library.db echo "library.db database has been successfully replaced" exit 0 else echo "Replace backup was aborted by user" exit 4 fi fi else echo "Error. Backup file $replace_file not found" exit 6 fi }show_db_info() { echo "Analysing Darktable Sqlite 3 database...\n" numberfilmrolls=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT folder FROM film_rolls)";` numberphotos=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT id FROM images)";` lablered=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM color_labels WHERE COLOR = 0";` lableyellow=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM color_labels WHERE COLOR = 1";` lablegreen=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM color_labels WHERE COLOR = 2";` lableblue=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM color_labels WHERE COLOR = 3";` labelmagenta=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM color_labels WHERE COLOR = 4";` echo "The Darktable database includes:" echo "Filmrolls:" $numberfilmrolls echo "Photos:" $numberphotos "\n" echo "Photos with colorlabels:" echo "Red labels:" $lablered #ID 0 echo "Yellow labels:" $lableyellow #ID 1 echo "Green labels:" $lablegreen #ID 2 echo "Blue labels:" $lableblue #ID 3 echo "Magenta labels:" $labelmagenta #ID 4 echo "Without labels:" $((numberphotos-lablered-lableyellow-lablegreen-lableblue-labelmagenta)) "\n" echo "The filmrolls are saved at direktory:" sqlite3 ~/.config/darktable/library.db "SELECT folder FROM film_rolls"; exit } show_qaq_info() { filmrolls=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT folder FROM film_rolls)";` COUNTER=0 echo "Analysing darktable photo library. Please wait..." while [ $COUNTER -lt $filmrolls ]; do input_dir=`sqlite3 ~/.config/darktable/library.db "SELECT folder FROM film_rolls LIMIT $COUNTER,1"`; # Check RAW files quantity_dng=`ls -1 $input_dir"/"*.dng 2>/dev/null | wc -l`; #DNG RAW quantity_cr2=`ls -1 $input_dir"/"*.cr2 2>/dev/null | wc -l`; #Canon RAW quantity_raf=`ls -1 $input_dir"/"*.raf 2>/dev/null | wc -l`; #Fuji RAW quantity_raw=`ls -1 $input_dir"/"*.raw 2>/dev/null | wc -l`; #Leica RAW quantity_mrw=`ls -1 $input_dir"/"*.mrw 2>/dev/null | wc -l`; #Minolta RAW quantity_nef=`ls -1 $input_dir"/"*.nef 2>/dev/null | wc -l`; #Nikon RAW quantity_orf=`ls -1 $input_dir"/"*.orf 2>/dev/null | wc -l`; #Olympus RAW quantity_rw2=`ls -1 $input_dir"/"*.rw2 2>/dev/null | wc -l`; #Panasonic RAW quantity_pef=`ls -1 $input_dir"/"*.pef 2>/dev/null | wc -l`; #Pentax RAW quantity_srw=`ls -1 $input_dir"/"*.srw 2>/dev/null | wc -l`; #Samsung RAW quantity_x3f=`ls -1 $input_dir"/"*.x3f 2>/dev/null | wc -l`; #Sigma RAW quantity_arw=`ls -1 $input_dir"/"*.arw 2>/dev/null | wc -l`; #Sony RAW total_dng=`expr $total_dng + $quantity_dng` total_cr2=`expr $total_cr2 + $quantity_cr2` total_raf=`expr $total_raf + $quantity_raf` total_raw=`expr $total_raw + $quantity_raw` total_mrw=`expr $total_mrw + $quantity_mrw` total_nef=`expr $total_nef + $quantity_nef` total_orf=`expr $total_orf + $quantity_orf` total_rw2=`expr $total_rw2 + $quantity_rw2` total_pef=`expr $total_pef + $quantity_pef` total_srw=`expr $total_srw + $quantity_srw` total_x3f=`expr $total_x3f + $quantity_x3f` total_arw=`expr $total_arw + $quantity_arw` # Check Bitmap files quantity_jpg=`ls -1 $input_dir"/"*.jpg 2>/dev/null | wc -l`; quantity_png=`ls -1 $input_dir"/"*.png 2>/dev/null | wc -l`; quantity_tif=`ls -1 $input_dir"/"*.tif 2>/dev/null | wc -l`; quantity_ppm=`ls -1 $input_dir"/"*.ppm 2>/dev/null | wc -l`; quantity_pfm=`ls -1 $input_dir"/"*.pfm 2>/dev/null | wc -l`; quantity_pdf=`ls -1 $input_dir"/"*.pdf 2>/dev/null | wc -l`; total_jpg=`expr $total_jpg + $quantity_jpg` total_png=`expr $total_png + $quantity_png` total_tif=`expr $total_tif + $quantity_tif` total_ppm=`expr $total_ppm + $quantity_ppm` total_pfm=`expr $total_pfm + $quantity_pfm` total_pdf=`expr $total_pdf + $quantity_pdf` # Rating quantity_rating_0=`grep -r -i 'Rating="0"' $input_dir"/"*.xmp | wc -l` quantity_rating_1=`grep -r -i 'Rating="1"' $input_dir"/"*.xmp | wc -l` quantity_rating_2=`grep -r -i 'Rating="2"' $input_dir"/"*.xmp | wc -l` quantity_rating_3=`grep -r -i 'Rating="3"' $input_dir"/"*.xmp | wc -l` quantity_rating_4=`grep -r -i 'Rating="4"' $input_dir"/"*.xmp | wc -l` quantity_rating_5=`grep -r -i 'Rating="5"' $input_dir"/"*.xmp | wc -l` total_rating_0=`expr $total_rating_0 + $quantity_rating_0` total_rating_1=`expr $total_rating_1 + $quantity_rating_1` total_rating_2=`expr $total_rating_2 + $quantity_rating_2` total_rating_3=`expr $total_rating_3 + $quantity_rating_3` total_rating_4=`expr $total_rating_4 + $quantity_rating_4` total_rating_5=`expr $total_rating_5 + $quantity_rating_5` COUNTER=`expr 1 + $COUNTER` done rating100=`expr $total_rating_0 + $total_rating_1 + $total_rating_2 + $total_rating_3 + $total_rating_4 + $total_rating_5` ratingpercent_0=$(echo "scale=2 ; $total_rating_0*100/$rating100" |bc) ratingpercent_1=$(echo "scale=2 ; $total_rating_1*100/$rating100" |bc) ratingpercent_2=$(echo "scale=2 ; $total_rating_2*100/$rating100" |bc) ratingpercent_3=$(echo "scale=2 ; $total_rating_3*100/$rating100" |bc) ratingpercent_4=$(echo "scale=2 ; $total_rating_4*100/$rating100" |bc) ratingpercent_5=$(echo "scale=2 ; $total_rating_5*100/$rating100" |bc)#Output informations echo "The darktable photo library contains\n" echo "RAW files" if [ "$total_dng" -gt "0" ] then echo "DNG files:" $total_dng fiif [ "$total_cr2" -gt "0" ] then echo "CR2 files:" $total_cr2 fiif [ "$total_raf" -gt "0" ] then echo "RAF files:" $total_raf fiif [ "$total_raw" -gt "0" ] then echo "RAW files:" $total_raw fiif [ "$total_mrw" -gt "0" ] then echo "MRW files:" $total_mrw fiif [ "$total_nef" -gt "0" ] then echo "NEF files:" $total_nef fiif [ "$total_orf" -gt "0" ] then echo "ORF files:" $total_orf fiif [ "$total_rw2" -gt "0" ] then echo "RW2 files:" $total_rw2 fiif [ "$total_pef" -gt "0" ] then echo "PEF files:" $total_pef fiif [ "$total_srw" -gt "0" ] then echo "SRW files:" $total_srw fi if [ "$total_x3f" -gt "0" ] then echo "X3F files:" $total_x3f fi if [ "$total_raf" -gt "0" ] then echo "ARW files:" $total_arw fi echo "\n" echo "Bitmap files" if [ "$total_jpg" -gt "0" ] then echo "JPG files:" $total_jpg fiif [ "$total_png" -gt "0" ] then echo "PNG files:" $total_png fiif [ "$total_tif" -gt "0" ] then echo "TIF files:" $total_tif fiif [ "$total_ppm" -gt "0" ] then echo "PPM files:" $total_ppm fi if [ "$total_pfm" -gt "0" ] then echo "PFM files:" $total_pfm fiif [ "$total_pdf" -gt "0" ] then echo "PDF files:" $total_pdf fi echo "\n" echo "Image rating" echo "Images with 0 stars:" $total_rating_0 "("$ratingpercent_0"%)" echo "Images with 1 stars:" $total_rating_1 "("$ratingpercent_1"%)" echo "Images with 2 stars:" $total_rating_2 "("$ratingpercent_2"%)" echo "Images with 3 stars:" $total_rating_3 "("$ratingpercent_3"%)" echo "Images with 4 stars:" $total_rating_4 "("$ratingpercent_4"%)" echo "Images with 5 stars:" $total_rating_5 "("$ratingpercent_5"%)" exit }update_rating() { echo "Synchronize darktable rating with bitmaps from the whole photo library. The bitmap must be in the same directory as the raw file. This may take a very longer time. Please wait..." numberphotos=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT id FROM images)";` filmrolls=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT folder FROM film_rolls)";` COUNTER=0 jpg_updates=0 png_updates=0 tif_updates=0 checked_files=0 while [ $COUNTER -lt $filmrolls ]; do # Read path from filmroll 1,2,3... input_dir=`sqlite3 ~/.config/darktable/library.db "SELECT folder FROM film_rolls LIMIT $COUNTER,1"`; # Create file list from filmroll 1,2,3... rm -f /tmp/dt_input_raw_files.txt `sqlite3 ~/.config/darktable/library.db "SELECT distinct images.filename FROM film_rolls, images WHERE film_rolls.id = images.film_id AND film_rolls.folder ='$input_dir'" > /tmp/dt_input_raw_files.txt;` while read input_file do xmpfile=$input_dir"/"$input_file".xmp" jpgfile=$input_dir"/"`echo "$input_file" | cut -d'.' -f1`".jpg" pngfile=$input_dir"/"`echo "$input_file" | cut -d'.' -f1`".png" tiffile=$input_dir"/"`echo "$input_file" | cut -d'.' -f1`".tif" xmprating=`grep -r -i 'xmp:Rating=' $xmpfile | cut -c 16` jpgrating=`exiftool -p '$Rating' $jpgfile 2>/dev/null` pngrating=`exiftool -p '$Rating' $pngfile 2>/dev/null` tifrating=`exiftool -p '$Rating' $tiffile 2>/dev/null` if [ -f "$jpgfile" ] && [ "$xmprating" != "$jpgrating" ] then exiftool -overwrite_original -XMP:Rating=$xmprating $jpgfile >/dev/null 2>&1 echo "\n$jpgfile updated" jpg_updates=`expr 1 + $jpg_updates` fi if [ -f "$pngfile" ] && [ "$xmprating" != "$pngrating" ] then exiftool -overwrite_original -XMP:Rating=$xmprating $pngfile >/dev/null 2>&1 echo "\n$pngfile updated" png_updates=`expr 1 + $png_updates` fi if [ -f "$tiffile" ] && [ "$xmprating" != "$tifrating" ] then exiftool -overwrite_original -XMP:Rating=$xmprating $tiffile >/dev/null 2>&1 echo "\n$tiffile updated" tif_updates=`expr 1 + $tif_updates` fi checked_files=`expr 1 + $checked_files` printf "\r $checked_files files from $numberphotos checked" done < /tmp/dt_input_raw_files.txt COUNTER=`expr 1 + $COUNTER` done updates=`expr $jpg_updates + $png_updates + $tif_updates` clear echo "\n$updates Rating tags of the bitmaps were updated" exit }version_info() { dtdbversion=`sqlite3 ~/.config/darktable/library.db "SELECT value FROM db_info";` echo "Darktable library.db API Version" $dtdbversion exit }set_colorlable() { # extract file number from db if [ "$lable_in" != "$lable_out" ]; then if [ -e ~/.config/darktable/library.db.lock ]; then echo "The darktable database is locked. Please exit darktable, if you want switch the colorlable!" exit 6 else filenumber=`sqlite3 ~/.config/darktable/library.db "SELECT DISTINCT images.id FROM film_rolls, images WHERE images.film_id = film_rolls.id AND film_rolls.folder = '$input_dir' AND images.filename = '$input_file'";` # change colorlable sqlite3 ~/.config/darktable/library.db "UPDATE color_labels SET color = '$lable_out' WHERE imgid = '$filenumber'"; fi fi }export_image() { # delete temp file rm -f /tmp/dt_input_files.txt# Count colorlabled images numberlabled=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM film_rolls, images, color_labels WHERE film_rolls.id = images.film_id AND images.group_id = color_labels.imgid AND film_rolls.folder ='$input_dir' AND color_labels.color='$lable_in'";` # Write message echo "Exporting $numberlabled ${colorlable_in}" labled raw images, from ${input_dir} as ${outputfileformat} to ${output_dir} ... # Create file list `sqlite3 ~/.config/darktable/library.db "SELECT distinct images.filename FROM film_rolls, images, color_labels WHERE film_rolls.id = images.film_id AND images.group_id = color_labels.imgid AND film_rolls.folder ='$input_dir' AND color_labels.color='$lable_in'" > /tmp/dt_input_files.txt;` while read input_file do case "$writemode" in dav) deltefile=$output_dir"/"$output_file`echo "$input_file" | cut -d'.' -f1`"*."$outputfileformat; rm -f $deltefile; darktable-cli $input_dir"/"$input_file $output_dir"/"$output_file`echo "$input_file" | cut -d'.' -f1`"."$outputfileformat --width $image_width --height $image_hight; ;; env) darktable-cli $input_dir"/"$input_file $output_dir"/"$output_file`echo "$input_file" | cut -d'.' -f1`"."$outputfileformat --width $image_width --height $image_hight; ;; sev) output_filecheck=$output_dir"/"$output_file`echo "$input_file" | cut -d'.' -f1`"."$outputfileformat; if [ -f "$output_filecheck" ]; then echo "[export_job] skip file $output_filecheck"; else darktable-cli $input_dir"/"$input_file $output_filecheck --width $image_width --height $image_hight; fi ;; esac set_colorlable done < /tmp/dt_input_files.txt rm -f /tmp/dt_input_files.txt} ########################################################################### # Program starts here ############################################################################ Trap TERM, HUP, and INT signals and properly exittrap term_exit TERM HUP trap int_exit INT# Process command line argumentsif [ "$1" = "-h" ]; then helptext graceful_exit fi# Display usage message if no options or arguments are givenif [ "$1" = "" ]; then usage exit 1 fiif [ `whoami` = "root" ] then echo "The use of darktable-db is not possible as root user" exit 10 fi# Process arguments colorlable_in="" outputfileformat="" input_dir="" output_dir="" image_width=0 image_hight=0while getopts ":hcrsquve:m:f:i:o:l:x:y:" options; do case "$options" in h) helptext ;; c) create_database_backup ;; r) replace_database ;; s) show_db_info ;; q) show_qaq_info ;; u) update_rating ;; v) version_info ;; e) colorlable_in="$OPTARG" ;; m) mode="$OPTARG" ;; f) outputfileformat="$OPTARG" ;; i) input_dir="$OPTARG" ;; o) output_dir="$OPTARG" ;; l) colorlable_out="$OPTARG" ;; x) image_width="$OPTARG" ;; y) image_hight="$OPTARG" ;; esacdonecase "$colorlable_in" in red) lable_in=0 ;; yellow) lable_in=1 ;; green) lable_in=2 ;; blue) lable_in=3 ;; magenta) lable_in=4 ;; *) echo "Unkown colorlable"; exit 9;;esaccase "$colorlable_out" in red) lable_out=0 ;; yellow) lable_out=1 ;; green) lable_out=2 ;; blue) lable_out=3 ;; magenta) lable_out=4 ;; *) lable_out=$lable_in;;esac case "$mode" in dav) writemode=dav;; env) writemode=env;; sev) writemode=sev;; *) echo "Unkown write mode"; exit 8;; esaccase "$outputfileformat" in jpg) ;; png) ;; tif) ;; ppm) ;; pfm) ;; pdf) ;; *) echo "Unknown or not supported export format"; exit 7;; esac# Main program if [ "$input_dir" = "recursive" ] then # Calculate number of filmrolls filmrolls=`sqlite3 ~/.config/darktable/library.db "SELECT COUNT (*) FROM (SELECT DISTINCT folder FROM film_rolls)";` COUNTER=0 while [ $COUNTER -lt $filmrolls ]; do input_dir=`sqlite3 ~/.config/darktable/library.db "SELECT folder FROM film_rolls LIMIT $COUNTER,1"`; output_dir=$input_dir export_image COUNTER=`expr 1 + $COUNTER` done else if [ "$output_dir" = "" ]; then output_dir=$input_dir fi export_image fi |