mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 00:52:16 -06:00
hooks can now interrupt or redirect actions, and initiate related actions, by printing json on stdout with commands mainly to mitigate limitations such as sharex/sharex#3992 xbr/xau can redirect uploads to other destinations with `reloc` and most hooks can initiate indexing or deletion of additional files by giving a list of vpaths in json-keys `idx` or `del` there are limitations; * xbu/xau effects don't apply to ftp, tftp, smb * xau will intentionally fail if a reloc destination exists * xau effects do not apply to up2k also provides more details for hooks: * xbu/xau: basic-uploader vpath with filename * xbr/xar: add client ip
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
|
|
_ = r"""
|
|
relocate/redirect incoming uploads according to file extension
|
|
|
|
example usage as global config:
|
|
--xbu j,c1,bin/hooks/reloc-by-ext.py
|
|
|
|
parameters explained,
|
|
xbu = execute before upload
|
|
j = this hook needs upload information as json (not just the filename)
|
|
c1 = this hook returns json on stdout, so tell copyparty to read that
|
|
|
|
example usage as a volflag (per-volume config):
|
|
-v srv/inc:inc:r:rw,ed:c,xbu=j,c1,bin/hooks/reloc-by-ext.py
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
(share filesystem-path srv/inc as volume /inc,
|
|
readable by everyone, read-write for user 'ed',
|
|
running this plugin on all uploads with the params explained above)
|
|
|
|
example usage as a volflag in a copyparty config file:
|
|
[/inc]
|
|
srv/inc
|
|
accs:
|
|
r: *
|
|
rw: ed
|
|
flags:
|
|
xbu: j,c1,bin/hooks/reloc-by-ext.py
|
|
|
|
note: this only works with the basic uploader (sharex and such),
|
|
does not work with up2k / dragdrop into browser
|
|
|
|
note: this could also work as an xau hook (after-upload), but
|
|
because it doesn't need to read the file contents its better
|
|
as xbu (before-upload) since that's safer / less buggy
|
|
"""
|
|
|
|
|
|
PICS = "avif bmp gif heic heif jpeg jpg jxl png psd qoi tga tif tiff webp"
|
|
VIDS = "3gp asf avi flv mkv mov mp4 mpeg mpeg2 mpegts mpg mpg2 nut ogm ogv rm ts vob webm wmv"
|
|
MUSIC = "aac aif aiff alac amr ape dfpwm flac m4a mp3 ogg opus ra tak tta wav wma wv"
|
|
|
|
|
|
def main():
|
|
inf = json.loads(sys.argv[1])
|
|
vdir, fn = os.path.split(inf["vp"])
|
|
|
|
try:
|
|
fn, ext = fn.rsplit(".", 1)
|
|
except:
|
|
# no file extension; abort
|
|
return
|
|
|
|
ext = ext.lower()
|
|
|
|
##
|
|
## some example actions to take; pick one by
|
|
## selecting it inside the print at the end:
|
|
##
|
|
|
|
# create a subfolder named after the filetype and move it into there
|
|
into_subfolder = {"vp": ext}
|
|
|
|
# move it into a toplevel folder named after the filetype
|
|
into_toplevel = {"vp": "/" + ext}
|
|
|
|
# move it into a filetype-named folder next to the target folder
|
|
into_sibling = {"vp": "../" + ext}
|
|
|
|
# move images into "/just/pics", vids into "/just/vids",
|
|
# music into "/just/tunes", and anything else as-is
|
|
if ext in PICS.split():
|
|
by_category = {"vp": "/just/pics"}
|
|
elif ext in VIDS.split():
|
|
by_category = {"vp": "/just/vids"}
|
|
elif ext in MUSIC.split():
|
|
by_category = {"vp": "/just/tunes"}
|
|
else:
|
|
by_category = {}
|
|
|
|
# now choose the effect to apply; can be any of these:
|
|
# into_subfolder into_toplevel into_sibling by_category
|
|
effect = into_subfolder
|
|
print(json.dumps({"reloc": effect}))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|