diff options
author | xengineering <me@xengineering.eu> | 2024-07-28 12:00:00 +0200 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2024-07-28 12:11:31 +0200 |
commit | 3546b422c81edd21d70df47deb250268f610b672 (patch) | |
tree | 8d724537135dbd3836b7909163a9057d63149968 /posix-shell/utils.sh | |
parent | 893d534567b404c6cb21dfba2930dab762449cee (diff) | |
download | dotfiles-3546b422c81edd21d70df47deb250268f610b672.tar dotfiles-3546b422c81edd21d70df47deb250268f610b672.tar.zst dotfiles-3546b422c81edd21d70df47deb250268f610b672.zip |
posix-shell: Add utils.sh
This files can be sourced by shell configs and replaces the scripts
repository [1].
[1]: https://xengineering.eu/git/scripts
Diffstat (limited to 'posix-shell/utils.sh')
-rw-r--r-- | posix-shell/utils.sh | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/posix-shell/utils.sh b/posix-shell/utils.sh new file mode 100644 index 0000000..596263e --- /dev/null +++ b/posix-shell/utils.sh @@ -0,0 +1,218 @@ +#!/bin/sh + +# cdda2flac TARGET_FOLDER +# +# Script to rip the inserted audio compact disc (CD) to a folder of +# FLAC-compressed music files with original quality. +# +# Provide the wanted target folder as command line argument. It will be created +# during execution. +cdda2flac() { + folder="$1" + folder="$(realpath "${folder}")" + echo "Saving to ${folder}" + + mkdir "${folder}" + return_path="$(pwd)" + cd "${folder}" + + cdparanoia -B + + find . -type f -iname '*.wav' -exec flac --delete-input-file {} \; + + cd "${return_path}" + + echo "\nDone! Files are saved to '${folder}'." +} + +# cheat PROGRAM +# +# cheat gets the cheat sheet from https://cheat.sh about the given PROGRAM. +cheat() { + curl "https://cheat.sh/${1}" +} + +# radio STATION_NAME +# +# radio translates the STATION_NAME into a web radio URL via a user-provided +# TSV file and starts to play the station's audio stream with mpv. +radio() { + # constants + data_repo="${HOME}/.local/share/mydata" + data_rel="tables/radio.tsv" + data_abs="${data_repo}/${data_rel}" + + # read station from command line arguments + station="$1" + + # set a handler for keyboard interrupts + trap 'exit 0' 2 15 + + # check dependency and warn user if necessary + if ! command -v mpv > /dev/null 2>&1 + then + echo 'You have to install mpv (e.g. sudo pacman -S mpv mpv-mpris)' + exit 1 + fi + + # check if data file exists + if ! [ -f "${data_abs}" ] + then + echo "Data file '""${data_abs}""' not found." + exit 1 + fi + + # translate sender name to URL + address="$(grep "${station}" "${data_abs}" | awk -F '\t' '{print $2}')" + if [ "${address}" = "" ] + then + echo "Could not translate station ${station} to URL." + exit 1 + fi + + # stream from address + echo "Streaming ${station} from ${address}." + mpv "${address}" +} + +# showdot SOURCE [COMPILATION_ARGS] +# +# showdot displays a GraphViz source file (*.dot) with an image viewer. The +# source code is converted into a temporary image file on the fly. +showdot() { + # process arguments + code=$1 + shift + + file=$(mktemp) + + # compile *.dot code to *.png + if ! dot "$@" -T png -o "${file}" "${code}" + then + echo "Failed to compile with GraphViz." + exit 1 + fi + + # launch image viewer + if ! sxiv "${file}" + then + echo "Failed to display generated image with sxiv." + exit 1 + fi + + rm "${file}" +} + +# tv STATION_NAME +# +# tv translates the STATION_NAME into a tv stream URL via a user-provided TSV +# file and starts to play the station's stream with mpv. +tv() { + # constants + data_repo="${HOME}/.local/share/mydata" + data_rel="tables/tv.tsv" + data_abs="${data_repo}/${data_rel}" + + # read station from command line arguments + station="$1" + + # set a handler for keyboard interrupts + trap 'exit 0' 2 15 + + # check dependency and warn user if necessary + if ! command -v mpv > /dev/null 2>&1 + then + echo 'You have to install mpv (e.g. sudo pacman -S mpv mpv-mpris)' + exit 1 + fi + + # check if data file exists + if ! [ -f "${data_abs}" ] + then + echo "Data file '""${data_abs}""' not found." + exit 1 + fi + + # translate sender name to URL + address="$(grep "${station}" "${data_abs}" | awk -F '\t' '{print $2}')" + if [ "${address}" = "" ] + then + echo "Could not translate station ${station} to URL." + exit 1 + fi + + # stream from address + echo "Streaming ${station} from ${address}." + mpv "${address}" +} + +# url +# +# url opens a menu program with URL names saved in a user-provided TSV file and +# opens the selected URL with a browser. +url() { + # constants + data_repo="${HOME}/.local/share/mydata" + data_rel="tables/urls.tsv" + data_abs="${data_repo}/${data_rel}" + + # check if data file exists + if ! [ -f "${data_abs}" ] + then + echo "Data file '""${data_abs}""' not found." + exit 1 + fi + + # select a menu program or panic + if command -v bemenu > /dev/null 2>&1 + then + menu='bemenu' + elif command -v dmenu > /dev/null 2>&1 + then + menu='dmenu' + elif command -v sxmo_dmenu.sh > /dev/null 2>&1 + then + menu='sxmo_dmenu.sh' + else + echo 'You have to install bemenu, sxmo_dmenu.sh or dmenu!' + exit 1 + fi + + # check firefox dependency and warn user if necessary + if ! command -v firefox > /dev/null 2>&1 + then + echo 'You have to install firefox.' + exit 1 + fi + + # let user select the URL + closer="[close menu]" + options="$(awk -F '\t' '{print $2}' < "${data_abs}" | sed "$ a ${closer}")" + key="$(echo "${options}" | ${menu} -i -l 10)" + + # close if user selected the close entry or stopped menu with ESC + if [ "${key}" = "${closer}" ] || [ "${key}" = "" ] + then + exit 0 + fi + + # search for the selected key in data file + url="" + while read -r line + do + if [ "$(echo "${line}" | awk -F '\t' '{print $2}')" = "${key}" ] + then + if [ "${url}" = "" ] + then + url="$(echo "${line}" | awk -F '\t' '{print $1}')" + else + # warn if multiple URLs have this key + echo "More than one URL in data file matching selected key!" 1>&2 + break + fi + fi + done < "${data_abs}" + + # open selected URL in browser + firefox "${url}" +} |