This repository has been archived on 2023-05-12. You can view files and clone it, but cannot push or open issues or pull requests.
media-host/scripts/remux-unplayable.js
2023-03-16 00:18:07 -04:00

74 lines
2.9 KiB
JavaScript

/*
This is not a server file, but a command to remux files on your server.
Usage (in the root of the folder): node ./scripts/remux-unplayable.js
*/
const config = require("../config.json")
const {MongoClient} = require("mongodb");
const client = new MongoClient(config["db-url"], {useUnifiedTopology: true});
const fs = require("fs");
const {spawn} = require("child_process");
const ffmpegStatic = require("ffmpeg-static");
if (!config["media-folder"].startsWith("/")) {
config["media-folder"] = `${__dirname.split("/scripts")[0]}/${config["media-folder"]}`;
}
if (config?.["remux"]?.["folder"] && !config?.["remux"]?.["folder"].startsWith("/")) config["remux"]["folder"] = `${process.cwd()}/${config?.["remux"]?.["folder"]}`;
(async function() {
console.log("Connecting to DB...");
await client.connect();
console.log("- Connected to DB.");
let db = await client.db("mediahost");
let files = await db.collection("uploads");
let f = await files.find({}).toArray();
let a = [];
if (!fs.existsSync(config?.["remux"]?.["folder"])) fs.mkdirSync(config?.["remux"]?.["folder"]);
for (let c in f) {
if (f[c].mime.startsWith("video/")) {
if (
!f[c].mime.startsWith("video/mp4") &&
!f[c].mime.startsWith("video/webm")
) {
if (f[c].transcodedFile && fs.existsSync(`${config["remux"]["folder"]}/${f[c].id}/${f[c].name}.${config["remux"]["container"]}`)) console.log(`Skipping ${f[c].id} [${f[c].name}] [${f[c].mime}]`)
else {
console.log(`Remuxing ${f[c].id} [${f[c].name}] [${f[c].mime}]`);
await ffmpeg(f[c]);
a.push(f[c].id);
}
}
}
}
console.log(`Remuxed ${a.length} unplayable files from database.`)
process.exit();
})()
async function ffmpeg(file) {
let db = await client.db("mediahost");
let files = await db.collection("uploads");
return new Promise(function(resolve, reject) {
let originalFile = `${config["media-folder"]}/${file.id}/${file.name}`;
let transFile = `${config["remux"]["folder"]}/${file.id}/${file.name}.${config["remux"]["container"]}`; // based file
if (!fs.existsSync(`${config["remux"]["folder"]}/${file.id}`)) fs.mkdirSync(`${config["remux"]["folder"]}/${file.id}`);
let ffmpegProcess = spawn(ffmpegStatic, [`-i`, originalFile, `-vcodec`, config["remux"]["video-codec"], `-acodec`, config["remux"]["audio-codec"], `-preset`, `ultrafast`, transFile]);
ffmpegProcess.stderr.on("data", function(chunk) {
let string = chunk.toString();
console.log(string);
});
ffmpegProcess.on("close", async function(code) {
if (code == 0) {
file.transcodedFile = `/transcoded/${file.id}/${file.name}.${config["remux"]["container"]}`;
await files.findOneAndReplace({id: file.id}, file);
console.log(`- Remuxed ${file.id} [${file.name}]`);
resolve();
} else {
console.log(`ffmpeg failed on ${file.id}`);
reject();
}
});
})
}