From 803e156509b7d5e1eb40125134ca6667e766cbc2 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 14 Jul 2024 17:57:36 +0000 Subject: [PATCH] hooks: improve torrent downloader --- bin/hooks/qbittorrent-magnet.py | 53 ++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/bin/hooks/qbittorrent-magnet.py b/bin/hooks/qbittorrent-magnet.py index 6c5d377c..fb5daebe 100755 --- a/bin/hooks/qbittorrent-magnet.py +++ b/bin/hooks/qbittorrent-magnet.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 # coding: utf-8 -from __future__ import print_function, unicode_literals import os import sys import json +import shutil import subprocess as sp @@ -12,6 +12,16 @@ _ = r""" start downloading a torrent by POSTing a magnet URL to copyparty, for example using 📟 (message-to-server-log) in the web-ui +by default it will download the torrent to the folder you were in +when you pasted the magnet into the message-to-server-log field + +you can optionally specify another location by adding a whitespace +after the magnet URL followed by the name of the subfolder to DL into, +or for example "anime/airing" would download to /srv/media/anime/airing +because the keyword "anime" is in the DESTS config below + +needs python3 + example usage as global config (not a good idea): python copyparty-sfx.py --xm f,j,t60,bin/hooks/qbittorrent-magnet.py @@ -45,6 +55,15 @@ while you're in the /qb folder (or any folder below there) ALLOWLIST = [ "ed", "morpheus" ] +# list of destination aliases to translate into full filesystem +# paths; takes effect if the first folder component in the +# custom download location matches anything in this dict +DESTS = { + "iso": "/srv/pub/linux-isos", + "anime": "/srv/media/anime", +} + + def main(): inf = json.loads(sys.argv[1]) url = inf["txt"] @@ -60,14 +79,40 @@ def main(): # which matches the URL that the magnet message was sent to os.chdir(inf["ap"]) + # is there is a custom download location in the url? + dst = "" + if " " in url: + url, dst = url.split(" ", 1) + + # is the location in the predefined list of locations? + parts = dst.replace("\\", "/").split("/") + if parts[0] in DESTS: + dst = os.path.join(DESTS[parts[0]], *(parts[1:])) + + else: + # nope, so download to the current folder instead; + # comment the dst line below to instead use the default + # download location from your qbittorrent settings + dst = inf["ap"] + pass + + # archlinux has a -nox suffix for qbittorrent if headless + # so check if we should be using that + if shutil.which("qbittorrent-nox"): + torrent_bin = "qbittorrent-nox" + else: + torrent_bin = "qbittorrent" + # the command to add a new torrent, adjust if necessary - cmd = ["qbittorrent-nox", url] + cmd = [torrent_bin, url] + if dst: + cmd += ["--save-path=%s" % (dst,)] # if copyparty and qbittorrent are running as different users # you may have to do something like the following - # (assuming qbittorrent-nox* is nopasswd-allowed in sudoers): + # (assuming qbittorrent* is nopasswd-allowed in sudoers): # - # cmd = ["sudo", "-u", "qbitter", "qbittorrent-nox", url] + # cmd = ["sudo", "-u", "qbitter"] + cmd print("🧲", cmd)