fixed issues with thumbnails, also created script to create thumbnails on videos if there werent any

This commit is contained in:
subnub
2024-10-13 23:19:23 -04:00
parent 0ec24235cc
commit b8febb710c
4 changed files with 145 additions and 105 deletions
-21
View File
@@ -265,18 +265,10 @@ class FileController {
readStream.on("error", (e: Error) => {
console.log("read stream error", e);
if (!responseSent) {
responseSent = true;
res.status(500).send("Server error downloading publicfile");
}
});
decipher.on("error", (e: Error) => {
console.log("decipher stream error", e);
if (!responseSent) {
responseSent = true;
res.status(500).send("Server error downloading public file");
}
});
res.set("Content-Type", "binary/octet-stream");
@@ -291,10 +283,6 @@ class FileController {
if (e instanceof Error) {
console.log("\nGet Public Download Error File Route:", e.message);
}
if (!responseSent) {
responseSent = true;
res.status(500).send("Server error downloading public file");
}
}
};
@@ -561,10 +549,6 @@ class FileController {
const handleError = (e: Error) => {
console.log("stream video read stream error", e);
if (!responseSent) {
responseSent = true;
res.status(500).send("Server error streaming video");
}
cleanUp();
};
@@ -603,11 +587,6 @@ class FileController {
if (e instanceof Error) {
console.log("\nStream Video Error File Route:", e.message);
}
if (!responseSent) {
responseSent = true;
res.status(500).send("Server error streaming video");
}
}
};
@@ -18,6 +18,21 @@ import { createGenericParams } from "./storageHelper";
const storageActions =
env.dbType === "s3" ? new S3Actions() : new FilesystemActions();
const attemptToRemoveChunks = async (
file: FileInterface,
thumbnailFilename: string
) => {
try {
const readStreamParams = createGenericParams({
filePath: env.fsDirectory + thumbnailFilename,
Key: thumbnailFilename,
});
await storageActions.removeChunks(readStreamParams);
} catch (e) {
console.log("error removing chunks", e);
}
};
const createVideoThumbnail = (
file: FileInterface,
filename: string,
@@ -38,7 +53,7 @@ const createVideoThumbnail = (
const readStream = storageActions.createReadStream(readStreamParams);
const { writeStream } = storageActions.createWriteStream(
const { writeStream, emitter } = storageActions.createWriteStream(
readStreamParams,
readStream,
thumbnailFilename
@@ -73,8 +88,12 @@ const createVideoThumbnail = (
const decryptedReadStream = readStream.pipe(decipher);
let error = false;
const handleFinish = async () => {
try {
if (error) return;
const thumbnailModel = new Thumbnail({
name: filename,
owner: user._id,
@@ -114,6 +133,12 @@ const createVideoThumbnail = (
}
};
if (emitter) {
emitter.on("finish", async () => {
await handleFinish();
});
}
ffmpeg(decryptedReadStream, {
timeout: 60,
})
@@ -125,11 +150,18 @@ const createVideoThumbnail = (
"-vf scale='if(gt(iw,ih),600,-1):if(gt(ih,iw),300,-1)'",
])
.on("start", (command) => {})
.on("end", async () => {
await handleFinish();
.on("end", async (err) => {
if (!emitter) {
await handleFinish();
}
})
.on("error", async (err, sdf, stderr) => {
console.log("thumbnail error attempting temp directory fix");
error = true;
await attemptToRemoveChunks(file, thumbnailFilename);
if (env.tempDirectory) {
const updatedFile = await tempCreateVideoThumbnailFS(
file,
@@ -36,7 +36,7 @@ const tempCreateVideoThumbnailFS = (
const readStream = storageActions.createReadStream(readStreamParams);
const { writeStream } = storageActions.createWriteStream(
const { writeStream, emitter } = storageActions.createWriteStream(
readStreamParams,
readStream,
thumbnailFilename
@@ -62,6 +62,50 @@ const tempCreateVideoThumbnailFS = (
decryptedReadStream.pipe(tempWriteStream, { end: true });
if (emitter) {
emitter.on("finish", async () => {
await handleFinish();
});
}
const handleFinish = async () => {
const thumbnailModel = new Thumbnail({
name: filename,
owner: user._id,
IV: thumbnailIV,
path: env.fsDirectory + thumbnailFilename,
s3ID: thumbnailFilename,
});
await thumbnailModel.save();
if (!file._id) {
return reject();
}
const updateFileResponse = await File.updateOne(
{ _id: new ObjectId(file._id), "metadata.owner": user._id },
{
$set: {
"metadata.hasThumbnail": true,
"metadata.thumbnailID": thumbnailModel._id,
},
}
);
if (updateFileResponse.modifiedCount === 0) {
return reject();
}
const updatedFile = await File.findById({
_id: new ObjectId(file._id),
"metadata.owner": user._id,
});
if (!updatedFile) return reject();
fs.unlink(tempDirectory, (err) => {
resolve(updatedFile?.toObject());
});
};
tempWriteStream.on("finish", () => {
ffmpeg(tempDirectory, {
timeout: 60,
@@ -73,95 +117,18 @@ const tempCreateVideoThumbnailFS = (
"-vframes 1",
"-vf scale='if(gt(iw,ih),600,-1):if(gt(ih,iw),300,-1)'",
])
.on("start", (command) => {
/**
* log
*/
})
.on("start", () => {})
.on("end", async () => {
const thumbnailModel = new Thumbnail({
name: filename,
owner: user._id,
IV: thumbnailIV,
path: env.fsDirectory + thumbnailFilename,
s3ID: thumbnailFilename,
});
await thumbnailModel.save();
if (!file._id) {
return reject();
if (!emitter) {
await handleFinish();
}
const updateFileResponse = await File.updateOne(
{ _id: new ObjectId(file._id), "metadata.owner": user._id },
{
$set: {
"metadata.hasThumbnail": true,
"metadata.thumbnailID": thumbnailModel._id,
},
}
);
if (updateFileResponse.modifiedCount === 0) {
return reject();
}
const updatedFile = await File.findById({
_id: new ObjectId(file._id),
"metadata.owner": user._id,
});
if (!updatedFile) return reject();
fs.unlink(tempDirectory, (err) => {
resolve(updatedFile?.toObject());
});
})
.on("error", (err, _, stderr) => {
console.log("error", err, stderr);
resolve(file);
/**
* log
*/
})
.pipe(thumbnailCipher)
.pipe(writeStream, { end: true });
// ffmpeg()
// .input(readStream.pipe(decipher))
// .seekInput("00:00:01.00")
// .outputFormat("image2")
// .pipe(writeStream, { end: true })
// .on("end", async () => {
// const thumbnailModel = new Thumbnail({
// name: filename,
// owner: user._id,
// IV: thumbnailIV,
// path: env.fsDirectory + thumbnailFilename,
// });
// await thumbnailModel.save();
// resolve(file);
// })
// .on("error", (e) => {
// console.log("error", e);
// reject(e);
// });
// ffmpeg()
// .input(readStream.pipe(decipher))
// .size("300x?")
// .outputOptions("-frames:v 1")
// .on("end", async () => {
// const thumbnailModel = new Thumbnail({
// name: filename,
// owner: user._id,
// IV: thumbnailIV,
// path: env.fsDirectory + thumbnailFilename,
// });
// await thumbnailModel.save();
// resolve(file);
// })
// .output(writeStream);
});
});
};
+62
View File
@@ -0,0 +1,62 @@
const getEnvVariables = require("../dist/enviroment/get-env-variables");
getEnvVariables();
const mongoose = require("./mongoServerUtil");
const conn = mongoose.connection;
const File = require("../dist/models/file-model");
const User = require("../dist/models/user-model");
const crypto = require("crypto");
const createVideoThumbnail =
require("../dist/services/chunk-service/utils/createVideoThumbnail").default;
const getKey = require("../dist/key/get-key").default;
const waitForDatabase = () => {
return new Promise((resolve, reject) => {
if (conn.readyState !== 1) {
conn.once("open", () => {
resolve();
});
} else {
resolve();
}
});
};
const updateDocs = async () => {
console.log("\nWaiting for database...");
await waitForDatabase();
console.log("Connected to database\n");
console.log("Getting Key...");
await getKey();
console.log("Key Got\n");
// console.log("env", process.env.KEY);
console.log("Getting file list...");
const files = await File.find({
filename: {
$regex:
/\.(mp4|mov|avi|mkv|webm|wmv|flv|mpg|mpeg|3gp|3g2|mxf|ogv|ogg|m4v)$/i,
},
"metadata.thumbnailID": "",
"metadata.owner": "670c8c321ebf0d4211617eb9",
});
console.log("Found", files.length, "files");
for (let i = 0; i < files.length; i++) {
const currentFile = files[i];
console.log("current file", currentFile._id);
const user = await User.findById(currentFile.metadata.owner);
await createVideoThumbnail(currentFile, currentFile.filename, user);
}
console.log("Done");
process.exit();
};
updateDocs();