From 3f1eaf5a1645b28ca18cfa028417dc225b7a557f Mon Sep 17 00:00:00 2001 From: Raghav Gururajan Date: Mon, 5 Jul 2021 06:45:49 -0400 Subject: [PATCH] Modify the strings of referenced programs. Pattern the strings of referenced programs, so that they can be easily substituted with absolute paths using a custom-phase. Co-authored-by: jgart --- ytfzf | 198 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/ytfzf b/ytfzf index f4d2e0d..e8bb60b 100755 --- a/ytfzf +++ b/ytfzf @@ -49,17 +49,17 @@ cache_dir=${YTFZF_CACHE-${cache_dir-$HOME/.cache/ytfzf}} #video type preference (mp4/1080p, mp4/720p, etc..) video_pref=${YTFZF_PREF-${video_pref-}} #the menu to use instead of fzf when -D is specified -external_menu=${YTFZF_EXTMENU-${external_menu-dmenu -i -l 30 -p Search:}} +external_menu=${YTFZF_EXTMENU-${external_menu-@dmenu@ -i -l 30 -p Search:}} #number of columns (characters on a line) the external menu can have #necessary for formatting text for external menus external_menu_len=${YTFZF_EXTMENU_LEN-${external_menu_len-220}} #player settings (players need to support streaming with youtube-dl) #player to use for watching the video -video_player=${YTFZF_PLAYER-${video_player-mpv}} +video_player=${YTFZF_PLAYER-${video_player-@mpv@}} #if YTFZF_PREF is specified, use this player instead -video_player_format=${YTFZF_PLAYER_FORMAT-${video_player_format-mpv --ytdl-format=}} +video_player_format=${YTFZF_PLAYER_FORMAT-${video_player_format-@mpv@ --ytdl-format=}} #player to use for audio only -audio_player=${YTFZF_AUDIO_PLAYER-${audio_player-mpv --no-video}} +audio_player=${YTFZF_AUDIO_PLAYER-${audio_player-@mpv@ --no-video}} #the command to use for displaying thumbnails thumb_disp_method=${YTFZF_THUMB_DISP_METHOD-${thumb_disp_method-ueberzug}} #Storing the argument and location for autogenerated subtitles @@ -85,8 +85,8 @@ subscriptions_file=${subscriptions_file-$config_dir/subscriptions} #> stores the pid of running ytfzf sessions pid_file="$cache_dir/.pid" #> make folders that don't exist -[ -d "$cache_dir" ] || mkdir -p "$cache_dir" -[ -d "$thumb_dir" ] || mkdir -p "$thumb_dir" +[ -d "$cache_dir" ] || @mkdir@ -p "$cache_dir" +[ -d "$thumb_dir" ] || @mkdir@ -p "$thumb_dir" #> config settings #list of shortcuts to use in fzf @@ -177,12 +177,12 @@ dep_ck () { done unset Dep } -dep_ck "jq" "youtube-dl" "curl" +dep_ck "@jq@" "@youtube-dl@" "@curl@" #only check for mpv if $YTFZF_PLAYER is set to it #don't check $YTFZF_PLAYER as it could be multiple commands -[ "$video_player" = "mpv" ] && dep_ck "mpv" +[ "$video_player" = "@mpv@" ] && dep_ck "@mpv@" ############################ # Help Texts # @@ -326,8 +326,8 @@ print_info () { } print_error () { - [ $ext_menu_notifs -eq 1 ] && notify-send "error" "$*" || printf "\033[31m$*\033[0m" >&2 - [ $ext_menu_notifs -eq 1 ] && notify-send "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2 + [ $ext_menu_notifs -eq 1 ] && @notify-send@ "error" "$*" || printf "\033[31m$*\033[0m" >&2 + [ $ext_menu_notifs -eq 1 ] && @notify-send@ "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2 } ############################ @@ -398,12 +398,12 @@ format_fzf () { format_menu () { if [ "$is_ext_menu" -eq 0 ]; then #dep_ck fzf here because it is only necessary to use here - dep_ck "fzf" - menu_command='column -t -s "$tab_space" | fzf -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS' + dep_ck "@fzf@" + menu_command='@column@ -t -s "$tab_space" | @fzf@ -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS' format_fzf else # Dmenu doesn't render tabs so removing it - menu_command='tr -d "$tab_space" | '"$external_menu" + menu_command='@tr@ -d "$tab_space" | '"$external_menu" format_ext_menu fi } @@ -461,13 +461,13 @@ ID="ytfzf-ueberzug" WIDTH=$FZF_PREVIEW_COLUMNS HEIGHT=$FZF_PREVIEW_LINES start_ueberzug () { - [ -e $FIFO ] || { mkfifo "$FIFO" || exit 1 ; } - ueberzug layer --parser json --silent < "$FIFO" & + [ -e $FIFO ] || { @mkfifo@ "$FIFO" || exit 1 ; } + @ueberzug@ layer --parser json --silent < "$FIFO" & exec 3>"$FIFO" } stop_ueberzug () { exec 3>&- - rm "$FIFO" > /dev/null 2>&1 + @rm@ "$FIFO" > /dev/null 2>&1 } preview_img () { @@ -476,12 +476,12 @@ preview_img () { shorturl=${args##*${tab_space}|} shorturl="${shorturl%% *}" - json_obj=$(printf "%s" "$videos_json" | jq '.[]|select( .videoID == "'"$shorturl"'")') + json_obj=$(printf "%s" "$videos_json" | @jq@ '.[]|select( .videoID == "'"$shorturl"'")') IFS=$tab_space read -r title channel duration views date description <<-EOF $( - printf "%s" "$json_obj" | jq -r \ + printf "%s" "$json_obj" | @jq@ -r \ ' [.title,.channel,.duration,.views,.date,.description]|@tsv ' @@ -530,31 +530,31 @@ preview_img () { } > "$FIFO" ;; catimg) printf "\n" - catimg -w "$((thumb_width * 2))" "$IMAGE" ;; + @catimg@ -w "$((thumb_width * 2))" "$IMAGE" ;; jp2a) printf "\n" - jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=24 "$IMAGE" ;; + @jp2a@ --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=24 "$IMAGE" ;; jp2a-8) printf "\n" - jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=8 "$IMAGE" ;; + @jp2a@ --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=8 "$IMAGE" ;; jp2a-4) printf "\n" - jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=4 "$IMAGE" ;; + @jp2a@ --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=4 "$IMAGE" ;; jp2a-gray|jp2a-grey) printf "\n" - jp2a --size="${thumb_width}x$((thumb_height / 2))" "$IMAGE" ;; + @jp2a@ --size="${thumb_width}x$((thumb_height / 2))" "$IMAGE" ;; chafa) printf "\n" - chafa --size="${thumb_width}x${thumb_height}" "$IMAGE" ;; + @chafa@ --size="${thumb_width}x${thumb_height}" "$IMAGE" ;; chafa-gray|chafa-grey) printf "\n" - chafa --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;; + @chafa@ --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;; chafa-4) printf "\n" - chafa --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;; + @chafa@ --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;; chafa-8) printf "\n" - chafa --size="${thumb_width}x${thumb_height}" --colors=256 "$IMAGE" ;; + @chafa@ --size="${thumb_width}x${thumb_height}" --colors=256 "$IMAGE" ;; custom) if ! function_exists "handle_display_img"; then printf "\033[031mERROR[#07]: \033[0m\033[1mhandle_display_img\033[0m is not defined" >&2 @@ -585,20 +585,20 @@ download_thumbnails () { if [ "$thumbnail_quality" -eq 1 ]; then image_download () { # higher quality images - curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png" + @curl@ -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png" } else image_download () { - curl -s "$Url" > "$thumb_dir/$Name.png" + @curl@ -s "$Url" > "$thumb_dir/$Name.png" } fi print_info "Downloading Thumbnails...\n" thumb_urls=$(printf "%s" "$*" |\ - jq -r '.[]|[.thumbs,.videoID]|@tsv' ) + @jq@ -r '.[]|[.thumbs,.videoID]|@tsv' ) while IFS=$tab_space read -r Url Name; do - sleep 0.001 + @sleep@ 0.001 { image_download } & @@ -628,7 +628,7 @@ get_sp_filter () { #another example is sort by filter + upload date filter only changes one character as well if [ -n "$filter_id" ]; then #gets the character in the filter_id that needs to be replaced if upload_date_filter is also given - upload_date_character=$(printf "%s" "$filter_id" | awk '{print substr($1, 8, 1)}') + upload_date_character=$(printf "%s" "$filter_id" | @awk@ '{print substr($1, 8, 1)}') fi #For each of these, if upload_date_character is unset, the filter_id should be the normal filter @@ -650,7 +650,7 @@ get_sp_filter () { if [ -n "$upload_date_character" ]; then #replaces the 8th character in the filter_id with the appropriate character #the 8th character specifies the upload_date_filter - sp=$(printf "%s" "$filter_id" | sed 's/\(.\{7\}\)./\1'"$upload_date_character"'/') + sp=$(printf "%s" "$filter_id" | @sed@ 's/\(.\{7\}\)./\1'"$upload_date_character"'/') #otherwise set it to the filter_id else sp=$filter_id @@ -660,15 +660,15 @@ get_sp_filter () { get_yt_json () { # scrapes the json embedded in the youtube html page - printf "%s" "$*" | sed -n '/var *ytInitialData/,$p' | tr -d '\n' |\ - sed -E ' s_^.*var ytInitialData ?=__ ; s_;.*__ ;' + printf "%s" "$*" | @sed@ -n '/var *ytInitialData/,$p' | @tr@ -d '\n' |\ + @sed@ -E ' s_^.*var ytInitialData ?=__ ; s_;.*__ ;' } get_yt_html () { link=$1 query=$2 printf "%s" "$( - curl "$link" -s \ + @curl@ "$link" -s \ -G --data-urlencode "search_query=$query" \ -G --data-urlencode "sp=$sp" \ -H 'Authority: www.youtube.com' \ @@ -684,7 +684,7 @@ get_video_data () { # outputs tab and pipe separated fields: title, channel, view count, video length, video upload date, and the video id/url # from the videos_json printf "%s" "$*" |\ - jq -r '.[]| "\(.title)'"$tab_space"'|\(.channel)'"$tab_space"'|\(.views)'"$tab_space"'|\(.duration)'"$tab_space"'|\(.date)'"$tab_space"'|\(.videoID)"' + @jq@ -r '.[]| "\(.title)'"$tab_space"'|\(.channel)'"$tab_space"'|\(.views)'"$tab_space"'|\(.duration)'"$tab_space"'|\(.date)'"$tab_space"'|\(.videoID)"' } scrape_channel () { @@ -694,7 +694,7 @@ scrape_channel () { channel_url=$* # Converting channel title page url to channel video url - if ! printf "%s" "$channel_url" | grep -q '/videos *$'; then + if ! printf "%s" "$channel_url" | @grep@ -q '/videos *$'; then channel_url=${channel_url%/featured}/videos fi @@ -706,8 +706,8 @@ scrape_channel () { fi #gets the channel name from title of page - channel_name=$(printf "%s" "$yt_html" | grep -o '.*' | - sed \ + channel_name=$(printf "%s" "$yt_html" | @grep@ -o '.*' | + @sed@ \ -e 's/ - YouTube//' \ -e 's/<\/\?title>//g' \ -e "s/'/'/g" \ @@ -723,7 +723,7 @@ scrape_channel () { #gets a list of videos videos_json=$(printf "%s" "$yt_json" |\ - jq '[ .contents | ..|.gridVideoRenderer? | + @jq@ '[ .contents | ..|.gridVideoRenderer? | select(. !=null) | { title: .title.runs[0].text, @@ -736,7 +736,7 @@ scrape_channel () { } ]') - videos_json=$(printf "%s" "$videos_json" | jq '.[0:'$sub_link_count']') + videos_json=$(printf "%s" "$videos_json" | @jq@ '.[0:'$sub_link_count']') printf "%s\n" "$videos_json" >> "$tmp_video_json_file" #checks if it's empty in case it was defined in a config function eg: on_get_search [ -z "$videos_data" ] && videos_data=$(get_video_data "$videos_json") @@ -768,11 +768,11 @@ get_trending_url_data () { scrape_pt () { #gets a list of videos pt_json=$( - curl \ + @curl@ \ -s "https://sepiasearch.org/api/v1/search/videos" \ -G --data-urlencode "search=$*") videos_json=$(printf "%s" "$pt_json" |\ - jq '[ .data | .[] | + @jq@ '[ .data | .[] | { title: .name, channel: .channel.displayName, @@ -829,7 +829,7 @@ scrape_yt () { fi #gets a list of videos - videos_json=$(printf "%s" "$yt_json" | jq '[ .contents| + videos_json=$(printf "%s" "$yt_json" | @jq@ '[ .contents| ..|.videoRenderer? | select(. !=null) | { @@ -844,7 +844,7 @@ scrape_yt () { } ]') - playlist_json=$(printf "%s" "$yt_json" | jq '[ .contents| + playlist_json=$(printf "%s" "$yt_json" | @jq@ '[ .contents| ..|.playlistRenderer? | select(. !=null) | { @@ -904,28 +904,28 @@ get_search_query () { #> To select videos from videos_data user_selection () { #remove subscription separators - videos_data_clean=$(printf "%s" "$videos_data" | sed "/.*$tab_space$/d") + videos_data_clean=$(printf "%s" "$videos_data" | @sed@ "/.*$tab_space$/d") #$selected_data is the video the user picked #picks the first n videos if [ "$select_all" -eq 1 ] ; then selected_data=$videos_data_clean elif [ "$auto_select" -eq 1 ] ; then - selected_data=$(printf "%s\n" "$videos_data_clean" | sed "${link_count}"q ) + selected_data=$(printf "%s\n" "$videos_data_clean" | @sed@ "${link_count}"q ) #picks n random videos elif [ "$random_select" -eq 1 ] ; then - selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | head -n${link_count}) + selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | @head@ -n${link_count}) #posix_shuf, pick the first $link_count videos #show thumbnail menu elif [ "$show_thumbnails" -eq 1 ] ; then - dep_ck "ueberzug" "fzf" + dep_ck "@ueberzug@" "@fzf@" export YTFZF_THUMB_DISP_METHOD="$thumb_disp_method" [ "$thumb_disp_method" = "ueberzug" ] && start_ueberzug #thumbnails only work in fzf, use fzf - menu_command="fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \ + menu_command="@fzf@ -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \ --nth=1,2 --expect='$shortcuts' $FZF_DEFAULT_OPTS \ - --layout=reverse --preview \"sh $0 -U {}\" \ + --layout=reverse --preview \"@sh@ $0 -U {}\" \ --preview-window \"$PREVIEW_SIDE:50%:noborder:wrap\"" selected_data=$( title_len=200 video_menu "$videos_data" ) [ "$thumb_disp_method" = "ueberzug" ] && stop_ueberzug @@ -951,10 +951,10 @@ handle_shortcuts () { case $selected_key in "$urls_shortcut") printf "%s\n" $selected_urls; return 1 ;; "$title_shortcut") - printf "%s\n" "$selected_data" | awk -F " " '{print $1}'; return 1 ;; + printf "%s\n" "$selected_data" | @awk@ -F " " '{print $1}'; return 1 ;; "$open_browser_shortcut") for url in $selected_urls; do - nohup $BROWSER "$url" >/dev/null 2>&1 + @nohup@ $BROWSER "$url" >/dev/null 2>&1 done return 1 ;; "$watch_shortcut") is_download=0; is_audio_only=0; return 0;; @@ -988,10 +988,10 @@ format_user_selection () { 11) selected_urls=$selected_urls$new_line'https://www.youtube.com/watch?v='$surl ;; 34) selected_urls=$selected_urls$new_line'https://www.youtube.com/playlist?list='$surl ;; 36) - selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | jq '.[].url' | grep -F "$surl" | tr -d '"')" ;; + selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | @jq@ '.[].url' | @grep@ -F "$surl" | @tr@ -d '"')" ;; *) continue ;; esac - refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | grep "|$surl" ) + refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | @grep@ "|$surl" ) done<<-EOF $selected_data EOF @@ -1014,9 +1014,9 @@ print_data () { get_video_format () { # select format if flag given [ $show_format -eq 0 ] && return - formats=$(youtube-dl -F "$(printf "$selected_urls")") - line_number=$(printf "$formats" | grep -n '.*extension resolution.*' | cut -d: -f1) - quality=$(printf "$formats \n1 2 xAudio" | awk -v lineno=$line_number 'FNR > lineno {print $3}' | sort -n | awk -F"x" '{print $2 "p"}' | uniq | sed -e "s/Audiop/Audio/" -e "/^p$/d" | eval "$menu_command" | sed "s/p//g") + formats=$(@youtube-dl@ -F "$(printf "$selected_urls")") + line_number=$(printf "$formats" | @grep@ -n '.*extension resolution.*' | @cut@ -d: -f1) + quality=$(printf "$formats \n1 2 xAudio" | @awk@ -v lineno=$line_number 'FNR > lineno {print $3}' | @sort@ -n | @awk@ -F"x" '{print $2 "p"}' | @uniq@ | @sed@ -e "s/Audiop/Audio/" -e "/^p$/d" | eval "$menu_command" | @sed@ "s/p//g") [ -z "$quality" ] && exit; [ $quality = "Audio" ] && video_pref= && video_player="$audio_player" || video_pref="bestvideo[height=?$quality][vcodec!=?vp9]+bestaudio/best" @@ -1026,9 +1026,9 @@ get_video_format () { get_sub_lang () { if [ $auto_caption -eq 1 ]; then #Gets the auto generated subs and stores them in a file - sub_list=$(youtube-dl --list-subs --write-auto-sub "$selected_urls" | sed '/Available subtitles/,$d' | awk '{print $1}' | sed '1d;2d;3d') + sub_list=$(@youtube-dl@ --list-subs --write-auto-sub "$selected_urls" | @sed@ '/Available subtitles/,$d' | @awk@ '{print $1}' | @sed@ '1d;2d;3d') if [ -n "$sub_list" ]; then - [ -n "$selected_sub" ] || selected_sub=$(printf "$sub_list" | eval "$menu_command") && youtube-dl --sub-lang $selected_sub --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available." + [ -n "$selected_sub" ] || selected_sub=$(printf "$sub_list" | eval "$menu_command") && @youtube-dl@ --sub-lang $selected_sub --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available." fi unset sub_list fi @@ -1046,10 +1046,10 @@ open_player () { if [ $detach_player -eq 1 ]; then if [ -z "$video_pref" ] || [ $is_audio_only -eq 1 ]; then printf "Opening Player: %s\n" "$video_player $*" - setsid -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1 + @setsid@ -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1 else printf "Opening Player: %s\n" "$video_player_format$video_pref $*" - setsid -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1 + @setsid@ -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1 fi return fi @@ -1064,9 +1064,9 @@ open_player () { fi elif [ $is_download -eq 1 ]; then if [ -z "$video_pref" ]; then - youtube-dl "$@" "$YTFZF_SUBT_NAME" + @youtube-dl@ "$@" "$YTFZF_SUBT_NAME" else - youtube-dl -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@" + @youtube-dl@ -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@" fi fi } @@ -1087,7 +1087,7 @@ play_url () { fi #Delete the temp auto-gen subtitle file - [ $auto_caption -eq 1 ] && rm -f "${YTFZF_SUBT_NAME#*=}" + [ $auto_caption -eq 1 ] && @rm@ -f "${YTFZF_SUBT_NAME#*=}" unset player_urls } @@ -1102,7 +1102,7 @@ session_is_running () { #> removes tmp files and clutter clean_up () { if ! session_is_running ; then - [ -d "$thumb_dir" ] && rm -r "$thumb_dir" + [ -d "$thumb_dir" ] && @rm@ -r "$thumb_dir" : > "$pid_file" function_exists "on_exit" && on_exit fi @@ -1124,9 +1124,9 @@ save_before_exit () { check_if_url () { # to check if given input is a url url_regex='^https\?://.*' - if printf "%s" "$1" | grep -q "$url_regex"; then + if printf "%s" "$1" | @grep@ -q "$url_regex"; then is_url=1 - selected_urls=$(printf "%s" "$1" | tr ' ' '\n') + selected_urls=$(printf "%s" "$1" | @tr@ ' ' '\n') scrape="url" else is_url=0 @@ -1139,10 +1139,10 @@ get_history () { if [ "$enable_hist" -eq 1 ]; then [ -e "$history_file" ] || : > "$history_file" #gets history data in reverse order (makes it most recent to least recent) - hist_data=$( sed '1!G; h; $!d' "$history_file" ) + hist_data=$( @sed@ '1!G; h; $!d' "$history_file" ) [ -z "$hist_data" ] && printf "History is empty!\n" >&2 && return 1; #removes duplicate values from $history_data - videos_data=$(printf "%s" "$hist_data" | uniq ) + videos_data=$(printf "%s" "$hist_data" | @uniq@ ) [ "$sort_videos_data" -eq 1 ] && videos_data="$(printf "%s" "$videos_data" | sort_video_data_fn)" else printf "History is not enabled. Please enable it to use this option (-H).\n" >&2; @@ -1177,10 +1177,10 @@ get_search_history () { if [ "$enable_search_hist" -eq 1 ]; then [ -e "$search_history_file" ] || : > "$search_history_file" #gets history data in reverse order (makes it most recent to least recent) - hist_data=$( sed '1!G; h; $!d' "$search_history_file" ) + hist_data=$( @sed@ '1!G; h; $!d' "$search_history_file" ) [ -z "$hist_data" ] && printf "Search history is empty!\n" >&2 && return 1; #removes duplicate values from $history_data - search_history=$(printf "%s" "$hist_data" | uniq ) + search_history=$(printf "%s" "$hist_data" | @uniq@ ) else printf "Search history is not enabled. Please enable it to use this option (-q).\n" >&2; exit 1; @@ -1190,7 +1190,7 @@ get_search_history () { set_search_history () { [ -z "$search_query" ] && return - [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ; + [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(@date@ '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ; } search_history_menu () { @@ -1200,15 +1200,15 @@ search_history_menu () { #when using an external menu, the search history will be done there choice=$( printf "%s\n" "$search_history" | eval "$external_menu" ) else - choice="$( printf "%s\n" "$search_history" | fzf --prompt="$search_history_prompt" --print-query --no-multi -d '\t' --with-nth=2.. --expect='alt-enter' --bind='tab:replace-query' )" + choice="$( printf "%s\n" "$search_history" | @fzf@ --prompt="$search_history_prompt" --print-query --no-multi -d '\t' --with-nth=2.. --expect='alt-enter' --bind='tab:replace-query' )" fi # first line is the fzf query (what the user types in fzf) # second line is the fzf --expect key pressed # third line is the search_history selection made - query="$( printf "%s" "$choice" | sed -n '1p' )" - key="$( printf "%s" "$choice" | sed -n '2p' )" - selection="$( printf "%s" "$choice" | sed -n '3p' )" + query="$( printf "%s" "$choice" | @sed@ -n '1p' )" + key="$( printf "%s" "$choice" | @sed@ -n '2p' )" + selection="$( printf "%s" "$choice" | @sed@ -n '3p' )" # if no search history selection has been made # and the user typed a query, use that instead @@ -1225,7 +1225,7 @@ search_history_menu () { search_query="$query" return;; esac - search_query="$( printf "%s" "$selection" | awk -F'\t' '{printf "%s", $NF}' )" + search_query="$( printf "%s" "$selection" | @awk@ -F'\t' '{printf "%s", $NF}' )" } ! function_exists "send_select_video_notif" && send_select_video_notif () { @@ -1244,13 +1244,13 @@ search_history_menu () { #if downloading, say Downloading not currently playing [ $is_download -eq 1 ] && title="Downloading" || title="Currently playing" - notify-send "$title" "$message" -i "$video_thumb" + @notify-send@ "$title" "$message" -i "$video_thumb" unset message video_thumb title } send_notify () { - videos_selected_count=$(printf "%s\n" "$*" | wc -l) + videos_selected_count=$(printf "%s\n" "$*" | @wc@ -l) while IFS=$tab_space read -r video_title video_channel video_views video_duration video_date video_shorturl; do send_select_video_notif done << EOF @@ -1284,14 +1284,14 @@ if ! function_exists "data_sort_key"; then sort_by="${5#|}" sort_by="${sort_by#Streamed}" #print the data that should be sorted by - printf "%d" "$(date -d "${sort_by}" '+%s')" + printf "%d" "$(@date@ -d "${sort_by}" '+%s')" unset sort_by } fi #the function to use for sorting if ! function_exists "data_sort_fn"; then data_sort_fn () { - sort -nr + @sort@ -nr } fi sort_video_data_fn () { @@ -1300,7 +1300,7 @@ sort_video_data_fn () { IFS="$tab_space" #run the key function to get the value to sort by printf "%s\t%s\n" "$(data_sort_key $line)" "$line" - done | data_sort_fn | cut -f2- + done | data_sort_fn | @cut@ -f2- unset IFS line } @@ -1314,19 +1314,19 @@ scrape_subscriptions () { while IFS= read -r url; do scrape_channel "$url" & done <<-EOF - $( sed \ + $( @sed@ \ -e "s/#.*//" \ -e "/^[[:space:]]*$/d" \ -e "s/[[:space:]]*//g" \ "$subscriptions_file") EOF wait - videos_json="$(cat "$tmp_video_json_file")" + videos_json="$(@cat@ "$tmp_video_json_file")" export videos_json if [ $sort_videos_data -eq 1 ]; then videos_data=$(sort_video_data_fn < "$tmp_video_data_file") else - videos_data=$(cat "$tmp_video_data_file") + videos_data=$(@cat@ "$tmp_video_data_file") fi } @@ -1346,11 +1346,11 @@ create_subs () { : > "$config_dir/subscriptions" # check how many subscriptions there are in the file - sublength=$( jq '. | length' < "$yt_sub_import_file" ) + sublength=$( @jq@ '. | length' < "$yt_sub_import_file" ) - for i in $(seq $((sublength - 1))); do - channelInfo=$(jq --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file") - printf "%s\n" "$(printf "%s" "$channelInfo" | tr -d '[]"\n,')" >> "$subscriptions_file" + for i in $(@seq@ $((sublength - 1))); do + channelInfo=$(@jq@ --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file") + printf "%s\n" "$(printf "%s" "$channelInfo" | @tr@ -d '[]"\n,')" >> "$subscriptions_file" done exit } @@ -1367,10 +1367,10 @@ verify_thumb_disp_method () { #sort -R is not posix posix_shuf () { - awk -F '\n' ' + @awk@ -F '\n' ' BEGIN {srand()} #set the random seed at the start {print rand() " " $0} #prepend a random number for each line' |\ - sort | sed -E 's/[^ ]* //' + @sort@ | @sed@ -E 's/[^ ]* //' #sort by the random numbers, remove the random number } @@ -1486,8 +1486,8 @@ parse_opt () { exit ;; version) printf "\033[1mytfzf:\033[0m %s\n" "$YTFZF_VERSION" - printf "\033[1myoutube-dl:\033[0m %s\n" "$(youtube-dl --version)" - command -v "fzf" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(fzf --version)" + printf "\033[1myoutube-dl:\033[0m %s\n" "$(@youtube-dl@ --version)" + command -v "@fzf@" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(@fzf@ --version)" exit ;; subt) @@ -1559,19 +1559,19 @@ done shift $((OPTIND-1)) #only apply to ext_menu since they dont have a terminal to print to -[ $is_ext_menu -eq 1 ] && command -v notify-send 1>/dev/null 2>&1 && ext_menu_notifs=1 || ext_menu_notifs=0 +[ $is_ext_menu -eq 1 ] && command -v @notify-send@ 1>/dev/null 2>&1 && ext_menu_notifs=1 || ext_menu_notifs=0 #used for thumbnail previews in ueberzug if [ $is_ext_menu -eq 0 ]; then - export TTY_LINES=$(tput lines) - export TTY_COLS=$(tput cols) + export TTY_LINES=$(@tput@ lines) + export TTY_COLS=$(@tput@ cols) fi #if both are true, it defaults to using fzf, and if fzf isnt installed it will throw an error #so print this error instead and set $show_thumbnails to 0 if [ $is_ext_menu -eq 1 ] && [ $show_thumbnails -eq 1 ]; then [ $ext_menu_notifs -eq 1 ] &&\ - notify-send "warning" "Currently thumbnails do not work in external menus" ||\ + @notify-send@ "warning" "Currently thumbnails do not work in external menus" ||\ printf "\033[33mWARNING: Currently thumbnails do not work in external menus\033[0m\n" >&2 show_thumbnails=0 fi -- 2.32.0