mirror of
				https://github.com/9001/copyparty.git
				synced 2025-11-03 21:43:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
"""
 | 
						|
use copyparty as a file downloader by POSTing URLs as
 | 
						|
application/x-www-form-urlencoded (for example using the
 | 
						|
message/pager function on the website)
 | 
						|
 | 
						|
example copyparty config to use this:
 | 
						|
  --urlform save,get -vsrv/wget:wget:rwmd,ed:c,e2ts,mtp=title=ebin,t300,ad,bin/mtag/wget.py
 | 
						|
 | 
						|
explained:
 | 
						|
  for realpath srv/wget (served at /wget) with read-write-modify-delete for ed,
 | 
						|
  enable file analysis on upload (e2ts),
 | 
						|
  use mtp plugin "bin/mtag/wget.py" to provide metadata tag "title",
 | 
						|
  do this on all uploads with the file extension "bin",
 | 
						|
  t300 = 300 seconds timeout for each dwonload,
 | 
						|
  ad = parse file regardless if FFmpeg thinks it is audio or not
 | 
						|
 | 
						|
PS: this requires e2ts to be functional,
 | 
						|
  meaning you need to do at least one of these:
 | 
						|
   * apt install ffmpeg
 | 
						|
   * pip3 install mutagen
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import subprocess as sp
 | 
						|
from urllib.parse import unquote_to_bytes as unquote
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    fp = os.path.abspath(sys.argv[1])
 | 
						|
    fdir = os.path.dirname(fp)
 | 
						|
    fname = os.path.basename(fp)
 | 
						|
    if not fname.startswith("put-") or not fname.endswith(".bin"):
 | 
						|
        raise Exception("not a post file")
 | 
						|
 | 
						|
    buf = b""
 | 
						|
    with open(fp, "rb") as f:
 | 
						|
        while True:
 | 
						|
            b = f.read(4096)
 | 
						|
            buf += b
 | 
						|
            if len(buf) > 4096:
 | 
						|
                raise Exception("too big")
 | 
						|
 | 
						|
            if not b:
 | 
						|
                break
 | 
						|
 | 
						|
    if not buf:
 | 
						|
        raise Exception("file is empty")
 | 
						|
 | 
						|
    buf = unquote(buf.replace(b"+", b" "))
 | 
						|
    url = buf.decode("utf-8")
 | 
						|
 | 
						|
    if not url.startswith("msg="):
 | 
						|
        raise Exception("does not start with msg=")
 | 
						|
 | 
						|
    url = url[4:]
 | 
						|
    if "://" not in url:
 | 
						|
        url = "https://" + url
 | 
						|
 | 
						|
    os.chdir(fdir)
 | 
						|
 | 
						|
    name = url.split("?")[0].split("/")[-1]
 | 
						|
    tfn = "-- DOWNLOADING " + name
 | 
						|
    open(tfn, "wb").close()
 | 
						|
 | 
						|
    cmd = ["wget", "--trust-server-names", "--", url]
 | 
						|
 | 
						|
    try:
 | 
						|
        sp.check_call(cmd)
 | 
						|
 | 
						|
        # OPTIONAL:
 | 
						|
        #   on success, delete the .bin file which contains the URL
 | 
						|
        os.unlink(fp)
 | 
						|
    except:
 | 
						|
        open("-- FAILED TO DONWLOAD " + name, "wb").close()
 | 
						|
 | 
						|
    os.unlink(tfn)
 | 
						|
    print(url)
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |