# Take the .jpeg images in a directory and convert them
# into big and small images in subdirectories big and small.
# Then create a basic web page which incorporates the
# small images and links them to the big ones.
# $Id: Makefile,v 1.147 2025/05/16 02:20:09 grog Exp grog $

# Rules in this Makefile define a number of shell/make variables
# that get substituted into the pages.  They are:
# DIR: name of this directory relative to ~/public_html
# BASEDIR: base name of this directory.
# DATE: Date in printable form.
# DIARY: Name of diary entry encoded for date.
# IMAGE: Name of image file.
# BASE: Name of image file without extension.
# DEST: Name of the index page in public_html.

# The web page bits and things are here
PHOTOTOOLS	?=	/Photos/Tools
HTML_TIDY ?=	${PHOTOTOOLS}/.tidyconfig
# reduction ratios for small and tiny
WIDTHsmall ?=	600
WIDTHtiny  ?=	300
# These are minimum values; normally the width is used.
HEIGHTsmall ?=	350
HEIGHTtiny  ?=	180
PIXELSsmall ?=	270000
PIXELStiny  ?=	67500
JPEGQUALITY ?=	75%
SHELL	=	bash
HOMEDIR=	`cd; pwd`
# Web page name
PAGE?=		index.html
TINYPAGE?=	thumbnails.html
PDIR?=		public_html
PUBPHOTOS?=	~/${PDIR}/photos
HOUSEPHOTOS?=	/home/`whoami`/public_html/stones-road
HDR4?=		/Photos/6-HDR4-`whoami`
OLY?=		/Photos/00-Oly
# Name of index file.  This doesn't have to exist.
# PHOTOINDEX?=	../../photos/photos.php
WEBSITES?=	"lax:/home/grog/www.lemis.com fra:/home/grog/www.lemis.com"
# Concurrency value
BY?=		5

.SUFFIXES:	.JPEG .ORF

all:	webpage

# XXX delete me
Makefile:
	bash -c "ln -s ${PHOTOTOOLS}/Makefile ." && true

# Make all the stuff in the web directories.  Used to be:
# webpage: big small tiny index.html newphotos.html
webpage: big

thumbnails.html: big small tiny RCS
	echo +++ $@
	if [ -f ${TINYPAGE} ]; then \
	  mv -f ${TINYPAGE} ${TINYPAGE}~; \
	fi
	if [ -f RCS/${TINYPAGE},v ]; then \
	  rcs -l ${TINYPAGE}; \
	fi
	XXDIR=`pwd`; \
	DIR=Photos/`basename $$XXDIR`; \
	BASEDIR=`basename $$DIR`; \
	DATE=`${PHOTOTOOLS}/dateconv -d $$BASEDIR`; \
	DIARY=`${PHOTOTOOLS}/dateconv $$BASEDIR`; \
	if [ -f ../thumbnail-0.html ]; then \
	        THUMB0=../thumbnail-0.html; \
	else \
		THUMB0=${PHOTOTOOLS}/thumbnail-0.html; \
	fi; \
	sed < $$THUMB0 "s:BASEDIR:$$BASEDIR:g; s:DIRECTORY:$$DIR:; s:DATE:$$DATE:;s:DIARY:$$DIARY:" > ${TINYPAGE}; \
	for j in `ls -rt big`; do \
		i=`basename $$j`; \
		BASE=`${PHOTOTOOLS}/basefilename $$i`; \
		SIZE=`du -k big/$$i | awk  '{print $$1}'`; \
		IMAGESIZE=`identify tiny/$$i | sed 's:.*JPEG ::; s:.*GIF ::; s: .*::'`; \
		HORIZPIXELS=`echo $$IMAGESIZE | sed 's:x.*::'`; \
		VERTPIXELS=`echo $$IMAGESIZE | sed 's:.*x::'`; \
		grep -v '^#' < ${PHOTOTOOLS}/thumbtemplate | \
		   sed "s:IMAGE:$$i:g; s:BASEDIR:$$BASEDIR:g; s:DIR:$$DIR:g; s:SIZE:$$SIZE:g; s:BASE:$$BASE:g; s:HORIZPIXELS:$$HORIZPIXELS:g; s:VERTPIXELS:$$VERTPIXELS:g" \
			 >> ${TINYPAGE}; \
		done; \
	if [ -f ../thumbnail-n.html ]; then \
	        THUMBN=../thumbnail-n.html; \
	else \
		THUMBN=${PHOTOTOOLS}/thumbnail-n.html; \
	fi; \
	cat $$THUMBN >>${TINYPAGE}; \
	tidy -m -asxhtml $@; \
	PDIR=`cd; pwd`/public_html; \
	ci -m"Created by 'make webpage'" -t-"Basic web page for photos in this directory" -u ${TINYPAGE}; \
	if [ $$PDIR != `pwd` ]; then \
	  DEST=~/public_html/Thumbnails-`basename $$XXDIR`.html; \
	  echo; echo Copying $$DIR to $$PDIR; echo; \
	  echo cp -p ${TINYPAGE} $${DEST}; \
	  rm -f $${DEST}; \
	  cp -p ${TINYPAGE} $${DEST}; \
	  rcs -l $${DEST} && true; \
	  ci -u -t-\\"Thumbnail photos from $${DATE}\\" -m"Automatic checkin" $${DEST}; \
	  chmod +w $${DEST}; \
	else \
	  echo; echo No need to link `pwd` to $$PDIR; echo; \
	fi

