Initial yt-dlp hook
This commit is contained in:
parent
46c117d59b
commit
ca73445114
100
copyparty/cfg/hooks/ytdlp.py
Normal file
100
copyparty/cfg/hooks/ytdlp.py
Normal file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import subprocess as sp
|
||||
|
||||
"""
|
||||
Experimental YT-DLP hook for copyparty. Based on wget.py hook
|
||||
To-Dos: Youtube videos won't work without cookies, so how do I pass them??
|
||||
|
||||
"""
|
||||
|
||||
_ = r"""
|
||||
use copyparty as a file downloader by POSTing URLs as
|
||||
application/x-www-form-urlencoded (for example using the
|
||||
📟 message-to-server-log in the web-ui)
|
||||
|
||||
example usage as global config:
|
||||
--xm aw,f,j,t3600,bin/hooks/ytdlp.py
|
||||
|
||||
parameters explained,
|
||||
xm = execute on message-to-server-log
|
||||
aw = only users with write-access can use this
|
||||
f = fork; don't delay other hooks while this is running
|
||||
j = provide message information as json (not just the text)
|
||||
c3 = mute all output
|
||||
t3600 = timeout and abort download after 1 hour
|
||||
|
||||
example usage as a volflag (per-volume config):
|
||||
-v srv/inc:inc:r:rw,ed:c,xm=aw,f,j,t3600,bin/hooks/ytdlp.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
(share filesystem-path srv/inc as volume /inc,
|
||||
readable by everyone, read-write for user 'ed',
|
||||
running this plugin on all messages with the params explained above)
|
||||
|
||||
example usage as a volflag in a copyparty config file:
|
||||
[/inc]
|
||||
srv/inc
|
||||
accs:
|
||||
r: *
|
||||
rw: ed
|
||||
flags:
|
||||
xm: aw,f,j,t3600,bin/hooks/ytdlp.py
|
||||
|
||||
the volflag examples only kicks in if you send the message
|
||||
while you're in the /inc folder (or any folder below there)
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
inf = json.loads(sys.argv[1])
|
||||
url = inf["txt"]
|
||||
if "://" not in url:
|
||||
url = "https://" + url
|
||||
|
||||
proto = url.split("://")[0].lower()
|
||||
if proto not in ("http", "https", "ftp", "ftps"):
|
||||
raise Exception("bad proto {}".format(proto))
|
||||
|
||||
os.chdir(inf["ap"])
|
||||
|
||||
name = url.split("?")[0].split("/")[-1]
|
||||
tfn = "-- DOWNLOADING " + name
|
||||
print(f"{tfn}\n", end="")
|
||||
open(tfn, "wb").close()
|
||||
|
||||
cmd = [
|
||||
"yt-dlp",
|
||||
"-f", "bv*+ba/b",
|
||||
"--downloader", "aria2c",
|
||||
"--downloader-args", "-j 16 -x 8 -s 16 -k 1M",
|
||||
url
|
||||
]
|
||||
|
||||
if '.' in (name[-3], name[-4]) and name[-3:] != 'php':
|
||||
cmd += ["-o", name]
|
||||
|
||||
print(" ".join(cmd) + "\n", end="")
|
||||
|
||||
|
||||
try:
|
||||
result = sp.run(cmd, stdout=sp.PIPE, stderr=sp.PIPE, text=True)
|
||||
print("STDOUT:\n" + result.stdout)
|
||||
print("STDERR:\n" + result.stderr)
|
||||
result.check_returncode()
|
||||
|
||||
except sp.CalledProcessError as e:
|
||||
t = "-- FAILED TO DOWNLOAD " + name
|
||||
print(f"{t}\n", end="")
|
||||
open(t, "wb").close()
|
||||
print(f"Error: {e}")
|
||||
print("STDOUT:\n" + e.stdout)
|
||||
print("STDERR:\n" + e.stderr)
|
||||
os.unlink(tfn)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
x
Reference in New Issue
Block a user