This commit is contained in:
Jeffrey Serio 2024-07-23 20:00:59 -05:00
parent 6200f777aa
commit 2d5f7e352b

291
bin/qbth
View File

@ -29,12 +29,27 @@ qb.login(username=args["USERNAME"], password=args["PASSWORD"])
def add_torrents(urls: list[str]): def add_torrents(urls: list[str]):
"""
Add torrents from their URLs.
Params:
urls: list of strings that are URLs.
"""
for url in urls: for url in urls:
qb.download_from_link(url, category="distro") qb.download_from_link(url, category="distro")
print(f"Added {os.path.basename(url)}") print(f"Added {os.path.basename(url)}")
def add_torrents_from_html(webpage_url: str, torrent_substring: str): 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) reqs = requests.get(webpage_url, timeout=60)
soup = BeautifulSoup(reqs.text, "html.parser") soup = BeautifulSoup(reqs.text, "html.parser")
for link in soup.find_all("a"): 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): 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() torrents = qb.torrents()
for torrent in torrents: for torrent in torrents:
if distro_substring in torrent["name"]: if distro_substring in torrent["name"]:
@ -52,66 +76,122 @@ def remove_torrents(distro_substring: str):
print(f"Removed {torrent['name']}") 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 = [ urls = [
f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/aarch64/AlmaLinux-{relver}-aarch64.torrent", f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/aarch64/AlmaLinux-{rel_ver}-aarch64.torrent",
f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/ppc64le/AlmaLinux-{relver}-ppc64le.torrent", f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/ppc64le/AlmaLinux-{rel_ver}-ppc64le.torrent",
f"https://almalinux-mirror.dal1.hivelocity.net/{relver}/isos/s390x/AlmaLinux-{relver}-s390x.torrent", f"https://almalinux-mirror.dal1.hivelocity.net/{rel_ver}/isos/s390x/AlmaLinux-{rel_ver}-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/x86_64/AlmaLinux-{rel_ver}-x86_64.torrent",
] ]
add_torrents(urls) add_torrents(urls)
def remove_almalinux(relver: str): def remove_almalinux(rel_ver: str):
remove_torrents(f"AlmaLinux-{relver}") """
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 = [ 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/amd64/bt-dvd/debian-{rel_ver}-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/arm64/bt-dvd/debian-{rel_ver}-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/armel/bt-dvd/debian-{rel_ver}-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/armhf/bt-dvd/debian-{rel_ver}-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/mips64el/bt-dvd/debian-{rel_ver}-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/mipsel/bt-dvd/debian-{rel_ver}-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/ppc64el/bt-dvd/debian-{rel_ver}-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/s390x/bt-dvd/debian-{rel_ver}-s390x-DVD-1.iso.torrent",
] ]
add_torrents(urls) add_torrents(urls)
def remove_debian(relver: str): def remove_debian(rel_ver: str):
remove_torrents(f"debian-{relver}") """
Remove Debian torrents given their release version.
Params:
relver: the Debian release version.
"""
remove_torrents(f"debian-{rel_ver}")
def add_devuan(relver: str): def add_devuan(rel_ver: str):
url = f"https://files.devuan.org/devuan_{relver}.torrent" """
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") qb.download_from_link(url, category="distro")
print(f"Added {os.path.basename(url)}") print(f"Added {os.path.basename(url)}")
def remove_devuan(relver: str): def remove_devuan(rel_ver: str):
remove_torrents(f"devuan_{relver}") """
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" 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) 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() torrents = qb.torrents()
for torrent in 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"]) qb.delete_permanently(torrent["hash"])
print(f"Removed {torrent['name']}") print(f"Removed {torrent['name']}")
def add_freebsd(relver: str): def add_freebsd(rel_ver: str):
url = f"https://people.freebsd.org/~jmg/FreeBSD-{relver}-R-magnet.txt" """
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) reqs = requests.get(url, timeout=60)
data = reqs.text.split("\n") data = reqs.text.split("\n")
@ -121,31 +201,69 @@ def add_freebsd(relver: str):
print(f"Added {line.split('=')[2]}") print(f"Added {line.split('=')[2]}")
def remove_freebsd(relver: str): def remove_freebsd(rel_ver: str):
remove_torrents(f"FreeBSD-{relver}") """
Remove FreeBSD torrents given their release version.
Params:
relver: the FreeBSD release version.
"""
remove_torrents(f"FreeBSD-{rel_ver}")
def add_kali(): 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" webpage_url = "https://kali.download/base-images/current"
torrent_substring = ".torrent" torrent_substring = ".torrent"
add_torrents_from_html(webpage_url, torrent_substring) add_torrents_from_html(webpage_url, torrent_substring)
def remove_kali(): 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): def add_netbsd(rel_ver: str):
webpage_url = f"https://cdn.netbsd.org/pub/NetBSD/NetBSD-{relver}/images/" """
torrent_substring = f".torrent" 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) add_torrents_from_html(webpage_url, torrent_substring)
def remove_netbsd(relver: str): def remove_netbsd(rel_ver: str):
remove_torrents(f"NetBSD-{relver}") """
Remove NetBSD torrents given their release version.
Params:
relver: the NetBSD release version.
"""
remove_torrents(f"NetBSD-{rel_ver}")
def add_nixos(): 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" url = "https://api.github.com/repos/AnimMouse/NixOS-ISO-Torrents/releases/latest"
reqs = requests.get(url, timeout=60) reqs = requests.get(url, timeout=60)
json_data = json.loads(reqs.text) json_data = json.loads(reqs.text)
@ -155,48 +273,92 @@ def add_nixos():
def remove_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") remove_torrents("nixos")
def add_qubes(relver: str): def add_qubes(rel_ver: str):
url = f"https://mirrors.edge.kernel.org/qubes/iso/Qubes-R{relver}-x86_64.torrent" """
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") qb.download_from_link(url, category="distro")
print(f"Added {os.path.basename(url)}") print(f"Added {os.path.basename(url)}")
def remove_qubes(relver: str): def remove_qubes(rel_ver: str):
remove_torrents(f"Qubes-R{relver}") """
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 = [ urls = [
f"https://download.rockylinux.org/pub/rocky/{relver}/isos/aarch64/Rocky-{relver}-aarch64-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/{relver}/isos/ppc64le/Rocky-{relver}-ppc64le-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/{relver}/isos/s390x/Rocky-{relver}-s390x-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/{relver}/isos/x86_64/Rocky-{relver}-x86_64-dvd.torrent", f"https://download.rockylinux.org/pub/rocky/{rel_ver}/isos/x86_64/Rocky-{rel_ver}-x86_64-dvd.torrent",
] ]
add_torrents(urls) add_torrents(urls)
def remove_rockylinux(relver: str): def remove_rockylinux(rel_ver: str):
remove_torrents(f"Rocky-{relver}") """
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 = [ urls = [
f"https://tails.net/torrents/files/tails-amd64-{relver}.img.torrent", f"https://tails.net/torrents/files/tails-amd64-{rel_ver}.img.torrent",
f"https://tails.net/torrents/files/tails-amd64-{relver}.iso.torrent", f"https://tails.net/torrents/files/tails-amd64-{rel_ver}.iso.torrent",
] ]
add_torrents(urls) add_torrents(urls)
def remove_tails(relver: str): def remove_tails(rel_ver: str):
remove_torrents(f"tails-amd64-{relver}") """
Remove Tails torrents given their release version.
Params:
relver: the Tails release version.
"""
remove_torrents(f"tails-amd64-{rel_ver}")
if __name__ == "__main__": if __name__ == "__main__":
# Run the gum program in a subprocess to allow easy selecting of distro
# torrents.
distro_selection = subprocess.run( distro_selection = subprocess.run(
[ [
"gum", "gum",
@ -218,20 +380,36 @@ if __name__ == "__main__":
], ],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
text=True, text=True,
check=True,
).stdout.strip() ).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( action_selection = subprocess.run(
["gum", "choose", "--limit=1", "--header='Choose:'", "Add", "Remove"], ["gum", "choose", "--limit=1", "--header='Choose:'", "Add", "Remove"],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
text=True, text=True,
check=True,
).stdout.strip() ).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( relver = subprocess.run(
["gum", "input", f"--placeholder='Enter {distro_selection} release version'"], [
"gum",
"input",
f"--placeholder='Enter {distro_selection} release version'",
],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
text=True, text=True,
check=True,
).stdout.strip() ).stdout.strip()
# Match the distro_selection to execute the action_selection on.
match distro_selection: match distro_selection:
case "AlmaLinux": case "AlmaLinux":
if action_selection == "Add": if action_selection == "Add":
@ -312,3 +490,10 @@ if __name__ == "__main__":
case _: case _:
print("Nothing to do.") 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)