change Org Mode indentation

This commit is contained in:
Denis Lehmann 2021-03-15 00:35:17 +01:00
parent 79964ec0dd
commit 3f5211e0b1

View file

@ -1,210 +1,210 @@
* tyt
:PROPERTIES:
:header-args: :tangle tyt :shebang "#!/bin/sh"
:END:
:PROPERTIES:
:header-args: :tangle tyt :shebang "#!/bin/sh"
:END:
Terminal YouTube (*tyt*) is a small bash script that lets you play YouTube videos by query from the command line.
It is created via literate programming, you can find the code below.
Terminal YouTube (*tyt*) is a small bash script that lets you play YouTube videos by query from the command line.
It is created via literate programming, you can find the code below.
** Script
*** Dependencies
The dependencies of the script are:
The dependencies of the script are:
- [[https://stedolan.github.io/jq/][jq]]
- [[https://mpv.io/][mpv]]
- [[https://ytdl-org.github.io/youtube-dl/][youtube-dl]]
- [[https://stedolan.github.io/jq/][jq]]
- [[https://mpv.io/][mpv]]
- [[https://ytdl-org.github.io/youtube-dl/][youtube-dl]]
Please make sure those are available on your system.
If you are using the [[https://nixos.org/][Nix]] package manager, you can run =nix-shell= in the project directory.
This will drop you into a shell with all requirements fulfilled.
Please make sure those are available on your system.
If you are using the [[https://nixos.org/][Nix]] package manager, you can run =nix-shell= in the project directory.
This will drop you into a shell with all requirements fulfilled.
On the start of the script, it is checked if the dependencies are fulfilled.
On the start of the script, it is checked if the dependencies are fulfilled.
#+begin_src sh
if ! command -v mpv &> /dev/null
then
echo -ne "\e[1mmpv\e[0m was not found, please install it"
exit 1
elif ! command -v youtube-dl &> /dev/null
then
echo -ne "\e[1myoutube-dl\e[0m was not found, please install it"
exit 1
fi
#+end_src
#+begin_src sh
if ! command -v mpv &> /dev/null
then
echo -ne "\e[1mmpv\e[0m was not found, please install it"
exit 1
elif ! command -v youtube-dl &> /dev/null
then
echo -ne "\e[1myoutube-dl\e[0m was not found, please install it"
exit 1
fi
#+end_src
*** Usage
This function prints the usage of the script.
This function prints the usage of the script.
#+begin_src sh
function print_usage {
echo "tyt [ (-a* | --alternative) | (-i | --interactive) ] \"QUERY\""
}
#+end_src
#+begin_src sh
function print_usage {
echo "tyt [ (-a* | --alternative) | (-i | --interactive) ] \"QUERY\""
}
#+end_src
*** Arguments
At first we parse the arguments.
We have the following flags:
At first we parse the arguments.
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
- =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.
Additionally we have exacly one mandatory quoted string as query.
#+begin_src sh
alternative=0
format="flac"
interactive=false
help=false
#+begin_src sh
alternative=0
format="flac"
interactive=false
help=false
for arg in "$@"
do
case $arg in
-a*)
alternative="${arg:1}"
alternative="${#alternative}"
shift
;;
--alternative)
alternative=1
shift
;;
-i|--interactive)
interactive=true
shift
;;
-h|--help)
help=true
shift
;;
,*)
other_arguments+=("$1")
shift
;;
esac
done
for arg in "$@"
do
case $arg in
-a*)
alternative="${arg:1}"
alternative="${#alternative}"
shift
;;
--alternative)
alternative=1
shift
;;
-i|--interactive)
interactive=true
shift
;;
-h|--help)
help=true
shift
;;
,*)
other_arguments+=("$1")
shift
;;
esac
done
if [ "$help" = true ]
then
print_usage
exit 0
fi
if [ "$help" = true ]
then
print_usage
exit 0
fi
if [ "${#other_arguments[@]}" != "1" ]
then
print_usage
exit 1
fi
if [ "${#other_arguments[@]}" != "1" ]
then
print_usage
exit 1
fi
query="${other_arguments[0]}"
#+end_src
query="${other_arguments[0]}"
#+end_src
*** Greeter
If the arguments match, print a greeter.
If the arguments match, print a greeter.
#+begin_src sh
echo -ne "\n \e[1m\ /\e[0m\n"
echo -ne " \e[1m=======\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
#+begin_src sh
echo -ne "\n \e[1m\ /\e[0m\n"
echo -ne " \e[1m=======\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
*** Get URL
To play a video, we need to get a valid URL.
Since there are sometimes parsing errors of the JSON response, we use an endless loop to try until we get a valid response.
The first /n/ URLs are saved if an alternative download is requested.
To play a video, we need to get a valid URL.
Since there are sometimes parsing errors of the JSON response, we use an endless loop to try until we get a valid response.
The first /n/ URLs are saved if an alternative download is requested.
#+begin_src sh
i=0
#+begin_src sh
i=0
if [ "$interactive" = true ]
then
n=10
else
n=$((alternative+1))
fi
if [ "$interactive" = true ]
then
n=10
else
n=$((alternative+1))
fi
echo -ne "Searching for: \e[34m\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
until results=$(youtube-dl --default-search "ytsearch" -j "ytsearch$n:$query") &> /dev/null
do
case $i in
0)
appendix=" "
;;
1)
appendix=". "
;;
2)
appendix=".. "
;;
,*)
appendix="..."
;;
esac
case $i in
0)
appendix=" "
;;
1)
appendix=". "
;;
2)
appendix=".. "
;;
,*)
appendix="..."
;;
esac
echo -ne "Searching for: \e[34m\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
i=$(((i + 1) % 4))
sleep 1
done
done
echo -ne "Searching for: \e[34m\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 '"')
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'
urls=($urls)
titles=($titles)
uploaders=($uploaders)
IFS=$OLDIFS
#+end_src
OLDIFS=$IFS
IFS=$'\n'
urls=($urls)
titles=($titles)
uploaders=($uploaders)
IFS=$OLDIFS
#+end_src
*** Interactive selection
If the interactive flag is present, show the first ten results and query for a video to play.
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
#+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
Finally the video is played via mpv.
Finally the video is played via mpv.
#+begin_src sh
echo -ne "Playing: \e[32m\e[1m$title\e[0m (\e[33m\e[1m$uploader\e[0m)\n"
mpv $url &> /dev/null
#+end_src
#+begin_src sh
echo -ne "Playing: \e[32m\e[1m$title\e[0m (\e[33m\e[1m$uploader\e[0m)\n"
mpv $url &> /dev/null
#+end_src