ytdl-server/wss.js

58 lines
1.6 KiB
JavaScript

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 `<span style="color: ${color}">${text}</span>`;
}