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/restore-from-dir.js
2023-05-12 00:19:28 -04:00

80 lines
2.6 KiB
JavaScript

/*
This is not a server file, but a command to restore a broken database from the directory where
files are kept. Not foolproof to get everything back up, but y'know. Better than nothing.
Backup your database for the love of god.
Usage (in the root of the folder): node ./scripts/restore-from-dir.js
*/
const fs = require("fs");
const path = require("path");
const config = require("../config.json");
const mime = require("mime");
const utils = require("../utils.js");
const {MongoClient} = require("mongodb");
const client = new MongoClient(config["db-url"], {useUnifiedTopology: true});
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 brokenFiles = await fs.promises.readdir(config["media-folder"]);
for (let i in brokenFiles) {
console.log("- Restoring", brokenFiles[i]);
let id = brokenFiles[i];
let name = (await fs.promises.readdir(path.join(config["media-folder"], id)))[0];
console.log("-- Got name:", name);
if (name == undefined) {
console.log("- Cannot restore. Path: ", path.join(config["media-folder"],id));
continue;
}
let date = new Date((await fs.promises.stat(path.join(config["media-folder"], id, name))).birthtime).toISOString();
let size = (await fs.promises.stat(path.join(config["media-folder"], id, name))).size;
let humanSize = utils.humanSize(size);
let mimeType = mime.getType(path.join(config["media-folder"], id, name));
let type;
if (mimeType != null) type = utils.getType(mimeType);
else {
type = "generic";
mimeType = "application/octet-stream";
}
let data = {
id,
type,
direct: `/f/${id}/raw`,
name,
privacy: 0,
date,
mime: mimeType,
size,
humanSize,
uploader: "Anonymous"
}
if (config.remux?.folder) {
if (fs.existsSync(path.join(config.remux.folder, id))) {
data.transcodedFile = `/transcoded/${id}/${data.name}.mp4`;
}
}
console.log(`-- Restored ${id}:`, data);
let exists = await files.findOne({id})
if (exists == null) {
console.log(`--- Added to database.`)
files.insertOne(data);
}
}
console.log("All restored.");
process.exit();
})()