From d099c224b39c691493868c29bb84d5e3fcc252e1 Mon Sep 17 00:00:00 2001
From: Salt <rehashedsalt@cock.li>
Date: Fri, 13 Sep 2019 22:00:34 -0500
Subject: [PATCH] ptgdp: Add some preprocessor shenanigans

---
 ptgdp | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 51 insertions(+), 5 deletions(-)

diff --git a/ptgdp b/ptgdp
index 2594ddd..aaef463 100755
--- a/ptgdp
+++ b/ptgdp
@@ -20,6 +20,10 @@ _ptgdpmusicdir="$_musicdir/${PTGDP_MUSIC_DIR:-PTGDP Songs}"
 declare -a _queue
 declare -a _playlists
 
+# Preprocessor-accessible vars
+declare p_ytdlargs="--geo-bypass"
+declare p_search="ytsearch:"
+
 # Helper functions
 log() {
 	[ -z "$1" ] && return 1 # Message body
@@ -54,7 +58,29 @@ execpreprocessor() {
 	# Execute a preprocessor line
 	# $1: The line, either stripped or not of the leading #:
 	line="${1#\#:}"
-	log "pp: $line"
+	read -r -a args <<< "$line"
+	case ${args[0]} in
+		ytdlargs)
+			local old="$p_ytdlargs"
+			p_ytdlargs="${args[@]:1}"
+			if ! [ "$p_ytdlargs" = "$old" ]; then
+				log "Setting youtube-dl arguments \"$p_ytdlargs\""
+			fi
+			;;
+		search)
+			local old="$p_search"
+			p_search="${args[@]:1}"
+			if [ "$p_search" = "${p_search%:}" ]; then
+				p_search="${p_search}:"
+			fi
+			if ! [ "$p_search" = "$old" ]; then
+				log "Setting default search method \"$p_search\""
+			fi
+			;;
+		*)
+			error "Preprocessor command \"${args[0]}\" not implemented"
+			;;
+	esac
 }
 checkforsong() {
 	# $1: A song name to validate
@@ -87,9 +113,9 @@ cachesong() {
 			youtube-dl \
 				--add-metadata \
 				--audio-format "best" \
-				--default-search "ytsearch:" \
-				--geo-bypass \
+				--default-search "$p_search" \
 				--playlist-items 1 \
+				"$p_ytdlargs" \
 				-x \
 				-o "$_tmpfile.%(ext)s" \
 				"$1" \
@@ -274,10 +300,19 @@ given plaintext FILEs with only search queries.
 			be a file in this mode
   -h			Print this help text
 
+Preprocessor Commands
+
+Any line prefixed with #: is interpreted as a preprocessor command. Commands
+are IFS-separated with everything after the first word interpreted as arguments.
+
+  search		Set the default search prefix, with or without a
+			trailing colon.
+  ytdlargs		A set of arguments to pass to youtube-dl
+
 Environment Variables
 
-In addition to XDG-spec variables (XDG_CACHE_HOME, user-dirs.dirs, etc.), ptgdp
-also respects an additional variable:
+In addition to XDG-spec variables (XDG_CACHE_HOME, user-dirs.dirs, etc.),
+$_name also respects an additional variable:
 
   PTGDP_MUSIC_DIR	The subdirectory in XDG_MUSIC_DIR to save music to
 
@@ -365,6 +400,12 @@ playlist() {
 		maxlines+=1
 	done < "$1"
 	log "Parsed playlist \"$1\" with $maxlines songs"
+	# Store old preprocessor settings
+	declare -a oldsettings
+	while read var; do
+		oldsettings+=("$(declare -p "$var")")
+	done < <(compgen -v "p_")
+	# Parse out the playlist
 	while read line; do
 		validateline "$line"
 		case $? in
@@ -394,6 +435,11 @@ playlist() {
 				;;
 		esac
 	done < <(if [ -n "$_optshuffle" ]; then shuf "$1"; else cat "$1"; fi)
+	# Return to normality
+	for var in "${oldsettings[@]}"; do
+		eval "$var"
+	done
+	# Dump some stats
 	if [ "$dlexist" = "0" ] && [ "$dlsuccess" = "0" ] && [ -z "$_optdryrun" ]; then
 		notify "Failed to download playlist" \
 			"The playlist in its entirety could not be downloaded. Ensure that youtube-dl is up to date, you have a valid internet connection, and your search queries pull up results" \