···
+
#!/usr/bin/env -S uv run --script
+
"""seed_armbian_torrents.py
+
Armbian torrents seed script
+
This script will scrape https://mirrors.jevincanders.net/armbian/dl/ for
+
torrent files and add them to a qBittorrent instance. If there are already
+
Armbian torrents in the qBittorrent instance, they will be removed, and new
+
ones will be added in their place. This script is intended to be run under
+
/etc/cron.weekly or used in a systemd timer.
+
seed_armbian_torrents.py (HOSTNAME) (USERNAME) (PASSWORD)
+
seed_armbian_torrents.py -h
+
seed_armbian_torrents.py "http://localhost:8080" "admin" "adminadmin"
+
seed_armbian_torrents.py "https://cat.seedhost.eu/lol/qbittorrent" "lol" "pw"
+
-h, --help show this help message and exit.
+
from bs4 import BeautifulSoup
+
from docopt import docopt
+
def add_torrents(args: dict):
+
base_url = "https://mirrors.jevincanders.net/armbian/dl"
+
ignore_dirs = ["/armbian/", "_patch/", "_toolchain/"]
+
page = requests.get(base_url).text
+
soup = BeautifulSoup(page, "html.parser")
+
for node in soup.find_all("a"):
+
if node.get("href") is not None:
+
if node.get("href").endswith("/") and node.get("href") not in ignore_dirs:
+
archive_dir_urls.append(f"{base_url}/{node.get("href")}archive/")
+
for url in archive_dir_urls:
+
response = requests.get(url, timeout=60)
+
soup = BeautifulSoup(response.content, "html.parser")
+
links = soup.find_all("a")
+
if link.text.endswith(".torrent"):
+
torrent_urls.append(url + link.text)
+
qbt_client = qbittorrentapi.Client(
+
host=args["HOSTNAME"], username=args["USERNAME"], password=args["PASSWORD"]
+
qbt_client.auth_log_in()
+
for url in torrent_urls:
+
torrent_count = torrent_count + 1
+
print(f"There are {torrent_count} torrents to add. This gonna take a while...")
+
for url in torrent_urls:
+
qbt_client.torrents_add(url, category="distro")
+
print(f"Added {os.path.basename(url)}")
+
qbt_client.auth_log_out()
+
except qbittorrentapi.LoginFailed as e:
+
def remove_torrents(args: dict):
+
qbt_client = qbittorrentapi.Client(
+
host=args["HOSTNAME"], username=args["USERNAME"], password=args["PASSWORD"]
+
qbt_client.auth_log_in()
+
for torrent in qbt_client.torrents_info():
+
if torrent.name.startswith("Armbian"):
+
torrent.delete(delete_files=True)
+
print(f"Removed {torrent.name}")
+
qbt_client.auth_log_out()
+
except qbittorrentapi.LoginFailed as e:
+
if __name__ == "__main__":
+
args = docopt(__doc__) # type: ignore
+
# vim: ts=4 sts=4 sw=4 et ai ft=python