From 7f2f0b36f715a98ad0ef8e532f9a3be6bf0c37ce Mon Sep 17 00:00:00 2001 From: Denis Lehmann Date: Mon, 15 Mar 2021 00:22:35 +0100 Subject: [PATCH] add interactive mode --- README.org | 74 ++++++++++++++++++++++++++++++++++++++++-------------- tyt | 65 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 102 insertions(+), 37 deletions(-) diff --git a/README.org b/README.org index 6b16fa1..a456b39 100644 --- a/README.org +++ b/README.org @@ -39,7 +39,7 @@ #+begin_src sh function print_usage { - echo "tyt [ -a* | --alternative ] \"QUERY\"" + echo "tyt [ (-a* | --alternative) | (-i | --interactive) ] \"QUERY\"" } #+end_src @@ -49,12 +49,14 @@ We have the following flags: - =a*|alternative= :: Alternative video (optional); You can parse any amount of alternatives (e.g. =-aaa=) + - =i|interactive= :: Interactive mode; Shows the first 10 results and queries for a selection; If this flag is set, =-a= is ignored Additionally we have exacly one mandatory quoted string as query. #+begin_src sh alternative=0 format="flac" + interactive=false help=false for arg in "$@" @@ -69,6 +71,10 @@ alternative=1 shift ;; + -i|--interactive) + interactive=true + shift + ;; -h|--help) help=true shift @@ -100,9 +106,9 @@ If the arguments match, print a greeter. #+begin_src sh - echo -ne "\n \e[1m \ /\e[0m\n" + echo -ne "\n \e[1m\ /\e[0m\n" echo -ne " \e[1m=======\e[0m\n" - echo -ne " | \e[31m\e[1mtyt\e[0m |\n" + echo -ne " \e[1m| \e[31mtyt\e[0m \e[1m|\e[0m\n" echo -ne " \e[1m=======\e[0m\n\n" #+end_src @@ -114,9 +120,15 @@ #+begin_src sh i=0 - n=$((alternative+1)) + + if [ "$interactive" = true ] + then + n=10 + else + n=$((alternative+1)) + fi - echo -ne "Searching for: \e[33m\e[1m$query\e[0m \r" + echo -ne "Searching for: \e[34m\e[1m$query\e[0m \r" until results=$(youtube-dl --default-search "ytsearch" -j "ytsearch$n:$query") &> /dev/null do @@ -136,25 +148,56 @@ ;; esac - echo -ne "Searching for: \e[33m\e[1m$query\e[0m $appendix\r" + echo -ne "Searching for: \e[34m\e[1m$query\e[0m $appendix\r" i=$(((i + 1) % 4)) sleep 1 done - echo -ne "Searching for: \e[33m\e[1m$query\e[0m \n" + echo -ne "Searching for: \e[34m\e[1m$query\e[0m \n" urls=$(echo $results | jq '.webpage_url' | tr -d '"') + titles=$(echo $results | jq '.fulltitle' | tr -d '"') + uploaders=$(echo $results | jq '.uploader' | tr -d '"') OLDIFS=$IFS IFS=$'\n' - results=($results) urls=($urls) + titles=($titles) + uploaders=($uploaders) IFS=$OLDIFS - - result=${results[$alternative]} - url=${urls[$alternative]} + #+end_src + +*** Interactive selection + + If the interactive flag is present, show the first ten results and query for a video to play. + + #+begin_src sh + if [ "$interactive" = true ] + then + echo "" + selections=(0 1 2 3 4 5 6 7 8 9) + for i in ${selections[@]} + do + echo -ne " \e[1m$i\e[0m: ${titles[$i]} (\e[33m\e[1m${uploaders[$i]}\e[0m)\n" + done + echo -ne "\nSelection: " + read selection + while [[ ! "${selections[@]}" =~ "${selection}" ]] + do + echo -ne "Not valid, try again: " + read selection + done + echo "" + url=${urls[$selection]} + title=${titles[$selection]} + uploader=${uploaders[$selection]} + else + url=${urls[$alternative]} + title=${titles[$alternative]} + uploader=${uploaders[$alternative]} + fi #+end_src *** Play video @@ -162,13 +205,6 @@ Finally the video is played via mpv. #+begin_src sh - i=0 - - title=$(echo $result | jq '.fulltitle') - title="${title%\"}" - title="${title#\"}" - - echo -ne "Playing: \e[32m\e[1m$title\e[0m" - + echo -ne "Playing: \e[32m\e[1m$title\e[0m (\e[33m\e[1m$uploader\e[0m)\n" mpv $url &> /dev/null #+end_src diff --git a/tyt b/tyt index 953f170..735139a 100755 --- a/tyt +++ b/tyt @@ -10,11 +10,12 @@ then fi function print_usage { - echo "tyt [ -a* | --alternative ] \"QUERY\"" + echo "tyt [ (-a* | --alternative) | (-i | --interactive) ] \"QUERY\"" } alternative=0 format="flac" +interactive=false help=false for arg in "$@" @@ -29,6 +30,10 @@ do alternative=1 shift ;; + -i|--interactive) + interactive=true + shift + ;; -h|--help) help=true shift @@ -54,15 +59,21 @@ fi query="${other_arguments[0]}" -echo -ne "\n \e[1m \ /\e[0m\n" +echo -ne "\n \e[1m\ /\e[0m\n" echo -ne " \e[1m=======\e[0m\n" -echo -ne " | \e[31m\e[1mtyt\e[0m |\n" +echo -ne " \e[1m| \e[31mtyt\e[0m \e[1m|\e[0m\n" echo -ne " \e[1m=======\e[0m\n\n" i=0 -n=$((alternative+1)) -echo -ne "Searching for: \e[33m\e[1m$query\e[0m \r" +if [ "$interactive" = true ] +then + n=10 +else + n=$((alternative+1)) +fi + +echo -ne "Searching for: \e[34m\e[1m$query\e[0m \r" until results=$(youtube-dl --default-search "ytsearch" -j "ytsearch$n:$query") &> /dev/null do @@ -82,32 +93,50 @@ do ;; esac - echo -ne "Searching for: \e[33m\e[1m$query\e[0m $appendix\r" + echo -ne "Searching for: \e[34m\e[1m$query\e[0m $appendix\r" i=$(((i + 1) % 4)) sleep 1 done -echo -ne "Searching for: \e[33m\e[1m$query\e[0m \n" +echo -ne "Searching for: \e[34m\e[1m$query\e[0m \n" urls=$(echo $results | jq '.webpage_url' | tr -d '"') +titles=$(echo $results | jq '.fulltitle' | tr -d '"') +uploaders=$(echo $results | jq '.uploader' | tr -d '"') OLDIFS=$IFS IFS=$'\n' -results=($results) urls=($urls) +titles=($titles) +uploaders=($uploaders) IFS=$OLDIFS -result=${results[$alternative]} -url=${urls[$alternative]} - -i=0 - -title=$(echo $result | jq '.fulltitle') -title="${title%\"}" -title="${title#\"}" - -echo -ne "Playing: \e[32m\e[1m$title\e[0m" +if [ "$interactive" = true ] +then + echo "" + selections=(0 1 2 3 4 5 6 7 8 9) + for i in ${selections[@]} + do + echo -ne " \e[1m$i\e[0m: ${titles[$i]} (\e[33m\e[1m${uploaders[$i]}\e[0m)\n" + done + echo -ne "\nSelection: " + read selection + while [[ ! "${selections[@]}" =~ "${selection}" ]] + do + echo -ne "Not valid, try again: " + read selection + done + echo "" + url=${urls[$selection]} + title=${titles[$selection]} + uploader=${uploaders[$selection]} +else + url=${urls[$alternative]} + title=${titles[$alternative]} + uploader=${uploaders[$alternative]} +fi +echo -ne "Playing: \e[32m\e[1m$title\e[0m (\e[33m\e[1m$uploader\e[0m)\n" mpv $url &> /dev/null