diff --git a/list_torrents.py b/list_torrents.py new file mode 100755 index 0000000..1e9d7f5 --- /dev/null +++ b/list_torrents.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +"""list_torrents.py + +Description: +Fetch a list of torrents from a qBittorrent instance running on localhost. +The qBittorrent instance must be configured to allow login on localhost +without authentication. The output is formatted into a plaintext table. + +Usage: + list_torrents.py + list_torrents.py -h + +Options: + -h, --help show this help message and exit +""" + +from docopt import docopt +from qbittorrent import Client +from tabulate import tabulate + + +# convert byte units +def human_bytes(input_bytes: int) -> str: + B = float(input_bytes) + KiB = float(1024) + MiB = float(KiB**2) + GiB = float(KiB**3) + TiB = float(KiB**4) + + match B: + case B if B < KiB: + return "{0} {1}".format(B, "bytes" if 0 == B > 1 else "byte") + case B if KiB <= B <= MiB: + return "{0:.2f} KiB".format(B / KiB) + case B if MiB <= B <= GiB: + return "{0:.2f} MiB".format(B / MiB) + case B if GiB <= B <= TiB: + return "{0:.2f} GiB".format(B / GiB) + case B if TiB <= B: + return "{0:.2f} TiB".format(B / TiB) + case _: + return "" + + +def print_table(): + qb = Client("http://localhost:8080/") + qb.login() + table = [] + headers = ["Name", "Total Size", "Trackers Count", "Ratio", "Uploaded"] + sorted_torrents = sorted(qb.torrents(), key=lambda d: d["name"]) # type: ignore + for torrent in sorted_torrents: + row = [] + row.append(torrent["name"]) # type: ignore + row.append(human_bytes(int(torrent["total_size"]))) # type: ignore + row.append(torrent["trackers_count"]) # type: ignore + row.append(torrent["ratio"]) # type: ignore + row.append(human_bytes(int(torrent["uploaded"]))) # type: ignore + table.append(row) + + print(tabulate(table, headers, tablefmt="grid")) + + +if __name__ == "__main__": + args = docopt(__doc__) # type: ignore + print_table() diff --git a/shell.nix b/shell.nix index 11032f0..12eed60 100644 --- a/shell.nix +++ b/shell.nix @@ -36,6 +36,7 @@ mkShell { python312Packages.requests python312Packages.resend python312Packages.rich + python312Packages.tabulate pyright python-qbittorrent shellcheck