#!/bin/sh

USAGE='Usage: brewprep [options] <image-files>

  Prepares camera raw images by extracting preview, file renaming and sorting. 
  Works with Canon SLR filenaming and video camera Canon FS100. Also sets 
  aspect ratio for video files.

  Depends on brewbiasnr, brewpreview, brewmv, brewsort, brewrot, brewid.

  Copyright © Daniel Ljunggren <foto@demulsion.se>. Oct 2012 - Mar 2014.

[options]:
  -n                               : No questions
  -id <none,DL,SS,MSS,ML,VL,RK>    : Set COPYRIGHT information (default DL)
  -b  <SNNNN>                      : Set SEQ_BIAS
  -k                               : Continuous file numbering starting at SEQ_BIAS + 1
  -o  <integer>                    : Set SEQ_OFFSET (subtracting SEQ_BIAS by this number)
  -r  <NNN>                        : Set film roll number ROLL and assume film copy image (brewpreview -slidecopy), image numbering < 99 
  -d  <YYMMDD>                     : Set specific DATE for all images, month and day can be set to XX.
  -negative                        : Use with option -r to assume negative film copy image (brewpreview -slidecopy -negative)
  -h                               : Show help
'

SEQ_BIAS=""
IMAGE_NR=""
COPYRIGHT="DL"
QUIET=false
CONTINUOUS=false
INIT=true
SEQ_OFFSET=""
ROLL=""
DATESET=""
NEGATIVE=false

# Help function, returns OK if $1 contains $2
strstr() {
    [ "${1#*$2*}" = "$1" ] && return 1
    return 0
}

while [ $# -gt 0 ] 
do
    case "$1" in
	-n)
	    QUIET=true
	    ;;
	-id)
	    if [ $2 == "none" ] || [ $2 == "DL" ] || [ $2 == "SS" ] || [ $2 == "MSS" ] || [ $2 == "ML" ] || [ $2 == "VL" ] || [ $2 == "RK" ]; then
		COPYRIGHT=$2
	    else
		echo "Unknown copyright owner..."
		echo "$USAGE" 1>&2
		exit 2
	    fi
	    shift 1
	    ;;
	-b)
	    if [[ $2 == [a-z][0-9][0-9][0-9][0-9] ]]; then
		SEQ_BIAS="$2"
	    else
		echo "SEQ_BIAS needs a letter and four digits..."
		echo "$USAGE" 1>&2
		exit 2
	    fi
	    shift 1
	    ;;
	-k)
	    CONTINUOUS=true
	    ;;
	-o)
	    SEQ_OFFSET=$2
	    shift 1
	    ;;
	-r)
	    if [[ $2 == [0-9][0-9][0-9] ]]; then
		ROLL="$2"
	    else
		echo "$USAGE" 1>&2
		exit 2
	    fi
	    shift 1
	    ;;
	-d) if [[ $2 == [0-9][0-9][0-9X][0-9X][0-9X][0-9X] ]]; then
		DATESET="$2"
	    else
		echo "$USAGE" 1>&2
		exit 2
	    fi
	    shift 1
	    ;;
	-negative)
	    NEGATIVE=true
	    ;;
	-*)	
	    echo "$USAGE" 1>&2
	    exit 2
	    ;;
	*)
	    break
	    ;;
    esac
    shift 1
done

if [ $# -eq 0 ]; then # [ ! -n "${COPYRIGHT}" ]; then
    #echo "Copyright owner needs to be specified..."
    echo "$USAGE" 1>&2
    exit 2
fi

case ${COPYRIGHT} in
    DL) CRNAME="Daniel Ljunggren <foto@demulsion.se>";;
    SS) CRNAME="Sara Stefansson <foto@demulsion.se>";;
    MSS) CRNAME="Margareta & Sven Stefansson";;
    ML) CRNAME="Majken Ljunggren <majken@demulsion.se>";;
    VL) CRNAME="Vilgot Ljunggren <viljot@demulsion.se>";;
    RK) CRNAME="Robert Karlsson <robban_kallesson@hotmail.com>";;
