#!/bin/ksh

function get_avi_info {
	typeset fileinfo=$(file "$1" | cut -d: -f2-)
	typeset codec=""

	if [[ $fileinfo = *video:* ]]
	then
		codec=$(echo "$fileinfo" |
			sed -e 's/.*video: //' | sed 's/,.*//')
	fi
	[ "$codec" != "" ] && echo "with $codec codec."
}


function get_mp3_info {
	typeset fileinfo=$(file "$1" | cut -d: -f2-)
	typeset encoding=""

	if [[ $fileinfo = *kBit:* ]]
	then
		encoding=$(echo "$fileinfo" |
			sed -e 's/.*MP3, //' | sed 's/JStereo/joint-stereo/')
	else
		encoding=$(mpg123 -t "$file" 2>&1 | grep "^MPEG 1" |
			sed -e 's/MPEG.*III, //')
	fi
	[ "$encoding" != "" ] && echo "encoded at $encoding."
}


function generate_media_report {
	echo "<UL>"
	player=""
	while [ $# -ge 1 ]
	do
	    for file in $1.*
	    do
		dir=$(dirname "$file")
		name=$(basename "$file")
		nf=$(echo "$name" | fgrep -c .)
		type=$(echo "$name" | awk -F. '{print $NF}')
		if [ ! -f "$file" ]
		then
			echo "<LI>$name not yet available."
			continue
		fi
		size=$(ls -l "$file" | awk '{print $5}')
		un=0
		while [ $size -gt 10000 ]
		do
			let un=un+1
			let size=size/1000
		done
		units=""
		case "${#size}" in
			0)	echo "Assertion failed: File size field is empty."
				exit 1 ;;
			1|2|3)	value="$size" ;;
			4)	value="${size:0:1}.${size:1:1}"
				let un=un+1
				;;
		esac
		case "$un" in
			0)	units="Bytes" ;;
			1)	units="KB" ;;
			2)	units="MB" ;;
			3)	units="GB" ;;
			4)	units="TB" ;;
			5)	units="PB" ;;
			6)	units="EB" ;;
			7)	units="ZB" ;;
			8)	units="YB" ;;
		esac

		additional=""
		audiomime=""
		videomime=""
		mime=""
		case "$type" in
			avi)		type="AVI media"
					additional=$(get_avi_info "$file") ;;
			asf)		type="Advanced Streaming Format" ;;
			htm|html)	type="Web page" ;;
			mov)		type="QuickTime video" ;;
			mp3)		type="MPEG-1 layer 3 audio"
					audiomime="audio/mpeg"
					additional=$(get_mp3_info "$file") ;;
			mp4)		type="MPEG-4 audio"
					videomime="video/mp4" ;;
			mpeg|mpg)	type="MPEG-1 video"
					videomime="video/mpeg" ;;
			ogg)		type="OGG audio"
					audiomime="audio/ogg" ;;
			pdf)		type="Adobe PDF document"
					mime="application/pdf" ;;
			rm)		type="RealMedia media"
					mime="application/vnd.rn-realmedia" ;;
			txt)		type="Text file"
					mime="text/plain" ;;
			wav)		type="WAV audio"
					audiomime="audio/wav" ;;
			web)		continue ;;
			epub)		type="Electronic Publication"
					mime="application/epub+zip" ;;
			*)		type="$type media" ;;
		esac
		[ "$mime" != "" ] && mime="TYPE=\"$mime\""
		echo "<LI><A HREF=\"$file\" $mime>$file</A>: $type ($value $units) $additional"
		if [ "$audiomime" != "" ]
		then
			[ "$player" = "" ] && player="<BR><AUDIO CONTROLS>"
			player="$player<SOURCE SRC=\"$file\" TYPE=\"$audiomime\">"
		fi
		if [ "$videomime" != "" ]
		then
			[ "$player" = "" ] && player="<BR><VIDEO CONTROLS>"
			player="$player<SOURCE SRC=\"$file\" TYPE=\"$videomime\">"
		fi
	    done
	    shift
	done
	if [ "$player" != "" ]
	then
		echo "${player}Your browser cannot play this audio file.</AUDIO>"
	fi
	echo "</UL>"
}

function get_preferred_format {
	typeset available="$1" type
	shift 1
	for type in "$@"
	do
		if [ $(print -- "$available" | grep -c "^$type\$") -gt 0 ]
		then
			print -n "$type"
			return 0
		fi
	done
	return 1
}


function generate_video_preferences {
	typeset file="$1" filetype image
	typeset extension="$(print "$file" | awk -F. '{print $NF }')"
	typeset basefile="$(dirname "$file")/$(basename "$file" ".$extension")"
	typeset extensions="$(ls -1 "$basefile".* | awk -F. '{print $NF}')"
	typeset images="$(print "$extensions" | egrep    '^(jpg|jpeg|gif|png)$')"
	typeset videos="$(print "$extensions" | egrep -v '^(jpg|jpeg|gif|png)$')"
	image="$(get_preferred_format "$images" jpeg jpg png gif)" &&
	    print "m4_define(\`\`__VIDEO_STATIC_IMAGE'',\`\`$basefile.$image'')"
	extensions="$(print -- $extensions)"
	print -- "m4_define(\`\`__VIDEO_AVAILABLE_FORMATS'',\`\`$extensions'')" | sed 's/ /,/g'
	print -- "m4_define(\`\`__VIDEO_BASEFILE'',\`\`$basefile'')" | sed 's/ /,/g'
}


action=generate_media_report
[ "$1" = "-t" ] && action="generate_video_preferences" && shift

eval "$action \"$@\""

exit 0
