#!/bin/sh # dir where files are cached cache_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/pirowatch" # dir where torrent files are stored torrent_dir="${DOWNLOADS:-$HOME/Downloads}" torrent_port=49110 dht_port=49130 menu="wmenu" note() { # usage: note "message" : "${1:?}" command -v "notify-send" 1>/dev/null && notify-send " pirowatch" "$1" } die() { # usage: die "reason" [exit_status] : "${1:?}" note "$1" printf "\033[31;1merr: %b\033[0m\n" "$1" exit "${2:-1}" } dep_check() { # usage: dep_check "dep_1" ... : "${1:?}" for dep; do command -v "$dep" 1>/dev/null || die "$dep not found, please install it" 127 done unset dep } stream() { # usage: stream "torrent" : "${1:?}" dep_check "webtorrent" "mpv" command -v "notify-send" 1>/dev/null && note "connecting to peers, wait for few seconds" if [ -n "$2" ] then webtorrent --mpv -o "$cache_dir" --torrent-port "$torrent_port" --dht-port "$dht_port" "$1" --select "$2" else webtorrent --mpv -o "$cache_dir" --torrent-port "$torrent_port" --dht-port "$dht_port" "$1" fi || die "webtorrent failed to play" } set_index() { # usage: get_index "torrent" : "${1:?}" dep_check "webtorrent" "$menu" fetch=$(webtorrent -o "$cache_dir" --torrent-port "$torrent_port" --dht-port "$dht_port" "$1" --select | grep -Ei "\.(mkv|mp4|webm|avi|mov|flv|flac|opus|ogg|mp3|wav) (.*)$") if [ "$(echo "$fetch" | wc -l)" -gt 1 ] then fetch="$(printf "%s" "$fetch" | "$menu" -p "󰎁 " -l 25)" || die "empty selection" 66 fi index="${fetch%%[[:space:]]*}" unset fetch } main() { torrent= index="tobeset" if [ "$1" = "-s" ] then index= shift fi [ -z "$WAYLAND_DISPLAY" ] && menu="dmenu" dep_check "$menu" torrent="${1:-$torrent_dir/$(find "$torrent_dir" -type f -name "*.torrent" | sed 's/.*\///g' | "$menu" -p " " -l 25)}" [ -z "${torrent##"${torrent_dir}"/}" ] && die "magnet or torrent file not entered" 66 [ -d "$cache_dir" ] || mkdir -p "$cache_dir" [ "$index" = "tobeset" ] && set_index "$torrent" stream "$torrent" "$index" } main "$@"