#!/bin/sh
#
# $Id: songi.in,v 1.8 2025-01-17 12:13:54+05:30 Cprogrammer Exp mbhangui $
#

get_mpd_conf_value()
{
  grep "^$1" /etc/mpd.conf|awk '{print $2}' | \
  sed -e 's{"{{g'
}

locate_file()
{
	dir="$2"
	file=$(basename "$dir")
	while true
	do
		t=$(dirname "$dir")
		if [ -f $1/"$file" ] ; then
			echo "$1/$file" | sed s{"$1"/{{
			break
		fi
		dir="$t"
		file="$(basename "$dir")/$file"
	done
}

display_info()
{
	turi=`echo $1|sed -e "s{'{''{g"`
	out=$(mktemp -t mpdevXXXXXXXXXX)
	Q="SELECT title,play_count,last_played,"
	Q="$Q rating, karma, duration,"
	Q="$Q artist, album, track, genre,"
	Q="$Q date, composer, performer, disc,"
	Q="$Q datetime(date_added, 'unixepoch', 'localtime'),"
	Q="$Q datetime(last_modified, 'unixepoch', 'localtime')"
	Q="$Q FROM song WHERE uri='$turi';"
	sqlite3 -noheader -line -batch $stats_file "$Q" | sed \
		-e 's{.*datetime(date_added.*){  Date Added{g' \
		-e 's{.*datetime(last_modified.*){Last Updated{g' \
		-e 's{                                     {{g' > $out
	t1=$(sed -n 3p < $out | awk '{print $3}')
	if [ -z "$t1" ] ; then
		t1=0
	fi
	# play_count
	t2=$(sed -n 2p < $out | awk '{print $3}')
	if [ -z "$t2" ] ; then
		t2=0
	fi
	if [ $t1 -eq 0 -o $t2 -eq 0 ] ; then
		last_played="never"
	else
		t2=$(date +%s)
		extra_days=0
		extra_days_func $t1
		diff=$(echo $t1 $t2 | awk '{printf("%d\n", $2-$1)}')
		days=$(echo $diff   | awk '{printf("%d\n", $1/86400)}')
		years=$(expr $days / 365)
		days=$(expr $days % 365)
		if [ $extra_days -gt 0 ] ; then
			days=$(expr $days - 1)
		fi
		hours=$(echo $diff  | awk '{printf("%d\n", ($1%86400)/3600)}')
		mins=$(echo $diff   | awk '{printf("%d\n", ($1%3600)/60)}')
		secs=$(echo $diff   | awk '{printf("%d\n", $1%60)}')
		if [ $years -eq 0 ] ; then
			last_played="$(date --date=@"$t1")\n Last Played = $days days $hours hr $mins min $secs sec"
		else
			last_played="$(date --date=@"$t1")\n Last Played = $years years $days days $hours hr $mins min $secs sec"
		fi
	fi
	# duration
	t1=$(sed -n 6p < $out | awk '{print $3}')
	hours=$(echo $t1 | awk '{printf("%d\n", ($1%86400)/3600)}')
	mins=$(echo $t1  | awk '{printf("%d\n", ($1%3600)/60)}')
	secs=$(echo $t1  | awk '{printf("%d\n", $1%60)}')
	if [ "$hours" = "0" ] ; then
		duration="$mins min $secs sec ($t1)"
	else
		duration="$hours hr $mins min $secs sec ($t1)"
	fi
	sed \
		-e "s{last_played.*{Last Played = $last_played{g" \
		-e "s{duration.*{Duration = $duration{g" < $out
	/bin/rm -f $out
}

extra_days_func()
{
	t1=$1
	t2=$(date +%s)
	y1=$(date --date="@$t1" +%Y)
	m1=$(date --date="@$t1" +%m)
	y2=$(date --date="@$t2" +%Y)
	m2=$(date --date="@$t2" +%m)
	year=$y1
	first_flag=1
	extra_days=0
	while true
	do
		leap_year=0
		is_century=$(expr $year % 100)
		if [ $is_century -eq 0 ] ; then
			is_400=$(expr $year % 400)
			if [ $is_400 -eq 0 ] ; then
				leap_year=1
			fi
		else
			is_4=$(expr $year % 4)
			if [ $is_4 -eq 0 ] ; then
				leap_year=1
			fi
		fi
		if [ $leap_year -eq 1 ] ; then
			if [ $first_flag -eq 1 ] ; then
				d1=$(date --date="@$t1" +%d)
				if [ $m1 -eq 2 -a $d1 -lt 29 ] ; then
					extra_days=$(expr $extra_days + 1)
				elif [ $m1 -eq 1 ] ; then
					extra_days=$(expr $extra_days + 1)
				fi
				first_flag=0
			else
				extra_days=$(expr $extra_days + 1)
			fi
		fi
		if [ $year -eq $y2 ] ; then
			if [ $leap_year -eq 1 ] ; then
				d2=$(date --date="@$t2" +%d)
				if [ $m2 -eq 2 -a $d2 -gt 28 ] ; then
					extra_days=$(expr $extra_days + 1)
				elif [ $m2 -gt 2 ] ; then
					extra_days=$(expr $extra_days + 1)
				fi
			fi
			break
		fi
		year=$(expr $year + 1)
		if [ $year -gt $y2 ] ; then
			break
		fi
	done
}

if [ $# -eq 0 ] ; then
	uri=$(mpc current -f %file%)
	if [ -z "$uri" ] ; then
		echo "No song playing and no options given" 1>&2
		exit 1
	fi
fi
music_dir=`get_mpd_conf_value music_directory`
if [ $? -ne 0 ] ; then
  echo "could not get music directory from mpd.conf" 1>&2
  exit 1
fi
sticker_file=$(get_mpd_conf_value sticker_file)
if [ $? -ne 0 ] ; then
	echo "sticker database not enabled in /etc/mpd.conf" 1>&2
	return 1
else
	if [ ! -f $sticker_file ] ; then
		echo "$sticker_file: No such file or directory" 1>&2
		return 1
	fi
fi
stats_dir=$(dirname $sticker_file)
stats_file=$stats_dir/stats.db
if [ ! -f $stats_file ] ; then
	echo "$stats_file: No such file or directory" 1>&2
	return 1
fi
if [ $# -eq 0 ] ; then
	t=$(basename "$uri")
	echo "---- $t ------------------------"
	display_info "$uri"
	echo "----------------------------"
	exit $?
fi
for i in "$@"
do
	uri=$(locate_file "$music_dir" "$i")
	if [ -n "$uri" ] ; then
		t=$(basename "$uri")
		ext=$(echo $t|rev|cut -d. -f1|rev)
		case $ext in
			dsf|flac|m4a|mp3|MP3|ogg|wma|wv)
			echo "---- $t ------------------------"
			display_info "$uri"
			echo "----------------------------"
			;;
			*)
			echo "Unsupported extension $ext in $t" 1>&2
			;;
		esac
	fi
done
#
# $Log: songi.in,v $
# Revision 1.8  2025-01-17 12:13:54+05:30  Cprogrammer
# display last played in years, days, hours, minutes, seconds
#
# Revision 1.7  2024-04-04 20:51:29+05:30  Cprogrammer
# fixed last_played when song has never been played
#
# Revision 1.6  2024-03-26 19:24:12+05:30  Cprogrammer
# display last played in days, hours, mins, secs ago
#
# Revision 1.5  2022-06-20 01:07:30+05:30  Cprogrammer
# use directories set in ./configure
#
# Revision 1.4  2021-10-15 18:41:52+05:30  Cprogrammer
# formatted for better display
#
# Revision 1.3  2021-10-14 22:39:24+05:30  Cprogrammer
# bugfix for period in filenames
#
# Revision 1.2  2021-10-01 12:05:56+05:30  Cprogrammer
# removed name column from song table in stats db
#
# Revision 1.1  2021-09-30 20:31:57+05:30  Cprogrammer
# Initial revision
#
