# /// script # dependencies = [ # "qbittorrent-api", # "requests", # "bs4", # "docopt" # ] # /// """seed_armbian_torrents.py Description: 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. Usage: seed_armbian_torrents.py (HOSTNAME) (USERNAME) (PASSWORD) seed_armbian_torrents.py -h Examples: seed_armbian_torrents.py "http://localhost:8080" "admin" "adminadmin" seed_armbian_torrents.py "https://cat.seedhost.eu/lol/qbittorrent" "lol" "pw" Options: -h, --help show this help message and exit. """ import os import qbittorrentapi import requests from bs4 import BeautifulSoup from docopt import docopt def add_torrents(args: dict): url = "https://mirrors.jevincanders.net/armbian/dl/" response = requests.get(url, timeout=60) soup = BeautifulSoup(response.content, "html.parser") links = soup.find_all("a") archive_dir_urls = [] for link in links: if ( link.text.endswith("/") and not link.text.startswith("_") and not link.text == "torrent/" ): archive_dir_urls.append(url + link.text + "archive/") torrent_urls = [] for url in archive_dir_urls: response = requests.get(url, timeout=60) soup = BeautifulSoup(response.content, "html.parser") links = soup.find_all("a") for link in links: if link.text.endswith(".torrent"): torrent_urls.append(url + link.text) try: qbt_client = qbittorrentapi.Client( host=args["HOSTNAME"], username=args["USERNAME"], password=args["PASSWORD"] ) qbt_client.auth_log_in() 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: print(e) def remove_torrents(args: dict): try: 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: print(e) if __name__ == "__main__": args = docopt(__doc__) # type: ignore remove_torrents(args) add_torrents(args)