80 lines
2.6 KiB
JavaScript
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();
|
|
})() |