From 2d5f7e352bbf69212cce7f3903bf3ad9d42b27c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Serio <23226432+hyperreal64@users.noreply.github.com> Date: Tue, 23 Jul 2024 20:00:59 -0500 Subject: [PATCH] Refactor --- bin/qbth | 291 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 238 insertions(+), 53 deletions(-) diff --git a/bin/qbth b/bin/qbth index f3beb09..7823d7f 100755 --- a/bin/qbth +++ b/bin/qbth @@ -29,12 +29,27 @@ qb.login(username=args["USERNAME"], password=args["PASSWORD"]) def add_torrents(urls: list[str]): + """ + Add torrents from their URLs. + + Params: + urls: list of strings that are URLs. + """ for url in urls: qb.download_from_link(url, category="distro") print(f"Added {os.path.basename(url)}") def add_torrents_from_html(webpage_url: str, torrent_substring: str): + """ + Add torrents from an HTML web page. + + Params: + webpage_url: a string that is the URL for the desired webpage. + torrent_substring: a string that is a substring of the URLs in + the webpage that you want to extract. It serves as a + selector. + """ reqs = requests.get(webpage_url, timeout=60) soup = BeautifulSoup(reqs.text, "html.parser") for link in soup.find_all("a"): @@ -45,6 +60,15 @@ def add_torrents_from_html(webpage_url: str, torrent_substring: str): def remove_torrents(distro_substring: str): + """ + Remove torrents by selecting a substring that corresponds to the + distro's torrent file name. When the substring is found, the + torrent is removed by passing the corresponding hash to the method. + + Params: + distro_substring: a string that is a substring of the distro + torrent's file name. + """ torrents = qb.torrents() for torrent in torrents: if distro_substring in torrent["name"]: @@ -52,66 +76,122 @@ def remove_torrents(distro_substring: str): print(f"Removed {torrent['name']}") -def add_almalinux(relver: str): +def add_almalinux(rel_ver: str): + """ + Add AlmaLinux torrents from a list of URLs. These URLs are partially + hardcoded for convenience and aren't expected to change frequently. + + Params: + relver: the AlmaLinux release version. + """ urls = [ - f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/aarch64/AlmaLinux-{relver}-aarch64.torrent", - f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/ppc64le/AlmaLinux-{relver}-ppc64le.torrent", - f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/s390x/AlmaLinux-{relver}-s390x.torrent", - f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/x86_64/AlmaLinux-{relver}-x86_64.torrent", + f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/aarch64/AlmaLinux-{rel_ver}-aarch64.torrent", + f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/ppc64le/AlmaLinux-{rel_ver}-ppc64le.torrent", + f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/s390x/AlmaLinux-{rel_ver}-s390x.torrent", + f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/x86_64/AlmaLinux-{rel_ver}-x86_64.torrent", ] add_torrents(urls) -def remove_almalinux(relver: str): - remove_torrents(f"AlmaLinux-{relver}") +def remove_almalinux(rel_ver: str): + """ + Remove AlmaLinux torrents given their release version. + + Params: + relver: the AlmaLinux release version. + """ + remove_torrents(f"AlmaLinux-{rel_ver}") -def add_debian(relver: str): +def add_debian(rel_ver: str): + """ + Add Debian torrents from a list of URLs. + + Params: + relver: the Debian release version. + """ urls = [ - f"https://cdimage.debian.org/debian-cd/current/amd64/bt-dvd/debian-{relver}-amd64-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/arm64/bt-dvd/debian-{relver}-arm64-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/armel/bt-dvd/debian-{relver}-armel-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/armhf/bt-dvd/debian-{relver}-armhf-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/mips64el/bt-dvd/debian-{relver}-mips64el-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/mipsel/bt-dvd/debian-{relver}-mipsel-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/ppc64el/bt-dvd/debian-{relver}-ppc64el-DVD-1.iso.torrent", - f"https://cdimage.debian.org/debian-cd/current/s390x/bt-dvd/debian-{relver}-s390x-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/amd64/bt-dvd/debian-{rel_ver}-amd64-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/arm64/bt-dvd/debian-{rel_ver}-arm64-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/armel/bt-dvd/debian-{rel_ver}-armel-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/armhf/bt-dvd/debian-{rel_ver}-armhf-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/mips64el/bt-dvd/debian-{rel_ver}-mips64el-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/mipsel/bt-dvd/debian-{rel_ver}-mipsel-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/ppc64el/bt-dvd/debian-{rel_ver}-ppc64el-DVD-1.iso.torrent", + f"https://cdimage.debian.org/debian-cd/current/s390x/bt-dvd/debian-{rel_ver}-s390x-DVD-1.iso.torrent", ] add_torrents(urls) -def remove_debian(relver: str): - remove_torrents(f"debian-{relver}") +def remove_debian(rel_ver: str): + """ + Remove Debian torrents given their release version. + + Params: + relver: the Debian release version. + """ + remove_torrents(f"debian-{rel_ver}") -def add_devuan(relver: str): - url = f"https://files.devuan.org/devuan_{relver}.torrent" +def add_devuan(rel_ver: str): + """ + Add Devuan torrents from a URL. + + Params: + relver: the Devuan release version. + """ + url = f"https://files.devuan.org/devuan_{rel_ver}.torrent" qb.download_from_link(url, category="distro") print(f"Added {os.path.basename(url)}") -def remove_devuan(relver: str): - remove_torrents(f"devuan_{relver}") +def remove_devuan(rel_ver: str): + """ + Remove Devuan torrents given their release version. + + Params: + relver: the Devuan release version. + """ + remove_torrents(f"devuan_{rel_ver}") -def add_fedora(relver: str): +def add_fedora(rel_ver: str): + """ + Add Fedora torrents from URLs extracted from a webpage. + + Params: + relver: the Fedora release version. + """ webpage_url = "https://torrent.fedoraproject.org/torrents" - torrent_substring = f"{relver}.torrent" + torrent_substring = f"{rel_ver}.torrent" add_torrents_from_html(webpage_url, torrent_substring) -def remove_fedora(relver: str): +def remove_fedora(rel_ver: str): + """ + Remove Fedora torrents given their release version. + + Params: + relver: the Fedora release version. + """ torrents = qb.torrents() for torrent in torrents: - if torrent["name"].startswith("Fedora") and torrent["name"].endswith(relver): + if torrent["name"].startswith("Fedora") and torrent["name"].endswith(rel_ver): qb.delete_permanently(torrent["hash"]) print(f"Removed {torrent['name']}") -def add_freebsd(relver: str): - url = f"https://people.freebsd.org/~jmg/FreeBSD-{relver}-R-magnet.txt" +def add_freebsd(rel_ver: str): + """ + Add FreeBSD torrents via a text file on the web that contains their + magnet links. + + Params: + relver: the FreeBSD release version. + """ + url = f"https://people.freebsd.org/~jmg/FreeBSD-{rel_ver}-R-magnet.txt" reqs = requests.get(url, timeout=60) data = reqs.text.split("\n") @@ -121,31 +201,69 @@ def add_freebsd(relver: str): print(f"Added {line.split('=')[2]}") -def remove_freebsd(relver: str): - remove_torrents(f"FreeBSD-{relver}") +def remove_freebsd(rel_ver: str): + """ + Remove FreeBSD torrents given their release version. + + Params: + relver: the FreeBSD release version. + """ + remove_torrents(f"FreeBSD-{rel_ver}") def add_kali(): + """ + Add Kali Linux torrents from their URLs extracted from a webpage. + This method does not accept any parameters. The latest Kali Linux + version is automatically selected. + + Params: none + """ webpage_url = "https://kali.download/base-images/current" torrent_substring = ".torrent" add_torrents_from_html(webpage_url, torrent_substring) def remove_kali(): - remove_torrents(f"kali-linux") + """ + Remove Kali Linux torrents. This method does not accept any parameters. + All Kali Linux torrents in the qBittorrent instance will be removed. + + Params: none + """ + remove_torrents("kali-linux") -def add_netbsd(relver: str): - webpage_url = f"https://cdn.netbsd.org/pub/NetBSD/NetBSD-{relver}/images/" - torrent_substring = f".torrent" +def add_netbsd(rel_ver: str): + """ + Add NetBSD torrents from their URLs extracted from a webpage. + + Params: + relver: the NetBSD release version. + """ + webpage_url = f"https://cdn.netbsd.org/pub/NetBSD/NetBSD-{rel_ver}/images/" + torrent_substring = ".torrent" add_torrents_from_html(webpage_url, torrent_substring) -def remove_netbsd(relver: str): - remove_torrents(f"NetBSD-{relver}") +def remove_netbsd(rel_ver: str): + """ + Remove NetBSD torrents given their release version. + + Params: + relver: the NetBSD release version. + """ + remove_torrents(f"NetBSD-{rel_ver}") def add_nixos(): + """ + Add NixOS torrents from their GitHub release at + https://github.com/AninMouse/NixOS-ISO-Torrents. This method does not + accept any paramters. The latest NixOS torrent is automatically selected. + + Params: none + """ url = "https://api.github.com/repos/AnimMouse/NixOS-ISO-Torrents/releases/latest" reqs = requests.get(url, timeout=60) json_data = json.loads(reqs.text) @@ -155,48 +273,92 @@ def add_nixos(): def remove_nixos(): + """ + Remove NixOS torrents. This method does not accept any parameters. All + NixOS torrents in the qBittorrent instance will be removed. + + Params: none + """ remove_torrents("nixos") -def add_qubes(relver: str): - url = f"https://mirrors.edge.kernel.org/qubes/iso/Qubes-R{relver}-x86_64.torrent" +def add_qubes(rel_ver: str): + """ + Add QubesOS torrents from their URLs. + + Params: + relver: the QubesOS release version. + """ + url = f"https://mirrors.edge.kernel.org/qubes/iso/Qubes-R{rel_ver}-x86_64.torrent" qb.download_from_link(url, category="distro") print(f"Added {os.path.basename(url)}") -def remove_qubes(relver: str): - remove_torrents(f"Qubes-R{relver}") +def remove_qubes(rel_ver: str): + """ + Remove QubesOS torrents given their release version. + + Params: + relver: the Qubes OS release version. + """ + remove_torrents(f"Qubes-R{rel_ver}") -def add_rockylinux(relver: str): +def add_rockylinux(rel_ver: str): + """ + Add Rocky Linux torrents from their URLs. + + Params: + relver: the Rocky Linux release version. + """ urls = [ - f"https://download.rockylinux.org/pub/rocky/{relver}/isos/aarch64/Rocky-{relver}-aarch64-dvd.torrent", - f"https://download.rockylinux.org/pub/rocky/{relver}/isos/ppc64le/Rocky-{relver}-ppc64le-dvd.torrent", - f"https://download.rockylinux.org/pub/rocky/{relver}/isos/s390x/Rocky-{relver}-s390x-dvd.torrent", - f"https://download.rockylinux.org/pub/rocky/{relver}/isos/x86_64/Rocky-{relver}-x86_64-dvd.torrent", + f"https://download.rockylinux.org/pub/rocky/{rel_ver}/isos/aarch64/Rocky-{rel_ver}-aarch64-dvd.torrent", + f"https://download.rockylinux.org/pub/rocky/{rel_ver}/isos/ppc64le/Rocky-{rel_ver}-ppc64le-dvd.torrent", + f"https://download.rockylinux.org/pub/rocky/{rel_ver}/isos/s390x/Rocky-{rel_ver}-s390x-dvd.torrent", + f"https://download.rockylinux.org/pub/rocky/{rel_ver}/isos/x86_64/Rocky-{rel_ver}-x86_64-dvd.torrent", ] add_torrents(urls) -def remove_rockylinux(relver: str): - remove_torrents(f"Rocky-{relver}") +def remove_rockylinux(rel_ver: str): + """ + Remove Rocky Linux torrents given their release version. + + Params: + relver: the Rocky Linux release version. + """ + remove_torrents(f"Rocky-{rel_ver}") -def add_tails(relver: str): +def add_tails(rel_ver: str): + """ + Add Tails torrents from their URLs. + + Params: + relver: the Tails release version. + """ urls = [ - f"https://tails.net/torrents/files/tails-amd64-{relver}.img.torrent", - f"https://tails.net/torrents/files/tails-amd64-{relver}.iso.torrent", + f"https://tails.net/torrents/files/tails-amd64-{rel_ver}.img.torrent", + f"https://tails.net/torrents/files/tails-amd64-{rel_ver}.iso.torrent", ] add_torrents(urls) -def remove_tails(relver: str): - remove_torrents(f"tails-amd64-{relver}") +def remove_tails(rel_ver: str): + """ + Remove Tails torrents given their release version. + + Params: + relver: the Tails release version. + """ + remove_torrents(f"tails-amd64-{rel_ver}") if __name__ == "__main__": + # Run the gum program in a subprocess to allow easy selecting of distro + # torrents. distro_selection = subprocess.run( [ "gum", @@ -218,20 +380,36 @@ if __name__ == "__main__": ], stdout=subprocess.PIPE, text=True, + check=True, ).stdout.strip() + # After the distro is selected and stored in the distro_selection variable, + # choose an action to take on the selected distro. + # Add: add the distro torrents to qBittorrent + # Remove: remove the distro torrents from qBittorrent action_selection = subprocess.run( ["gum", "choose", "--limit=1", "--header='Choose:'", "Add", "Remove"], stdout=subprocess.PIPE, text=True, + check=True, ).stdout.strip() + # After the distro is selected and stored in the distro_selection variable, + # and after the action is selected and store in the action_selection + # variable, enter the release version of the selected distro to execute the + # selected action on. relver = subprocess.run( - ["gum", "input", f"--placeholder='Enter {distro_selection} release version'"], + [ + "gum", + "input", + f"--placeholder='Enter {distro_selection} release version'", + ], stdout=subprocess.PIPE, text=True, + check=True, ).stdout.strip() + # Match the distro_selection to execute the action_selection on. match distro_selection: case "AlmaLinux": if action_selection == "Add": @@ -312,3 +490,10 @@ if __name__ == "__main__": case _: print("Nothing to do.") + + torrent_hashes = [] + for torrent in qb.torrents(): + if torrent["category"] == "distro": + torrent_hashes.append(torrent["hash"]) + + qb.set_max_priority(torrent_hashes)