esac
if [ $QUIET == "false" ]; then
    echo -n "brewprep: Writing copyright info \"$CRNAME\" to images. OK? [Y/n] "
    read answer
    
    if strstr $"yY" "$answer" || [ "$answer" = "" ]; then
	echo;
    else
	echo "exit" 1>&2
	exit 2
    fi
fi

# If bias is empty then set it to the last number in image sequence of images in subdirectories of currect directory
if [[ -z ${SEQ_BIAS} ]]; then

    echo "brewprep: searching for bias number..."

    YEAR=`date +%Y`  # Current year serve as initial guess for name of most recent catalog.
    RESULT_STRING=`brewbiasnr $YEAR*/*`
    SEQ_BIAS=`expr "$RESULT_STRING" : '.*\([a-z][0-9][0-9][0-9][0-9]\).*$'`

    while [ -z $SEQ_BIAS ] && [ $YEAR -gt 1900 ]; do
	YEAR=$(echo "${YEAR} - 1" | bc -l)
	RESULT_STRING=`brewbiasnr $YEAR*/*`
	SEQ_BIAS=`expr "$RESULT_STRING" : '.*\([a-z][0-9][0-9][0-9][0-9]\).*$'`
    done

    if [[ -z $SEQ_BIAS ]]; then
	RESULT_STRING=`brewbiasnr */*`
	SEQ_BIAS=`expr "$RESULT_STRING" : '.*\([a-z][0-9][0-9][0-9][0-9]\).*$'`
    fi

    if [[ -z $SEQ_BIAS ]]; then
	SEQ_BIAS=a0000;
    fi

    # Ask user if the found bias is ok to use
    echo "$RESULT_STRING"
    if [ $QUIET == "false" ]; then
	echo -n "brewprep: Is it ok to use $SEQ_BIAS as bias to renumber images? [Y/n] "
	read answer
        
	if strstr $"yY" "$answer" || [ "$answer" = "" ]; then
	    echo;
	else
	    echo "exit" 1>&2
	    exit 2
	fi
    fi
fi

# Let sequence number of first image file determine the sequence offset
# SEQ_OFFSET should always be smaller than SEQ_BASE

# START changed 161218 ############################
#if [ -z ${SEQ_OFFSET} ]; then
#    SEQ_BASE=`expr "$1" : '.*\([0-9][0-9][0-9][0-9]\).*$'` # Find image number of first file on command line
#    SEQ_OFFSET=$(echo "scale=1; ${SEQ_BASE}-1" | bc -l)	
#fi

# NEW: handling of unknown file numberings:
SEQ_BASE=`expr "$1" : '.*[^0-9]0*\([0-9][0-9][0-9][0-9]\)[^0-9].*$'` # Find image number of first file on command line
if [[ -z $SEQ_BASE ]]; then
    SEQ_BASE=1
    CONTINUOUS=true
    echo "brewprep: Unknown original file-numbering format. Renumbering images..."
fi
if [ -z ${SEQ_OFFSET} ]; then
    SEQ_OFFSET=$(echo "scale=1; ${SEQ_BASE}-1" | bc -l)
fi
# END changed 161218 ##############################

if [[ ${CONTINUOUS} == true ]]; then
    echo "brewprep: Incrementing by one from bias number $SEQ_BIAS..."
    echo "brewprep: Any numbering offset is ignored in continuous mode..."
else    
    echo "brewprep: Using $SEQ_BIAS as bias to renumber images... "
    echo "brewprep: Using $SEQ_OFFSET as offset to bias... "
fi

