hooks returning exitcode 0 will: * run the next hook, if any * allow the original action, unless successive hook opposes hooks returning exitcode 100 will: * abort running successive hooks * allow the original action hooks returning anything other than 0 or 100 will: * abort running successive hooks * REJECT the original action zmq can now respond with json; a dict with "rc", "rejectmsg", "reloc" and so on, just like other hooks replying with json
standalone programs which are executed by copyparty when an event happens (upload, file rename, delete, ...)
these programs either take zero arguments, or a filepath (the affected file), or a json message with filepath + additional info
run copyparty with --help-hooks for usage details / hook type explanations (xm/xbu/xau/xiu/xbc/xac/xbr/xar/xbd/xad/xban)
in particular, if a hook is loaded into copyparty with the hook-flag c ("check") then its exit-code controls the action that launched the hook:
- exit-code
0= allow the action, and/or continue running the next hook - exit-code
100= allow the action, and stop running any remaining consecutive hooks - anything else = reject/prevent the original action, and don't run the remaining hooks
note: in addition to event hooks (the stuff described here), copyparty has another api to run your programs/scripts while providing way more information such as audio tags / video codecs / etc and optionally daisychaining data between scripts in a processing pipeline; if that's what you want then see mtp plugins instead
after upload
- notify.py shows a desktop notification (example)
- notify2.py uses the json API to show more context
- image-noexif.py removes image exif by overwriting / directly editing the uploaded file
- discord-announce.py announces new uploads on discord using webhooks (example)
- reject-mimetype.py rejects uploads unless the mimetype is acceptable
- into-the-cache-it-goes.py avoids bugs in caching proxies by immediately downloading each file that is uploaded
- podcast-normalizer.py creates a second file with dynamic-range-compression whenever an audio file is uploaded
- good example of the
idxhook effect to tell copyparty about additional files to scan/index
- good example of the
upload batches
these are --xiu hooks; unlike xbu and xau (which get executed on every single file), xiu hooks are given a list of recent uploads on STDIN after the server has gone idle for N seconds, reducing server load + providing more context
- xiu.py is a "minimal" example showing a list of filenames + total filesize
- xiu-sha.py produces a sha512 checksum list in the volume root
before upload
- reject-extension.py rejects uploads if they match a list of file extensions
- reloc-by-ext.py redirects an upload to another destination based on the file extension
- good example of the
relochook effect
- good example of the
- reject-and-explain.py shows a custom error-message when it rejects an upload
- reject-ramdisk.py rejects the upload if the destination is a ramdisk
- this hook uses the
Iflag which makes it 140x faster, but if the plugin has a bug it may crash copyparty
- this hook uses the
on message
- wget.py lets you download files by POSTing URLs to copyparty
- wget-i.py is an import-safe modification of this hook (starts 140x faster, but higher chance of bugs)
- qbittorrent-magnet.py starts downloading a torrent if you post a magnet url
- usb-eject.py adds web-UI buttons to safe-remove usb flashdrives shared through copyparty
- msg-log.py is a guestbook; logs messages to a doc in the same folder
general concept demos
- import-me.py shows how the
Iflag makes the hook 140x faster (but you need to be Very Careful when writing the plugin)