# Create a set of linked web pages.
# Don't call this target directly; you'll be in the wrong directory
.linkedimages:
	XXDIR=`pwd`; \
	DIR=Photos/`basename $$XXDIR`; \
	BASEDIR=`basename $$DIR`; \
	DIARY=`${PHOTOTOOLS}/dateconv $$BASEDIR`; \
	DEST=Thumbnails-`basename $$XXDIR`.html; \
	sh ${PHOTOTOOLS}/makelinkedimages ../../$$DIARY ${PHOTOTOOLS} ../../$$DEST `ls -rt big/*${IMAGETYPE}`
	touch .linkedimages

# All that's left of index.html:
# create photolist.php
auxfiles:
	echo +++ $@
	mkphotolist.php

# Add the description to the dirlist file.
# This is a real mess.  FIXME.
adddescription:
	if [ ! -f Makejpeg ]; then \
	  make description; \
	  mv description Makejpeg ; \
	  exit; \
	fi
	@echo +++ $@
	-DIRLIST=~/public_html/photos/dirlist; \
	BASEDIR=`basename \`pwd\``; \
	co -l $$DIRLIST; \
	grep -v $$BASEDIR $$DIRLIST > dirlist.tmp; \
	echo -n "$$BASEDIR  " >> dirlist.tmp; \
	head -1 ~/Photos/$$BASEDIR/Makejpeg >> dirlist.tmp; \
	sort dirlist.tmp > $$DIRLIST; \
	rm dirlist.tmp; \
	ci -u -m"Automatic checkin" $$DIRLIST

# recover from broken dirlist.  Start in parent directory (~/public_html/Photos)
dirlist:
	rm -f dirlist.new dirlist.err
	for i in [12]*; do \
          if [ -e $$i/description ]; then \
	    (echo -n "$$i "; cat $$i/description) >> dirlist.new; \
	  else \
	     echo >> dirlist.err $$i; \
	  fi; \
	done

#	if [ -f Makejpeg ]; then \
#	  DIRLIST=~/public_html/photos/dirlist; \
#	  BASEDIR=`basename \`pwd\``; \
#	  co -l $$DIRLIST; \
#	  grep -v $$BASEDIR $$DIRLIST > dirlist.tmp; \
#	  echo -n "$$BASEDIR  " >> dirlist.tmp; \
#	  head -1 ~/Photos/$$BASEDIR/Makejpeg >> dirlist.tmp; \
#	  sort dirlist.tmp > $$DIRLIST; \
#	  rm dirlist.tmp; \
#	  ci -u -m"Automatic checkin" $$DIRLIST; \
#	fi