for FILE 
do
  if [ -w "$FILE" ]; then
      case "$FILE" in
	  *.RAW)
	      ORIG_EXT=RAW
	      NEW_EXT=raw
	      ;;
	  *.raw)
	      ORIG_EXT=raw
	      NEW_EXT=raw
	      ;;
	  *.CRW)
	      ORIG_EXT=CRW
	      NEW_EXT=crw
	      ;;
	  *.crw)
	      ORIG_EXT=crw
	      NEW_EXT=crw
	      ;;
	  *.CR2)
	      ORIG_EXT=CR2
	      NEW_EXT=cr2
	      ;;
	  *.cr2)
	      ORIG_EXT=cr2
	      NEW_EXT=cr2
	      ;;
	  *.JPG)
	      ORIG_EXT=JPG
	      NEW_EXT=jpg
	      ;;
	  *.jpg)
	      ORIG_EXT=jpg
	      NEW_EXT=jpg
	      ;;
	  *.jpeg)
	      ORIG_EXT=jpeg
	      NEW_EXT=jpg
	      ;;
	  *.JPEG)
	      ORIG_EXT=JPEG
	      NEW_EXT=jpg
	      ;;
	  *.PNG)
	      ORIG_EXT=PNG
	      NEW_EXT=png
	      ;;
	  *.png)
	      ORIG_EXT=png
	      NEW_EXT=png
	      ;;
	  *.tif)
	      ORIG_EXT=tif
	      NEW_EXT=tif
	      ;;
	  *.tiff)
	      ORIG_EXT=tiff
	      NEW_EXT=tif
	      ;;
	  *.TIF)
	      ORIG_EXT=TIF
	      NEW_EXT=tif
	      ;;
	  *.TIFF)
	      ORIG_EXT=TIFF
	      NEW_EXT=tif
	      ;;
	  *.avi)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=avi
	      NEW_EXT=avi
	      ;;
	  *.AVI)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=AVI
	      NEW_EXT=avi
	      ;;
	  *.MOD)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=MOD
	      MOI_EXT=MOI
	      NEW_EXT=mod
	      ;;
	  *.mod)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=mod
	      MOI_EXT=moi
	      NEW_EXT=mod
	      ;;
	  *.MOI)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=MOI
	      NEW_EXT=moi
	      ;;
	  *.moi)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=moi
	      NEW_EXT=moi
	      ;;
	  *.MOV)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=MOV
	      NEW_EXT=mov
	      ;;
	  *.mov)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=mov
	      NEW_EXT=mov
	      ;;
	  *.MP4)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=MP4
	      NEW_EXT=mp4
	      ;;
	  *.mp4)
	      [[ $INIT == true ]] && CONTINUOUS=true
	      ORIG_EXT=mp4
	      NEW_EXT=mp4
	      ;;
	  *)
	      echo "brewprep: Can't handle file '$FILE', skipping..." 1>&2
	      continue
	      ;;
      esac
      INIT=false
      SWITCH=""
      BREWMV_SWITCH=""
      BREWSORT_SWITCH=""
      DIR=`dirname $FILE`
      BASE=`basename $FILE .$ORIG_EXT`
      [[ ${CONTINUOUS} == true ]] && SWITCH="${SWITCH} -k" 

      SWITCH="${SWITCH} -o ${SEQ_OFFSET}"

      if [[ ! -z ${ROLL} ]]; then
	  SWITCH="${SWITCH} -r ${ROLL}"
	  BREWMV_SWITCH="-c"
	  BREWSORT_SWITCH="-s ${ROLL}"
	  BREWPREV_SWITCH="-slidecopy"
	  [[ ${NEGATIVE} == "true" ]] && BREWPREV_SWITCH="${BREWPREV_SWITCH} -negative"
      fi
      if [[ ! -z ${DATESET} ]]; then
	  SWITCH="${SWITCH} -d ${DATESET}"
	  BREWSORT_SWITCH="${BREWSORT_SWITCH} -d ${DATESET}"
      fi

      # Generate and prepare preview image for raw-files
      if  [ "${NEW_EXT}" == "raw" ] || 
	  [ "${NEW_EXT}" == "crw" ] || 
	  [ "${NEW_EXT}" == "cr2" ]; then
	  
	  echo -e "-----------------------\n" 1>&2
	  echo "brewprep: Processing '$FILE'..." 1>&2

	  PREVIEW_FILE_SMALL="${DIR}/${BASE}.jpg"
	  PREVIEW_FILE_CAPS="${DIR}/${BASE}.JPG"
	  
          # Check if preview does not already exist
	  if [ ! -e "${PREVIEW_FILE_SMALL}" ] && [ ! -e "${PREVIEW_FILE_CAPS}" ]; then
	      brewpreview ${BREWPREV_SWITCH} $FILE
	  else
	      echo "brewprep: JPEG preview-image already exist and need not be extracted."
	  fi
	  [[ -e "${PREVIEW_FILE_SMALL}" ]] && brewprep -n -id ${COPYRIGHT} -b ${SEQ_BIAS} ${SWITCH} "${PREVIEW_FILE_SMALL}"
	  [[ -e "${PREVIEW_FILE_CAPS}" ]] && brewprep -n -id ${COPYRIGHT} -b ${SEQ_BIAS} ${SWITCH} "${PREVIEW_FILE_CAPS}"
      else
	  echo "brewprep: Processing '$FILE'..." 1>&2
      fi

      # CONTINUOUS=true  : IMAGE_NR increments by one for continuous file numbering controlled by SEQ_BIAS
      # CONTINUOUS=false : SEQ_BIAS assumes valid index in file name for incrementing number

      # Set image number to bias number if empty
      [[ -z ${IMAGE_NR} ]] && IMAGE_NR=$SEQ_BIAS
      
      # Increase image number by one, format serial number, and let that set new SEQ_BIAS
      SERIE=`expr "$IMAGE_NR" : '.*\([a-z]\)[0-9][0-9][0-9][0-9].*$'`
      SEQ_PRE=`expr "$IMAGE_NR" : '.*\([0-9][0-9][0-9][0-9]\).*$'`
      SEQ=$(echo "scale=1; ${SEQ_PRE}+1" | bc -l)
      [[ $SEQ == [0-9] ]] && SEQ=000$SEQ
      [[ $SEQ == [0-9][0-9] ]] && SEQ=00$SEQ
      [[ $SEQ == [0-9][0-9][0-9] ]] && SEQ=0$SEQ
      if [[ $SEQ == [0-9][0-9][0-9][0-9][0-9] ]]; then
	  SEQ=`expr $SEQ : '.*\([0-9][0-9][0-9][0-9]\).*$'`
		# We reached above 9999 so increase SERIE letter
	  case "$SERIE" in
	      a) SERIE="b";;
	      b) SERIE="c";;
	      c) SERIE="d";;
	      d) SERIE="e";;
	      e) SERIE="f";;
	      f) SERIE="g";;
	      g) SERIE="h";;
	      h) SERIE="i";;
	      i) SERIE="j";;
	      j) SERIE="k";;
	      k) SERIE="l";;
	      l) SERIE="m";;
	      m) SERIE="n";;
	      n) SERIE="o";;
	      o) SERIE="p";;
	      p) SERIE="q";;
	      q) SERIE="r";;
	      r) SERIE="s";;
	      s) SERIE="t";;
	      t) SERIE="u";;
	      u) SERIE="v";;
	      v) SERIE="w";;
	      w) SERIE="x";;
	      x) SERIE="y";;
	      y) SERIE="z";;
	      z) echo "brewprep: ERROR: end of alphabet in SERIES numbering!!" 1>&2; exit 1;;
	  esac
      fi
      IMAGE_NR=$SERIE$SEQ
      [[ ${CONTINUOUS} == true ]] && SEQ_BIAS=${IMAGE_NR}

      # Rename file in current catalog and return last echo containing new filename
      RESULT_STRING=`brewmv -b $SEQ_BIAS $SWITCH $BREWMV_SWITCH $FILE` # Result string should contain a filename.
      echo "$RESULT_STRING"
      
      # Find new name of file from return string:
      for WORD in ${RESULT_STRING} ;
      do
	  MATCH=`echo $WORD | grep .${NEW_EXT}`
	  if [ -n "${MATCH}" ]; then
	      NEWFILE="${MATCH}"
	      NEWDIR=`dirname $NEWFILE`
	      NEWBASE=`basename $NEWFILE .${NEW_EXT}`
	  fi
      done
      
      if [ "${NEW_EXT}" == "mod" ]; then

	  # For MOD video file, also prepare the MOI file
          # TODO: Do it recursively instead with brewprep...?
	  INFO_FILE="${DIR}/${BASE}.${MOI_EXT}"
	  if [ -e "${INFO_FILE}" ]; then
	      brewmv -b $SEQ_BIAS $SWITCH $BREWMV_SWITCH "${INFO_FILE}"

	      # NOTES: Here we would like to change the Aspect Ratio
	      # of the MOD files from the Canon FS100 from 4:3 (tv) to
	      # 16:9 (widescreen), which is not set correctly.  We
	      # need a binary hex editor that replaced all occurences
	      # of
	      #
              # 00 01 b3 2d 02 40 23 17 70 23 81 with
	      #
	      # 00 01 b3 2d 02 40 33 17 70 23 81
	      #
	      # This information can be dump with
	      # od -Ax -v -tx1 -j0x0000 file.mod | grep "00 01 b3 2d"
	      #
              # Using mpgtx works but restructures headers.
	      # $mpgcat -A3 in.mod > out.mod
	      #
	      # Chech also sed, xxd, sdcopy.py, hexer, or bsed 
	      # bsed -v "0x000001B32D01E024=0x000001B32D01E034" $1.old $1
	      #
              # https://www.linuxquestions.org/questions/linux-software-2/video-editing-how-to-change-mpeg-header-334875/
	      # http://tapina.livejournal.com/

	      # Check for Aspect Ratio in MOI file [0x51 for 4:3 and 0x55 for 16:9]
	      ASPECTR=`od -An -v -tx1 -j0x80 -N1 -w1 "${DIR}/${NEWBASE}.moi" | sed 's/ //g'`
	      
	      if [ "$ASPECTR" == "55" ]; then
              # Replace all occurances of value 2 (x23) coding 4:3 aspect
	      # ratio, with value 3 (x33) coding 16:9 aspect ratio
		  echo "brewprep: Setting AspectRatio to 16:9 (widescreen) format..."
		  REGEXPIN="\x00\x01\xB3\x2D\x02\x40\x23\x17"
		  REGEXPOUT="\x00\x01\xB3\x2D\x02\x40\x33\x17"
		  /bin/sed "s/$REGEXPIN/$REGEXPOUT/;" ${NEWFILE} > ${NEWFILE}.tmp
		  /bin/mv -f ${NEWFILE}.tmp ${NEWFILE}
	      fi
	      
	      # After brewmv we know file name is in small characters 
	      brewsort "${NEWDIR}/${NEWBASE}.moi"
	  else
	      echo "brewprep: Warning: Info file ${INFO_FILE} doesn't exist. AspectRatio not checked..."
	  fi

      else
	  # All other media formats
          # Rotate JPEG image if needed
	  if [ "${NEW_EXT}" == "jpg" ]; then
	      brewrot "${NEWFILE}"
	  fi
	  
          # Set copyright information as exif metatag
	  if [ -n "${COPYRIGHT}" ] && [ ! "${COPYRIGHT}" == "none" ]; then
	      brewid -n "${CRNAME}" "${NEWFILE}"
	  fi

      fi      
      # Finalise by sorting image into subcatalog
      brewsort ${BREWSORT_SWITCH} "${NEWFILE}"
      echo ""
  else
      echo "brewprep: Warning: $FILE does not exist or is not writable, skipping..."
  fi
done

