#!/bin/bash
#                       /usr/local/bin/qyou
# https://crystalfaeries.net/posix/bin/qyou
# celeste:crystalfaery QYOU 2020-05-14 17:56:09+00:00
# this is the command-line user control and status monitoring program for the daemon youtubedownload
# if invoked with ususal version (-v|--version) or help (-h|--help) arguments, deliver info		and quit
# if invoked with argument -p,		display any running youtube download processes			and quit
# if invoked with argument -l,		display the tail	 	of the youtubedownload log	and quit
# if invoked with argument -l n,	display the tail n lines	of the youtubedownload log	and quit
# if invoked with argument -F, Follow	the tail			of the youtubedownload log
# if invoked with argument -i, interactively receive  URLs to add to	the queue
# if invoked with argument -e, interactively edit the URLs	in	the queue
# if invoked with argument -k, kill	the youtubedownload daemon					and quit
# if invoked with argument -s, start	the youtubedownload daemon					and quit
# if invoked with argument -m		update the metadata webpage from archive and queue		and quit
# if invoked with argument -r		remove URL/youtube_hashcode from our records			and quit
# if invoked with argument -w		watch videos listed in  youtubedownload queue without downloading & quit
# if invoked sans arguments, display   the       existing	youtubedownload queue			and quit
# if invoked with any other arguments, add those URLs  to  the	youtubedownload queue			and quit
# NOTE: we have configured our rsnapshotlimit daemon,  upon finding free disk space, to call "qyou -s",  which
#    if youtubedownload daemon is not already running, will start it running, thus full auto youtube downloads.
let help=21	# this line number -1
QUE="${HOME}"/downloads/youtube.com/.youtube.txt
			   TMP=/tmp/.youtube.txt
cd -P "${HOME}" # there's no place like Aum

case	$# in
0)	# if invoked without arguments, display the existing youtubedownload queue
#	echo "youtubedownload queue:"				>& 2
	sort -u "${HOME}"/downloads/youtube.com/.youtube.txt
	;;
