var {WebSocketServer} = require("ws"); var qs = require("qs"); var proxyaddr = require("proxy-addr"); var child_process = require("child_process"); var {app, server} = require("./web"); var {getList, uncacheList} = require("./metalist"); var fs = require("fs"); var wss = new WebSocketServer({ server }); wss.on("connection", function(ws, req) { req.ip = proxyaddr(req, app.get("trust proxy")); req.query = qs.parse(req.url.substring(req.url.indexOf('?')+1)); var log = (msg, e) => console[e?'error':'log'](`[${new Date().toLocaleString()}] ${req.ip} - ${msg}`); log("socket open: " + req.url); var url = req.query.url; if (!url) { ws.send(color("red", "missing url")); ws.close(); return } ws.send(color("green", "spawning yt-dlp...")); var cp = child_process.spawn("yt-dlp", ["--no-mtime", url], {cwd: process.env.DOWNLOADS, shell: false}); cp.on("error", error => { log(error.message, true); ws.send(color("red", error.message)); }); cp.stdout.on("data", data => { var msg = data.toString().trim(); if (msg) { log(msg); ws.send("yt-dlp: " + color("blue", msg)); } }); cp.stderr.on("data", data => { var msg = data.toString().trim(); if (msg) { log(msg, true); ws.send(color("orange", "yt-dlp: " + color("blue", msg))); } }); cp.on("close", (code, signal) => { log(`cp exit ${code} (${signal})`); ws.send(color("green", `yt-dlp exited with code ${code}`)); uncacheList(); ws.close(); }); ws.on("close", () => { log("socket closed"); cp.kill(); }); }); function color(color, text) { return `${text}`; }