Plugin for camera download
authorColin Clark <colin.clark@cclark.uk>
Thu, 25 Oct 2018 19:11:22 +0000 (20:11 +0100)
committerColin Clark <colin.clark@cclark.uk>
Thu, 25 Oct 2018 19:11:22 +0000 (20:11 +0100)
Basic function: download all, skip existing, to current folder.
Requires gphoto2

configure.in
plugins/Makefile.am
plugins/camera-import/Makefile.am [new file with mode: 0644]
plugins/camera-import/camera-import.desktop.in [new file with mode: 0644]
plugins/camera-import/geeqie-camera-import [new file with mode: 0755]
plugins/camera-import/geeqie-camera-import-hook-script [new file with mode: 0755]
po/POTFILES.in

index 0998fd9..f891a58 100644 (file)
@@ -621,6 +621,7 @@ AC_CONFIG_FILES([
     plugins/geocode-parameters/Makefile
     plugins/export-jpeg/Makefile
     plugins/tethered-photography/Makefile
+    plugins/camera-import/Makefile
     geeqie.spec
 ])
 
index 0c8219f..5df6aca 100644 (file)
@@ -1,6 +1,6 @@
 #FIXME enable or disable individual plugins from configure
 
-SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography
+SUBDIRS = rotate symlink ufraw import geocode-parameters export-jpeg tethered-photography camera-import
 qq_desktoptemplatedir = $(appdir)
 qq_desktoptemplate_DATA = template.desktop
 
