admin-scripts/list_torrents.py
2024-11-08 08:18:39 -06:00

75 lines
2.0 KiB
Python
Executable File

# /// script
# dependencies = [
# "qbittorrent-api",
# "docopt",
# ]
# ///
"""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
"""
import qbittorrentapi
from docopt import docopt
# 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_ssv():
with qbittorrentapi.Client(
host="localhost", port=8080, username="", password=""
) as qbt_client:
try:
qbt_client.auth_log_in()
except qbittorrentapi.LoginFailed as e:
print(e)
sorted_torrents = sorted(
qbt_client.torrents_info(), key=lambda d: d.ratio, reverse=True
)
print("Name Size # of Trackers Ratio Uploaded")
for torrent in sorted_torrents:
name = torrent.name
size = human_bytes(torrent.total_size)
trackers = torrent.trackers_count
ratio = torrent.ratio
uploaded = human_bytes(torrent.uploaded)
print(f"{name} {size} {trackers} {ratio} {uploaded}")
if __name__ == "__main__":
args = docopt(__doc__) # type: ignore
print_ssv()