#!/usr/bin/env bash # qbth - qbittorrent helper # Dependency check missing_deps=() for bin in "gum" "jq" "lynx" "parallel" "qbt"; do if ! test -x "$(command -v $bin)"; then missing_deps+=("$bin") fi done if (( "${#missing_deps[@]}" != 0 )); then echo "Missing dependencies:" "${missing_deps[@]}" exit 1 fi # Add torrent function add_torrents() { torrents=("$@") if ! parallel qbt torrent add url ::: "${torrents[@]}"; then gum log -l error "Error adding torrents" exit 1 fi for url in "${torrents[@]}"; do gum log -l info "Added" "$(basename "$url")"; done } function delete_torrents() { if test -n "$1"; then echo "$1" | parallel "qbt torrent delete --with-files {}" echo "$1" | xargs -I _ gum log -l info "Deleted" _ else gum log -l warn "Nothing to do." fi } export -f add_torrents export -f delete_torrents distro_selection=$(gum choose --limit=1 --header="Available torrents" --height=13 "AlmaLinux" "Debian" "Devuan" "Fedora" "FreeBSD" "Kali Linux" "NetBSD" "NixOS" "Qubes" "Rocky Linux" "Tails") action=$(gum choose --limit=1 --header="Choose an action: Add, Delete" "Add" "Delete") relver=$(gum input --placeholder="Enter $distro_selection release version") case "$distro_selection" in "AlmaLinux") case "$action" in "Add") urls=( "https://almalinux-mirror.dal1.hivelocity.net/${relver}/isos/aarch64/AlmaLinux-${relver}-aarch64.torrent" "https://almalinux-mirror.dal1.hivelocity.net/${relver}/isos/ppc64le/AlmaLinux-${relver}-ppc64le.torrent" "https://almalinux-mirror.dal1.hivelocity.net/${relver}/isos/s390x/AlmaLinux-${relver}-s390x.torrent" "https://almalinux-mirror.dal1.hivelocity.net/${relver}/isos/x86_64/AlmaLinux-${relver}-x86_64.torrent" ) add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F csv | awk -v pat="AlmaLinux-$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hashes" ;; esac ;; "Debian") case "$action" in "Add") urls=( "https://cdimage.debian.org/debian-cd/current/amd64/bt-dvd/debian-${relver}-amd64-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/arm64/bt-dvd/debian-${relver}-arm64-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/armel/bt-dvd/debian-${relver}-armel-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/armhf/bt-dvd/debian-${relver}-armhf-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/mips64el/bt-dvd/debian-${relver}-mips64el-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/mipsel/bt-dvd/debian-${relver}-mipsel-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/ppc64el/bt-dvd/debian-${relver}-ppc64el-DVD-1.iso.torrent" "https://cdimage.debian.org/debian-cd/current/s390x/bt-dvd/debian-${relver}-s390x-DVD-1.iso.torrent" ) add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F csv | awk -v pat="debian-$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hashes" ;; esac ;; "Devuan") case "$action" in "Add") urls=("https://files.devuan.org/devuan_${relver}.torrent") add_torrents "${urls[@]}" ;; "Delete") torrent_hash=$(qbt torrent list -F csv | awk -v pat="devuan_$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hash" ;; esac ;; "Fedora") case "$action" in "Add") mapfile -t urls < <(lynx -dump -listonly=on -nonumbers "https://torrent.fedoraproject.org/" | grep "${relver}.torrent") add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F json | jq '.[] | select(.name | startswith("Fedora") and endswith("$relver")) | .hash' | tr -d '"') delete_torrents "$torrent_hashes" ;; esac ;; "FreeBSD") case "$action" in "Add") mapfile -t urls < <(curl -sSL "https://people.freebsd.org/~jmg/FreeBSD-${relver}-R-magnet.txt" | grep "magnet:") add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F csv | awk -v pat="FreeBSD-$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hashes" ;; esac ;; "Kali Linux") case "$action" in "Add") mapfile -t urls < <(lynx -dump -listonly=on -nonumbers https://kali.download/base-images/current/ | grep ".torrent") add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F json | jq '.[] | select(.name | contains("kali")) | .hash' | tr -d '"') delete_torrents "$torrent_hashes" ;; esac ;; "NetBSD") case "$action" in "Add") mapfile -t urls < <(lynx -dump -listonly=on -nonumbers "https://cdn.netbsd.org/pub/NetBSD/NetBSD-${relver}/images/" | grep ".torrent") add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F csv | awk -v pat="NetBSD-$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hashes" ;; esac ;; "NixOS") case "$action" in "Add") mapfile -t urls < <(curl -sSL https://api.github.com/repos/AnimMouse/NixOS-ISO-Torrents/releases/latest | jq '.assets[].browser_download_url' | tr -d '"') add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F json | jq '.[] | select(.name | contains("nixos")) | .hash' | tr -d '"') delete_torrents "$torrent_hashes" ;; esac ;; "Qubes") case "$action" in "Add") urls=("https://mirrors.edge.kernel.org/qubes/iso/Qubes-R${relver}-x86_64.torrent") add_torrents "${urls[@]}" ;; "Delete") torrent_hash=$(qbt torrent list -F csv | awk -v pat="Qubes-R$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hash" ;; esac ;; "Rocky Linux") case "$action" in "Add") urls=( "https://download.rockylinux.org/pub/rocky/${relver}/isos/aarch64/Rocky-${relver}-aarch64-dvd.torrent" "https://download.rockylinux.org/pub/rocky/${relver}/isos/ppc64le/Rocky-${relver}-ppc64le-dvd.torrent" "https://download.rockylinux.org/pub/rocky/${relver}/isos/s390x/Rocky-${relver}-s390x-dvd.torrent" "https://download.rockylinux.org/pub/rocky/${relver}/isos/x86_64/Rocky-${relver}-x86_64-dvd.torrent" ) add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F csv | awk -v pat="Rocky-$relver" -F, '$0~pat{print $1}') delete_torrents "$torrent_hashes" ;; esac ;; "Tails") case "$action" in "Add") urls=( "https://tails.net/torrents/files/tails-amd64-${relver}.img.torrent" "https://tails.net/torrents/files/tails-amd64-${relver}.iso.torrent" ) add_torrents "${urls[@]}" ;; "Delete") torrent_hashes=$(qbt torrent list -F json | jq '.[] | select(.name | contains("tails")) | .hash' | tr -d '"') delete_torrents "$torrent_hashes" ;; esac ;; esac