#!/bin/sh

# download_cam.sh
# 2024-05-09
# by Gernot Walzl

# download_cam.desktop
#
# [Desktop Entry]
# Name=download_cam
# Comment=Gets all photos from a camera
# Exec=download_cam
# Icon=camera-photo
# Terminal=true
# Type=Application
# Categories=Graphics;Photography;

DESTDIR=${DESTDIR:-$HOME/Pictures}
GPHOTO2=${GPHOTO2:-/usr/bin/gphoto2}

read_camname () {
  LANG=C $GPHOTO2 --summary 2> /dev/null \
    | sed -n '/Model:/ s/Model: // p' \
    | sed 's#/#_#g' \
    | sed 's/ /_/g'
}

wait_for_camera () {
  local CNT=0
  while [ -z "$(read_camname)" ]; do
    /bin/echo -ne "\rWaiting for camera ... $CNT"
    sleep 1
    CNT=$(($CNT + 1))
  done
}

download () {
  local DESTCAMDIR="$1"
  if [ -z "$DESTCAMDIR" ]; then
    return 1
  fi
  mkdir -p "$DESTCAMDIR"
  (
    cd "$DESTCAMDIR" || return 1
    $GPHOTO2 --get-all-files --force-overwrite
  )
}

group_by_mdate () {
  local DIR="$1"
  if [ ! -d "$DIR" ]; then
    return 1
  fi
  find "$DIR" -mindepth 1 -maxdepth 1 -type f \
    | while read FILE; do
      DATE=$(stat -c %y "$FILE" | cut -d' ' -f1)
      mkdir -p "$DIR/$DATE"
      mv -v "$FILE" "$DIR/$DATE"
    done
}

group_by_exifdate () {
  local DIR="$1"
  if [ ! -d "$DIR" ]; then
    return 1
  fi
  find "$DIR" -mindepth 1 -maxdepth 1 -type f -iname '*.jpg' \
    | while read JPGFILE; do
      DATE=$(exif -t 0x0132 -m "$JPGFILE" | cut -d' ' -f1 | sed 's/:/-/g')
      mkdir -p "$DIR/$DATE"
      mv -v "$JPGFILE" "$DIR/$DATE"
    done
}

case "$1" in
'camname')
  read_camname
  ;;
'download')
  download "$2"
  ;;
'group')
  group_by_mdate "$2"
  ;;
'groupexif')
  group_by_exifdate "$2"
  ;;
*)
  wait_for_camera
  CAMNAME=$(read_camname)
  if [ -n "$CAMNAME" ]; then
    download "$DESTDIR/$CAMNAME"
    group_by_mdate "$DESTDIR/$CAMNAME"
  fi
  ;;
esac