*)
	# if invoked with ususal version or help arguments, deliver that info	and quit
	case "${1}" in
	-h)		head -n ${help} $0
			;;
	--help)		head -n ${help} $0
			;;
	-v)		head -n 4 $0 | tail -n 1
			;;
	--version)	head -n 4 $0 | tail -n 1
			;;
	-p)		ps -ef --forest | grep "/usr/local/bin/qyou"			| grep -v grep | grep -v "/bin/bash /usr/local/bin/qyou -p"
			ps -ef --forest | grep "/usr/local/bin/youtubedownload"		| grep -v grep
			ps -ef --forest | grep "python /usr/local/bin/youtube-dl"	| grep -v grep
			;;
	-l)		shift	# consume the -l and check for a line count for tail:
			if [ $# -ne 0 ]
			then
				tail -n ${1}	$HOME/downloads/youtube.com/.youlog.txt
			else
				tail		$HOME/downloads/youtube.com/.youlog.txt
			fi
			;;
	-F)		tail -F	$HOME/downloads/youtube.com/.youlog.txt
			;;
	-w)		for URL in	$(sort -u $HOME/downloads/youtube.com/.youtube.txt)
			do
						   HASH="$(echo ${URL} | sed 's/^.*v=//;s/^-//')"
			vid_title="$(grep	"${HASH}"	"${HOME}"/downloads/youtube.com/.youtitles.txt | cut -f2-)"	|| \
			vid_title="$(youtube-dl --get-title	https://www.youtube.com/watch?v=${HASH})"			&& \
			echo "${HASH}	${vid_title}" >>	"${HOME}"/downloads/youtube.com/.youtitles.txt
			if	[      "${vid_title}" == "" ]
			then
				echo	"UNAVAILABLE:	https://www.youtube.com/watch?v=${HASH}"	1>&2
				echo   	"${URL}" >>	"${HOME}"/downloads/youtube.com/youtube.txt
				grep -v	"${URL}"	"${HOME}"/downloads/youtube.com/.youtube.txt	\
				>  /tmp/.$$.youtube.txt
				mv /tmp/.$$.youtube.txt	"${HOME}"/downloads/youtube.com/.youtube.txt
			else
				echo	"WATCHING:	${vid_title}"			1>&2
				firefox	"${HOME}"/downloads/i.ytimg.com/vi/"${HASH}"/*.jpg
				vlc -f	"${URL}"					   2>	/dev/null
				read -p "Delete URL from queue? (abort = quit watching, yes = DELETE, now = DOWNLOAD, else KEEP): "
				case "${REPLY}" in
				abort | quit )	echo "ABORTing watching of queued URLs"	1>&2
					exit	0
					;;
				now )	echo "Downloading "${URL}" NOW."		1>&2
					pushd	${HOME}/downloads/youtube.com/ &&	\
nohup					youtube-dl     "${URL}"	< /dev/null >& /dev/null & disown %1 # in background
					popd 2> /dev/null
					grep -v	       "${URL}"	"${HOME}"/downloads/youtube.com/.youtube.txt	\
					>  /tmp/.$$.youtube.txt
				       	mv /tmp/.$$.youtube.txt	"${HOME}"/downloads/youtube.com/.youtube.txt
					;;
				yes | y) echo "Deleting "${URL}" from queue."		1>&2
					grep -v		"${URL}" "${HOME}"/downloads/youtube.com/.youtube.txt	\
					>  /tmp/.$$.youtube.txt
				       	mv /tmp/.$$.youtube.txt	"${HOME}"/downloads/youtube.com/.youtube.txt
					;;
				* )	echo "Keeping: "${URL}"  in  queue."		1>&2
					:
					;;
				esac
			fi
			done
			exit	$?
		;;
	-e)	# if invoked with argument -e, interactively edit the URLs	in	the queue
			sort -u		   $HOME/downloads/youtube.com/.youtube.txt	\
			>	/tmp/.$$.youtube.txt
			vi	/tmp/.$$.youtube.txt # daemons may alter original files while we edit a temporary copy then clobber originals
						     # try not to lose any items from the queue file
			sort -u	/tmp/.$$.youtube.txt					\
			>		   $HOME/downloads/youtube.com/.youtube.txt
			exit	$?
		;;
	-i)	# if invoked with argument -i, interactively receive URLs to add to the queue
		while read URL
		do
			echo "${URL}"	>> $HOME/downloads/youtube.com/.youtube.txt	# append new URL
		done
		;;
	-k)	# kill youtubedownload
		# notice the first grep string MUST match the initial invocation in user's crontab and here:
		PID=$(ps -ef --forest | grep "/usr/local/bin/youtubedownload" | grep -v grep | sed "s/^$(whoami) *//;s/ .*$//")
		echo "killing ${PID}"
		for signal in HUP TERM KILL;do
			kill -"${signal}" ${PID}	>> $HOME/downloads/youtube.com/.youlog.txt	2> /dev/null
			sleep 5
		done
		exit	$?
		;;
	-s)	# start the youtubedownload daemon ONLY IF IT IS NOT ALREADY RUNNING
		# notice the first grep string MUST match the initial invocation in user's crontab and here:
		PID=$(ps -ef --forest | grep "/usr/local/bin/youtubedownload" | grep -v grep | sed "s/^$(whoami) *//;s/ .*$//")
		if [ "${PID}" == "" ]
		then
			:	# youtubedownload is already running
		else
			nohup /usr/local/bin/youtubedownload >> $HOME/downloads/youtube.com/.youlog.txt 2>&1 &
		fi
		exit	$?
		;;
	-m)	# update the metadata webpage from archive and queue and quit
		META="$HOME/crystalfaeries.net/video/videos.html"
		rsync -auvH "${META}" "${META}~"	# backup the metapage
		echo "<html><head><title>Videos</title></head><body><h1 align="center">Videos</h1>"	>	"${META}"
		echo "<ul>"										>>	"${META}"
		grep '^youtube '	$HOME/downloads/youtube.com/.archive.txt | sed 's/^youtube //'	>	/tmp/$$.txt
		grep 'https://www.youtube.com/watch?v='	$HOME/downloads/youtube.com/.youtube.txt	\
		|	sed 's/^https:\/\/www.youtube.com\/watch?v=//'					>>	/tmp/$$.txt
		grep 'http://www.youtube.com/watch?v='	$HOME/downloads/youtube.com/.youtube.txt	\
		|	sed 's/^http:\/\/www.youtube.com\/watch?v=//'					>>	/tmp/$$.txt
		cut -f2- $HOME/crystalfaeries.net/links.txt						\
		|	grep 'https://www.youtube.com/watch?v='						\
		|	sed 's/^https:\/\/www.youtube.com\/watch?v=//'					>>	/tmp/$$.txt
		cut -f2- $HOME/crystalfaeries.net/links.txt						\
		|	grep 'http://www.youtube.com/watch?v='						\
		|	sed 's/^http:\/\/www.youtube.com\/watch?v=//'					>>	/tmp/$$.txt
		for HASH in								$(sort -u		/tmp/$$.txt)
		do # LOOP through hashes collecting matching titles
			vid_title="$(    youtube-dl	--get-title	https://www.youtube.com/watch?v=${HASH})"
		if	[ "${vid_title}" == "" ]
		then
		#	echo -n "<li>UNAVAILABLE: https://www.youtube.com/watch?v=${HASH}</li>" >> "${META}"
			echo -n "<p> UNAVAILABLE: https://www.youtube.com/watch?v=${HASH} </p>" >  "${HOME}/downloads/youtube.com/${vid_title}.html"
			grep -v "${HASH}"	${HOME}/downloads/youtube.com/.archive.txt		\
			>	/tmp/.$$.txt
			mv	/tmp/.$$.txt	${HOME}/downloads/youtube.com/.archive.txt	# delete our referring link
			grep -v "${HASH}"	${HOME}/downloads/youtube.com/.youtube.txt		\
			>	/tmp/.$$.txt
			mv	/tmp/.$$.txt	${HOME}/downloads/youtube.com/.youtube.txt	# delete our referring link
			grep -v "${HASH}"	/home/celeste/crystalfaeries.net/links.txt		\
			>	/tmp/.$$.txt
			mv	/tmp/.$$.txt	/home/celeste/crystalfaeries.net/links.txt	# delete our referring link
			grep -H "${HASH}"	/home/celeste/crystalfaeries.net/src/*.txt		\
			>>			/home/celeste/crystalfaeries.net/src/.unavailable.txt	# todo: clear from articles
		else	# build list of video hashes+titles
			echo	"${HASH}	${vid_title}" >>	${HOME}/downloads/youtube.com/.youtitles.txt
		fi
		done;	rm	/tmp/$$.txt	# clean-up
		sort -u -k2 <						${HOME}/downloads/youtube.com/.youtitles.txt	\
		|	while read HASH vid_title #	list of video hashes+titles
		do	# LOOP through alphabetized	list of video hashes+titles
			    thumbnail_url="$(youtube-dl	--get-thumbnail https://www.youtube.com/watch?v=${HASH})"
		download "${thumbnail_url}" < /dev/null >& /dev/null & disown %1 >& /dev/null	# fetch the thumbnail IN BACKGROUND
			echo -n '<li>'							>> "${META}"
			echo -n '<li>'							>  "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo     "${vid_title}"						>> "${META}"	# video title
			echo     "${vid_title}"						>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo -n '<br><a href="https://www.youtube.com/watch?v='		>> "${META}"
			echo -n '<br><a href="https://www.youtube.com/watch?v='		>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo -n "${HASH}"						>> "${META}"
			echo -n "${HASH}"						>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo -n '"><img width="320" height="240" align="right"	src="'	>> "${META}"
			echo -n '"><img						src="'	>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo -n  "${thumbnail_url}"					>> "${META}"	# reference thumbnail
			echo -n  "${vid_title}.jpg"					>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo -n '"></a><br><pre>'					>> "${META}"
			echo -n '"></a><br><pre>'					>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			youtube-dl --get-description --get-format --get-duration			\
			https://www.youtube.com/watch?v="${HASH}" | fold -s | tee -a	   "${META}"	\
											>> "${HOME}/downloads/youtube.com/${vid_title}.html"
			echo	"</pre><br clear="all"></li>"				>> "${META}"
			echo	"</pre><br clear="all"></li>"				>> "${HOME}/downloads/youtube.com/${vid_title}.html"
		done
		echo "</ul>"								>> "${META}"

		# now add links to any Vimeos we've referenced:
		echo '<br clear="all"><a name="vimeos"><hr align="center" width="50%"></a><h1 align="center">Vimeos</h1><ul>' \
											>> "${META}"
		for f in $(grep vimeo crystalfaeries.net/src/*.txt		\
			| grep -v glossary.txt					\
			| sed 's/^.*http:/https:/;s/^.*https:/https:/;s/".*$//'	\
			| sort -u )
		do
			echo -n '<li><a href="'
			echo -n "${f}"
			echo -n '">'
			echo -n "${f}"
			echo    '</a></li>'
			done								>> "${META}"
		# now complete the page with footer:
		cat	$HOME/crystalfaeries.net/README.html				>> "${META}"
		exit	$?	# pau for now
		;;
	-r)	# remove hashcodes from the youtubedownload queue and records
		shift	# consume the -r then remove hashcodes:
		while [ $# -gt 0 ]
		do
		    extract=$(	  echo "${1}"	    | sed 's/\&list=.*$//;s/^.*=//;s/^.*\///')	# just the hashcode
		    if [ 12 -ne $(echo "${extract}" | /usr/local/bin/wc | sed 's/^.* //') ]
		    then	# we have to fix our code here :-(
			echo	"$0 -r trying to remove video:	${1}"		1>&2
			echo	"we extracted AS hashcode:	${extract}"	1>&2
			exit	1	# Yes, we expect to fail gloriously on non-YouTube URLs :-( always room for more code :-)
		    else	# we successfully extracted the youtube hashcode
			shift	# therefore we may consume the argument
			for oldfile in	${HOME}/downloads/youtube.com/.{archive,hash,playou,youlog,youtitles,youtube}.txt	\
					$HOME/crystalfaeries.net/links.txt $HOME/crystalfaeries.net/recently_linked.html
			do
				grep -v "${extract}"	"${oldfile}" >	/tmp/$$.txt
				mv					/tmp/$$.txt	\
							"${oldfile}"
			done
			grep -Hi	"${extract}"	$HOME/crystalfaeries.net/{src/,}*.{txt,html}	\
					>>		$HOME/crystalfaeries.net/src/.qyou-r."${extract}".txt	# todo: remove references
		    fi
		done
		;;
	*)	# if invoked with any other arguments, add those URLs to the youtubedownload queue
		while [ $# -gt 0 ]
		do
		    if [ 12 -eq $(echo "${1}" | /usr/local/bin/wc | sed 's/^.* //') ]
		    then	# we have a naked youtube hashcode
			echo	"https://www.youtube.com/watch?v=${1}"	>> $HOME/downloads/youtube.com/.youtube.txt	# append new URL
		    else	# hopefully we have a full URL
			echo					"${1}"	>> $HOME/downloads/youtube.com/.youtube.txt	# append new URL
		    fi
		    shift	# consume the argument
		done
		;;
	esac
	;;
esac
exit	$?

# Cannonicalization of the queue:

sort -u "${QUE}" > "${TMP}"	# minimized que entries
mv	"${QUE}"   "${QUE}-"	# backup of que
touch	"${QUE}"		# empty new que
sort -u < "${QUE}" | grep			 'http://youtu.be/'	>> "${TMP}"
sort -u < "${QUE}" | grep			'https://youtu.be/'	>> "${TMP}"
sort -u < "${QUE}" | grep	      'http://youtube.com/watch?v='	>> "${TMP}"
sort -u < "${QUE}" | grep	     'https://youtube.com/watch?v='	>> "${TMP}"
sort -u < "${QUE}" | grep	  'http://www.youtube.com/watch?v='	>> "${TMP}"
sort -u < "${QUE}" | grep	 'https://www.youtube.com/watch?v='	>> "${TMP}"

#	HACKING ZONE:

grep -v  'http://youtu.be/' | \
grep -v 'https://youtu.be/' | \
grep -v  'http://youtube.com/watch?v=' | \
grep -v 'https://youtube.com/watch?v=' | \
grep -v  'http://www.youtube.com/watch?v=' | 
grep -v 'https://www.youtube.com/watch?v='				>  "${TMP}"

grep    "youtu\.be/" "${HOME}"/downloads/youtube.com/.youtube.txt     | \
sed   's/youtu\.be\//youtube.com\/watch?v=/g' > /tmp/.youtube.txt
grep -v	"youtu\.be/" "${HOME}"/downloads/youtube.com/.youtube.txt	\
					     >> /tmp/.youtube.txt
sed 's/http:\/\//https:\/\/;s/\/youtube/www.youtube/'			\
					      < /tmp/.youtube.txt     > \
		     "${HOME}"/downloads/youtube.com/.youtube.txt

#	The static image for the youtube video is to be found at:
#	"${HOME}"/downloads/i.ytimg.com/vi/THEHASHCODE/*.jpg

#	HACKED ZONE.

