From bd3b3863ae995c1784e1380cd155c64dedd0fbab Mon Sep 17 00:00:00 2001 From: ed Date: Sat, 13 Jul 2024 01:37:17 +0200 Subject: [PATCH] hooks: add bittorrent downloader --- bin/hooks/README.md | 2 + bin/hooks/qbittorrent-magnet.py | 82 +++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100755 bin/hooks/qbittorrent-magnet.py diff --git a/bin/hooks/README.md b/bin/hooks/README.md index ead331ae..9af3bca6 100644 --- a/bin/hooks/README.md +++ b/bin/hooks/README.md @@ -27,3 +27,5 @@ these are `--xiu` hooks; unlike `xbu` and `xau` (which get executed on every sin # on message * [wget.py](wget.py) lets you download files by POSTing URLs to copyparty +* [qbittorrent-magnet.py](qbittorrent-magnet.py) starts downloading a torrent if you post a magnet url +* [msg-log.py](msg-log.py) is a guestbook; logs messages to a doc in the same folder diff --git a/bin/hooks/qbittorrent-magnet.py b/bin/hooks/qbittorrent-magnet.py new file mode 100755 index 00000000..6c5d377c --- /dev/null +++ b/bin/hooks/qbittorrent-magnet.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# coding: utf-8 +from __future__ import print_function, unicode_literals + +import os +import sys +import json +import subprocess as sp + + +_ = r""" +start downloading a torrent by POSTing a magnet URL to copyparty, +for example using 📟 (message-to-server-log) in the web-ui + +example usage as global config (not a good idea): + python copyparty-sfx.py --xm f,j,t60,bin/hooks/qbittorrent-magnet.py + +parameters explained, + xm = execute on message (📟) + f = fork; don't delay other hooks while this is running + j = provide message information as json (not just the text) + t60 = abort if qbittorrent has to think about it for more than 1 min + +example usage as a volflag (per-volume config, much better): + -v srv/qb:qb:A,ed:c,xm=f,j,t60,bin/hooks/qbittorrent-magnet.py + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + (share filesystem-path srv/qb as volume /qb with Admin for user 'ed', + running this plugin on all messages with the params explained above) + +example usage as a volflag in a copyparty config file: + [/qb] + srv/qb + accs: + A: ed + flags: + xm: f,j,t60,bin/hooks/qbittorrent-magnet.py + +the volflag examples only kicks in if you send the torrent magnet +while you're in the /qb folder (or any folder below there) +""" + + +# list of usernames to allow +ALLOWLIST = [ "ed", "morpheus" ] + + +def main(): + inf = json.loads(sys.argv[1]) + url = inf["txt"] + if not url.lower().startswith("magnet:?"): + # not a magnet, abort + return + + if inf["user"] not in ALLOWLIST: + print("🧲 denied for user", inf["user"]) + return + + # might as well run the command inside the filesystem folder + # which matches the URL that the magnet message was sent to + os.chdir(inf["ap"]) + + # the command to add a new torrent, adjust if necessary + cmd = ["qbittorrent-nox", url] + + # 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): + # + # cmd = ["sudo", "-u", "qbitter", "qbittorrent-nox", url] + + print("🧲", cmd) + + try: + sp.check_call(cmd) + except: + print("🧲 FAILED TO ADD", url) + + +if __name__ == "__main__": + main() +