# Description file for index.  I make an exception to my "no
# interactive Makefiles" here, because it's so much work to fix if the
# thing doesn't exist.
description:
	@echo +++ $@
	-DIR=`pwd | sed 's:.*public_html/::'`; \
	BASEDIR=`basename $$DIR`; \
	DATE=`${PHOTOTOOLS}/dateconv -d $$BASEDIR`; \
	OLDDESC=`grep $$BASEDIR ${PUBPHOTOS}/dirlist | sed 's:[0-9]* *::'`; \
	if [ "$$OLDDESC" != "" ]; then \
	  echo No description file ; \
	  echo Using old description: ; \
	  echo ; \
	  echo $$OLDDESC ; \
	  echo $$OLDDESC > $@ ; \
	else \
	  DESCRIPTION= ; \
	  while [ "$$DESCRIPTION" = "" ]; do \
	    echo; \
	    echo 'Enter description of photos:'; \
	    echo; \
	    read -e DESCRIPTION; \
	  done; \
	  echo $$DESCRIPTION > $@; \
	fi

        # XXX not tested
Makejpeg:
	CWD=`pwd`; \
	CONTACTS=/home/`whoami`/public_html/localtmp/contacts/`basename $$CWD`; \
	echo Looking for $$CONTACTS/Makejpeg; \
	if [ -f $$CONTACTS/Makejpeg ]; then \
	    sed < $$CONTACTS/Makejpeg 's:.embedded::' > Makejpeg; \
	elif [ -f makejpeg ]; then \
	  if [ -f description ]; then \
	    mv description Makejpeg; \
	  fi; \
	  sed 's:.JPG::;s: :_DxO :' makejpeg >> Makejpeg; \
	  rm makejpeg; \
	else \
	  if [ -f description ]; then \
	    mv description Makejpeg; \
	  fi; \
	  grep touch script* | sed 's:touch -r ::; s:\.$::' >> Makejpeg; \
	fi

	chmod 666 Makejpeg   # for the web server
	ls -l Makejpeg

# Tidy up old Makejpegs: remove redundant stuff.
newmakejpeg: Makejpeg
	sed < Makejpeg 's:[0-9]* [0-9]*$$::; s:[0-9]$$::; s:^orig/::; s:.JPG::' > foo
	mv Makejpeg Makejpeg.old
	mv foo Makejpeg

Makehouse: multishot
	make housephoto-notes
	(cd orig && awk -f ${PHOTOTOOLS}/housephotos.awk ../housephoto-notes >> ../$@)
	if [ ! -f Makejpeg ]; then \
	  echo House photos > Makejpeg; \
	  cat Makehouse >> Makejpeg; \
	fi
# We don't copy the contents if Makejpeg exists, to avoid multiple copies.

makepano: panodefs
	cd orig && awk -f ${PHOTOTOOLS}/housephotos.awk ../panodefs >> ../Makejpeg

