mirror of
https://codeberg.org/hyperreal/admin-scripts
synced 2024-11-25 09:03:41 +01:00
Add list_torrents.py
This commit is contained in:
parent
f5d5c85d8f
commit
313283dae5
66
list_torrents.py
Executable file
66
list_torrents.py
Executable file
@ -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()
|
@ -36,6 +36,7 @@ mkShell {
|
|||||||
python312Packages.requests
|
python312Packages.requests
|
||||||
python312Packages.resend
|
python312Packages.resend
|
||||||
python312Packages.rich
|
python312Packages.rich
|
||||||
|
python312Packages.tabulate
|
||||||
pyright
|
pyright
|
||||||
python-qbittorrent
|
python-qbittorrent
|
||||||
shellcheck
|
shellcheck
|
||||||
|
Loading…
Reference in New Issue
Block a user