Dine360-Ads-Backend/routes/uploadRoutes_ffmpeg.js
2026-06-13 13:05:28 +05:30

94 lines
3.6 KiB
JavaScript

// uploadRoute.js
const express = require("express");
const upload = require("../middlewares/upload"); // Import the Multer middleware
const pool = require("../config/db");
const path = require("path");
const fs = require("fs-extra");
const ffmpeg = require("fluent-ffmpeg");
const router = express.Router();
// Ensure the uploads and optimized directories exist
const uploadDir = path.join(__dirname, "../uploads");
const optimizedDir = path.join(__dirname, "../optimized");
fs.ensureDirSync(uploadDir);
fs.ensureDirSync(optimizedDir);
async function optimizeVideo(inputPath, outputPath) {
return new Promise((resolve, reject) => {
ffmpeg(inputPath)
.videoCodec("libx264")
.audioCodec("aac")
.format("mp4")
.outputOptions([
"-movflags frag_keyframe+empty_moov",
"-preset medium",
"-crf 23",
"-maxrate 2M",
"-bufsize 4M",
])
.on("end", () => {
console.log("Video optimization completed.");
resolve();
})
.on("error", (err) => {
console.error("Error optimizing video:", err);
reject(err);
})
.save(outputPath);
});
}
// Upload file API
router.post("/upload", upload.single("file"), async (req, res) => {
try {
const { client_id, file_name } = req.body;
if (!req.file) {
return res.status(400).json({ error: "No file uploaded" });
}
const inputPath = path.join(uploadDir, req.file.filename);
const outputPath = path.join(optimizedDir, "optimized_" + req.file.filename);
const dbFilePath = `optimized/optimized_${req.file.filename}`;
if (req.file.mimetype.startsWith("video/")) {
try {
await optimizeVideo(inputPath, outputPath);
await pool.query(
"INSERT INTO tbl_files (transid, client_id, file_name, file_path) VALUES (UUID(), ?, ?, ?)",
[client_id, file_name, dbFilePath]
);
res.json({ message: "File uploaded and optimized successfully!", file_path: dbFilePath });
} catch (optimizeError) {
console.error("Optimization error:", optimizeError);
await pool.query(
"INSERT INTO tbl_files (transid, client_id, file_name, file_path) VALUES (UUID(), ?, ?, ?)",
[client_id, file_name, `uploads/${req.file.filename}`]
);
res.status(500).json({ message: "File uploaded, but optimization failed.", file_path: `uploads/${req.file.filename}` });
}
} else {
await pool.query(
"INSERT INTO tbl_files (transid, client_id, file_name, file_path) VALUES (UUID(), ?, ?, ?)",
[client_id, file_name, `uploads/${req.file.filename}`]
);
res.json({ message: "File uploaded successfully!", file_path: `uploads/${req.file.filename}` });
}
} catch (err) {
console.error("General upload error:", err);
res.status(500).json({ error: err.message });
}
});
router.delete("/del/:fileid", async (req, res) => {
try {
const { fileid } = req.params;
const [files] = await pool.query("delete from tbl_files where transid =? ", [fileid]);
const [filesfromads] = await pool.query("delete from tbl_client_partner_mapping where fileid =? ", [fileid]);
res.json(files);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
module.exports = router;