geotag:
	${PHOTOTOOLS}/geotag *.jpeg orig/*.jpg

# This is part of the old housephotos target.  I'm still thinking what
# to do with it.
housephoto-foo:
	if [ -f Makejpeg ]; then \
	  head -1 Makejpeg > description; \
	  tail +2 Makejpeg > makejpeg; \
	  rm Makejpeg; \
	elif [ ! -f description ]; then \
	  echo "House photos" > description; \
	else \
	  make Makejpeg; \
	fi

# XXX temp target until we can process housephotos directly.
housephoto-notes: multishot
	${PHOTOTOOLS}/mkmakejpeg.php > housephoto-notes

HDR4:	multishot
	rm -rf ${HDR4}
	mkdir -p ${HDR4}
	echo Run HDR4 projects, then 'make fromHDR'
	makeHDR.php ${HDR4} `cd orig && ls -rt *.ORF | sed 's:embedded\.::; s:\.JPG::; s:\.jpg::; s:\.ORF::'`

fromHDR:
	fromHDR

housephotos:
# Update the list of dates with house photos.
# Note that at this point we're lying: the photos aren't actually complete.
	co -l ${HOUSEPHOTOS}/photo-dates.php
	mv ${HOUSEPHOTOS}/photo-dates.php /var/tmp/housephotos.$$$$; \
	CWD=`pwd`; \
	DATE=`basename $$CWD`; \
	echo $$DATE >>  /var/tmp/housephotos.$$$$; \
	sort /var/tmp/housephotos.$$$$ | uniq > ${HOUSEPHOTOS}/photo-dates.php; \
	co -l ${HOUSEPHOTOS}/exterior.php; \
	sed < ${HOUSEPHOTOS}/exterior.php > /var/tmp/housephotos.$$$$ \
	  "s:date = \"........:date = \"$$DATE:"; \
	mv /var/tmp/housephotos.$$$$ ${HOUSEPHOTOS}/exterior.php
	-ci -u -m"Automatic update by 'make housephotos'" ${HOUSEPHOTOS}/photo-dates.php \
	  ${HOUSEPHOTOS}/exterior.php
	make Makehouse

# Convert images specified in Makejpeg
# If they go into C/, just link them
convert: C
	${PHOTOTOOLS}/convert

# Make JPEGs for any TIFFs in the main directory.
# convert gets really snaky about DxO TIFFs, so pipe complaints to
# nowhere.
JPEG:
	echo +++ JPEG
	for i in `ls *.tiff 2> /dev/null`; do \
	  MYJPEG=`basename $$i tiff`jpeg; \
	  if [ ! -e "$$MYJPEG" ]; then \
	    convert 2>/dev/null -quality ${JPEGQUALITY}  $$i[0] $$MYJPEG; \
	    ${PHOTOTOOLS}/exifcopy $$i $$MYJPEG; \
	  fi; \
	done

# Link images specified in Makejpeg
link:
	${PHOTOTOOLS}/convert -l

# Link files so that Oly viewer can find them.
foroly:
	foroly ${OLY} `sed < makejpeg "s: .*::; s:orig/::"`

# As above, but get foroly to link all files, even if they've already been converted.
forolybang:
	foroly -f ${OLY} `sed < makejpeg "s: .*::; s:orig/::"`

# Get converted files back from Oly viewer.
fromoly:
	fromoly

# Get converted files back from DxO Optics "Pro".
fromdxo:
	fromdxo

# XXX test stuff with dcraw
dcraw:
	for i in *ORF; do \
	  BASENAME=`basename $$i .ORF`; \
	  echo dcraw -v -p embed $$i\; \
	  convert $$BASENAME.ppm $$BASENAME.jpg\; \
	  rm $$BASENAME.ppm; \
	done | by ${BY}

# Just create the directories
RCS big: .FORCE
	echo +++ $@
	MYDIR=`pwd`; \
	WEBDIR=~/public_html/Photos/`basename $$MYDIR`; \
	mkdir -p $$WEBDIR/$@

tiny small:	.FORCE
	echo +++ $@
	for i in `ls *.jpeg *.gif *.png 2>/dev/null`; do \
	 echo $$i; \
	done | by ${BY} ${PHOTOTOOLS}/mktinysmall.php ${PHOTOTOOLS} `pwd` $@ ${PIXELS$@}; \
	MYDIR=`pwd`; \
	IMAGELINKS=`pwd`/Imagelinks; \
	if [ -f $$IMAGELINKS ]; then \
	  (cd ~/public_html/Photos/`basename $$MYDIR`/$@ && checkimagelinks $$IMAGELINKS $@); \
	fi

clobber:
	if [ -d big ]; then \
	  rm -rf big small tiny RCS; \
	fi

# Link all .jpeg, .png, .gif and .avi files in the source directory to
# the 'big' subdirectory of the web directory, and all .exif files
# into the base web directory.  We're in the source directory when
# this runs.
copy:	big
	${PHOTOTOOLS}/docopy

# This target is to be called in the archive directory under ~/Photos.
# It creates a directory ~/public_html/Photos/<mydir> and populates it.
web:	adddescription JPEG
	MYDIR=`pwd`; \
	WEBDIR=~/public_html/Photos/`basename $$MYDIR`; \
	mkdir -p $$WEBDIR; \
	make -f ${PHOTOTOOLS}/Makefile copy small tiny auxfiles clean

# Clean targets.  'clean' is the most harmless
clean:
	@echo rm -f *~ *.exif *.d.* *.xml
	@rm -f *~ *.exif *.d.* *.xml
	@rmdir _Ashampoo_Photo_Optimizer_Backup || echo

# Remove all files that we can recreate.
cleandir:
	for i in *.JPEG; do \
	  ORF=`basename $$i .JPEG`.ORF; \
	  if [ -e $$ORF ]; then \
	    rm $$i; \
	  fi; \
	done

# Clean away the stuff built by the 'web' target
# This doesn't include flash panoramas, thus the care.
cleanweb: .FORCE
	-MYDIR=`pwd`; \
	THEDIR=~/public_html/Photos/`basename $$MYDIR`; \
	rm -rf $$THEDIR

# XXX this looks like it should all go away
# # Convert ORF to JPEG with default parameters, naming output file
# # <foo>.JPEG
# ORFS	!=	"${PHOTOTOOLS}/lsorf"
# # ORFS	:=	*.ORF
# # ORFS	!=	*
# JPEGS:=${ORFS:S/ORF/JPEG/}
#
# # Ensure that we have one JPEG image for each ORF image in
# # subdirectory orig.
# JPEG:
# 	make1jpeg ${JPEGS} | xargs make -j 5
#
# # Quick and dirty: create JPEG files if needed, put in default
# # description.
# qad:	JPEG
# 	for e in jpg JPEG JPG; do \
# 	  for i in `ls orig/*.$$e 2>/dev/null`; do  \
# 	    DST=`basename $$i $$e`jpeg; \
# 	    if [ ! -e $$DST ]; then \
# 	      ln $$i $$DST; \
# 	    fi; \
# 	  done; \
# 	done
# 	echo > description Quick and dirty photos on `date`
#
# # Slow and dirty: add file to Makejpeg.
# sad:	JPEG
# 	if [ ! -f Makejpeg ]; then echo "Slow and dirty" > Makejpeg; fi; \
# 	for e in jpg JPEG JPG; do \
# 	  for i in `ls orig/*.$$e 2>/dev/null`; do  \
# 	    BASE=`basename $$i .$$e`; \
# 	    grep $$BASE Makejpeg 2> /dev/null; \
# 	    if [ $$? -ne 0 ]; then \
# 	      echo $$BASE $$BASE.jpeg 0 1 >> Makejpeg; \
#             fi; \
# 	    DST=`basename $$i $$e`jpeg; \
# 	    if [ ! -e $$DST ]; then \
# 	      ln $$i $$DST; \
# 	    fi; \
# 	  done; \
# 	done

.FORCE:

test:
	echo ${HOMEDIR}
	echo ${PDIR}

exifcopy:
	if [ -f Makejpeg ]; then \
	  tail +2 Makejpeg | by ${BY} exifcopy-guess -v; \
	elif [ -f makejpeg ]; then \
	  by ${BY} exifcopy-guess < makejpeg; \
	fi

exif:
	${PHOTOTOOLS}/mkexif && true

# Remove .JPEG files if we have a corresponding .jpg file
rmJPEG:
	for i in `ls *.jpg 2>/dev/null`; do \
	  JPEG=`basename $$i .jpg`.JPEG; \
	  if [ -f $$JPEG ]; then \
	    rm $$JPEG; \
	  fi; \
	done

# Space usage by month
spacebymonth:
	for year in `jot 46 1963`; do \
	  for month in `jot -w%02d 12`; do \
	    echo -n "$$year $$month   "; \
	    du -cs  $$year$$month* 2>/dev/null  | grep total; \
	  done; \
	done

.ORF.JPEG:
	echo $@
	${PHOTOTOOLS}/mkjpeg2 `dirname $@`/`basename $@ .JPEG`

imgconvert:
	echo FOO

# Non-rotated contacts
contacts:
	@if [ `whoami`  = "grog" ]; then \
	  WIDTH=400 mkcontacts -r; \
	else \
	  mkcontacts -r; \
	fi

# Rotated contacts
rcontacts:
	@if [ `whoami`  = "grog" ]; then \
	  WIDTH=400 mkcontacts; \
	else \
	  mkcontacts; \
	fi

compare:
	mkcompare

# Ashampoo optimizer
opt:
	photoopt

# Perfectly Clear
clear:
	clarify

# Convenient long cuts
# Hugin project file
pto:
	mkpto

# panorama
panorama:
	mkpanorama

HDR:
	HDRmatic
#	doHDR

sync:
	@if [ "$$ME" = "" ]; then \
	  ME=`whoami`; \
	fi; \
	syncphotodir $$ME `pwd` ${WEBSITES}

# XXX kludge for Chris
csync:
	DIR=`pwd`; \
	DIR=`basename $$DIR`; \
	echo 	rsync  -LzavP --delete-after /home/chris/public_html/Photos/$$DIR w3:/home/chris/www.narrawin.com/Photos; \
	rsync  -LzavP --delete-after /home/chris/public_html/Photos/$$DIR w3:/home/chris/www.narrawin.com/Photos; \
	echo	rsync /home/chris/public_html/photos/dirlist w3:/home/chris/www.narrawin.com/photos; \
	rsync /home/chris/public_html/photos/dirlist w3:/home/chris/www.narrawin.com/photos
	@echo -n 

DxO:
	DxO `tail +2 Makejpeg | sed 's: .*::'`

# Wake up the user
beep:	.FORCE
	@echo -n 

# Ensure C/ directory
C:
	mkdir C

components: C
	mkcomponents

thumbs:
	mkthumbs

youtube:
	mkyoutube

dist:
	tar cvf /Photos/Tools/dist.tar /Photos/Tools/*
	cd /home/grog/public_html; \
	  tar rvf /Photos/Tools/dist.tar  \
	  php/includes/NOTES \
	  php/includes/RCS \
	  php/includes/css.php \
	  php/includes/datefuncs.php \
	  php/includes/db.inc \
	  php/includes/defs.php \
	  php/includes/diary-header.php \
	  php/includes/docontacts.php \
	  php/includes/exifdetails.php \
	  php/includes/footer.php \
	  php/includes/header.php \
	  php/includes/includes.php \
	  php/includes/onephoto.php \
	  php/includes/stdheader.php \
	  php/includes/utils.php \
	  php/includes/weathergraph.php \
	  php/includes/weathergraph2.php \
	  js \
	  photos/Onephoto.php \
	  photos/Photos.php \
	  photos/READMENOW \
	  photos/footing.php \
	  photos/heading.php \
	  photos/photo-index.php \
	  photos/photos.php \
	  photos/photosearch.php \
	  photos/rightmenu.php \
	  diary-jul2012.php
	bzip2 -f dist.tar
	mv dist.tar.bz2 /home/grog/public_html/programs/photo-processing.tar.bz2

# XXX For videos
# Move somewhere else.

# srt:
#    for i in *.mp4 *.avi; do make 