diff --git a/plugins/camera-import/Makefile.am b/plugins/camera-import/Makefile.am
new file mode 100644 (file)
index 0000000..58b91b8
--- /dev/null
@@ -0,0 +1,9 @@
+dist_gq_bin_SCRIPTS = geeqie-camera-import geeqie-camera-import-hook-script
+
+gq_desktopdir = $(appdir)/applications
+gq_desktop_in_files = camera-import.desktop.in
+gq_desktop_DATA = $(gq_desktop_in_files:.desktop.in=.desktop)
+@INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST = $(gq_desktop_in_files)
+CLEANFILES = $(gq_desktop_DATA)
diff --git a/plugins/camera-import/camera-import.desktop.in b/plugins/camera-import/camera-import.desktop.in
new file mode 100644 (file)
index 0000000..fff8ede
--- /dev/null
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+_Name=Camera import
+
+# Requires gphoto2
+# The gphoto2 file $HOME/.gphoto2/settings can
+# be used to set auto-rename on download
+
+Exec=geeqie-camera-import
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# It can be made verbose
+#X-Geeqie-Verbose=true
+
+Icon=geeqie
diff --git a/plugins/camera-import/geeqie-camera-import b/plugins/camera-import/geeqie-camera-import
new file mode 100755 (executable)
index 0000000..40cca5f
--- /dev/null
@@ -0,0 +1,159 @@
+#!/bin/bash
+
+# Import all images from camera
+# Requires gphoto2
+
+function finish 
+{
+       if [ -f /tmp/geeqie-camera-import-files ]
+       then
+               rm /tmp/geeqie-camera-import-files
+       fi
+
+       if [ -p $zen_pipe ]
+       then
+               rm $zen_pipe
+       fi
+
+       if [ "$gphoto2_pid" != "" ]
+       then
+               ps -p $gphoto2_pid > /dev/null
+               if [ $? -eq 0 ]
+               then
+                       kill $gphoto2_pid
+               fi
+       fi
+
+       if [ "$zen_pid" != "" ]
+       then
+               ps -p $zen_pid > /dev/null
+               if [ $? -eq 0 ]
+               then
+                       kill $zen_pid
+               fi
+       fi
+}
+trap finish EXIT
+
+if ! [ -x "$(command -v gphoto2)" ]
+then
+       zenity --title="Geeqie camera import" --info --width=200 --text="gphoto2 is not installed" 2>/dev/null
+       exit 0
+fi
+
+if [ -f /tmp/geeqie-camera-import.log ]
+then
+       rm /tmp/geeqie-camera-import.log
+fi
+
+if [ $(gphoto2 --auto-detect | wc -l) -le 2 ]
+then
+       zenity --error --title="Geeqie camera import" --text="No camera detected" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 2>/dev/null
+       exit 0
+fi
+
+list=$(gphoto2 --auto-detect | tail +3)
+readarray -t split_list <<<"$list"
+
+camera_list=""
+n=1
+count=$(gphoto2 --auto-detect | tail +3 | wc -l)
+if [[ $count -gt 1 ]]
+then
+       for camera in "${split_list[@]}"
+       do
+               if [[ $n -eq $count ]]
+               then
+                       camera_list="$camera_list"$'TRUE\n'"$camera"$'\n'"$n"
+               else
+                       camera_list="$camera_list"$'FALSE\n'"$camera"$'\n'"$n"$'\n'
+               fi
+               n=$((n+1))
+       done
+
+       camera_selected=$(echo "$camera_list" | zenity  --width=500 --height=250 --title="Geeqie camera import" --list  --text "Select camera" --radiolist  --column "Select" --column "Camera" --column "n" --hide-column=3 --print-column=2 2>/dev/null) 
+
+       if [[ $? == 1 ]]
+       then
+               exit 0
+       fi
+else
+       camera_selected=$(gphoto2 --auto-detect | tail +3)
+fi
+
+port_type=$(echo $camera_selected |awk -F ':' '{print $1}' | awk '{print $NF}')
+camera=$(echo $camera_selected | awk -F $port_type '{print $1}')
+port_address=$(echo $camera_selected | awk -F ':' '{print $2}')
+port="$port_type:$port_address"
+
+script_dir=$(dirname "$0")
+
+zenity --question --title="Geeqie camera import" --text="Camera: $camera\n\nDownloading to folder:\n<b>$PWD</b>" --ok-label="OK" --cancel-label="Cancel" --window-icon=/usr/local/share/pixmaps/geeqie.png --width=350 2>/dev/null
+
+if [[ $? == 1 ]]
+then
+       exit 0
+fi
+
+src_files_sorted=$(mktemp --tmpdir geeqie_camera_import_camera_files_sorted_XXXXXX)
+dest_files_sorted=$(mktemp --tmpdir geeqie_camera_import_computer_files_sorted_XXXXXX)
+
+(
+gphoto2 --port "$port" --list-files  2>/tmp/geeqie-camera-import.log | awk '/#/ {print $2}' | sort > $src_files_sorted
+) | zenity --progress --auto-close --auto-kill --title="Geeqie camera import" --text="Searching for files to download..."  --pulsate --window-icon=/usr/local/share/pixmaps/geeqie.png --width=250 
+
+error=$(grep -i error /tmp/geeqie-camera-import.log)
+
+if [ ! -z "$error" ]
+then
+       cat /tmp/geeqie-camera-import.log | zenity --text-info --title="Geeqie camera import" - --window-icon=error --width=250 2>/dev/null
+       exit 1
+fi
+
+ls -1 | sort > $dest_files_sorted
+existing_file_count=$(comm -12 $src_files_sorted $dest_files_sorted | wc -l)
+
+total=$(cat $src_files_sorted | wc -l)
+files_to_load=$(( $total - $existing_file_count ))
+
+rm $src_files_sorted
+rm $dest_files_sorted
+
+if [ "$files_to_load" -eq 0 ]
+then
+       zenity --info --title="Geeqie camera download" --text="No photos to download" --width=250 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null
+       exit 0
+fi
+
+if [ -f /tmp/geeqie-camera-import-files ]
+then
+       rm /tmp/geeqie-camera-import-files
+fi
+touch /tmp/geeqie-camera-import-files
+
+zen_pipe=$(mktemp --dry-run --tmpdir geeqie_camera_import_pipe_XXXXXX)
+mkfifo $zen_pipe
+
+gphoto2 --port "$port" --hook-script "$script_dir/"geeqie-camera-import-hook-script --get-all-files --skip-existing 2>/tmp/geeqie-camera-import.log &
+
+gphoto2_pid=$!
+
+(tail -f $zen_pipe 2>/dev/null) | zenity --progress --title="Geeqie camera import" --width=370 --text="Downloading: total: $files_to_load existing: $existing_file_count\n" --auto-close --auto-kill --percentage=0 window-icon=/usr/local/share/pixmaps/geeqie.png 2>/dev/null &
+zen_pid=$!
+
+n=0
+while [ -f /tmp/geeqie-camera-import-files ] &&  [ "$n" -lt 100 ]
+do
+       i=$(cat "/tmp/geeqie-camera-import-files" | wc -l)
+       n=$(( $((i * 100)) / $files_to_load))
+       echo "$n" >$zen_pipe
+
+       latest_file=$(tail -n 1 /tmp/geeqie-camera-import-files)
+       if [ -z "$latest_file" ]
+       then
+               latest_file="Skipping existing files, if any..."
+       fi
+       echo "#Downloading: total: $files_to_load existing: $existing_file_count\n$latest_file" >$zen_pipe
+
+       sleep 1
+done
diff --git a/plugins/camera-import/geeqie-camera-import-hook-script b/plugins/camera-import/geeqie-camera-import-hook-script
new file mode 100755 (executable)
index 0000000..46464ee
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# Camera import
+
+if [ "$ACTION" == "download" ]
+then
+       echo "$ARGUMENT" >> /tmp/geeqie-camera-import-files
+
+elif [ "$ACTION" == "stop" ]
+then
+       zenity --info --title="Geeqie camera download" --text="Import ended" --width=200 --timeout=5 --window-icon=usr/local/share/pixmaps/geeqie.png 2>/dev/null 
+       if [ -f /tmp/geeqie-camera-import-files ]
+       then
+               rm /tmp/geeqie-camera-import-files
+       fi
+fi
+
+exit 0
index a09c6d1..9ee74c2 100644 (file)
@@ -3,6 +3,7 @@ plugins/import/geeqie-import-geeqie.desktop.in
 plugins/import/geeqie-import-gqview.desktop.in
 plugins/export-jpeg/export-jpeg.desktop.in
 plugins/tethered-photography/tethered-photography.desktop.in
+plugins/camera-import/camera-import.desktop.in
 plugins/rotate/rotate.desktop.in
 plugins/symlink/symlink.desktop.in
 plugins/ufraw/geeqie-ufraw.desktop.in