Update server.js
Browse files
server.js
CHANGED
|
@@ -76,7 +76,7 @@ const scheduleFileDeletion = (filePath, delay = 600000) => {
|
|
| 76 |
}, delay);
|
| 77 |
};
|
| 78 |
|
| 79 |
-
// API Route
|
| 80 |
app.get("/download", async (req, res) => {
|
| 81 |
const fileUrl = req.query.url;
|
| 82 |
|
|
@@ -87,66 +87,55 @@ app.get("/download", async (req, res) => {
|
|
| 87 |
|
| 88 |
// Generate a unique request ID
|
| 89 |
const requestId = generateRequestId();
|
| 90 |
-
console.log(`π₯ [${requestId}]
|
| 91 |
|
| 92 |
-
|
| 93 |
-
|
|
|
|
|
|
|
|
|
|
| 94 |
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
method: "GET",
|
| 98 |
-
responseType: "stream",
|
| 99 |
-
headers: { "User-Agent": "Mozilla/5.0", "Accept": "*/*" }
|
| 100 |
-
});
|
| 101 |
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
const originalFilePath = path.join(DOWNLOAD_DIR, originalFilename);
|
| 105 |
|
| 106 |
-
|
| 107 |
-
|
|
|
|
|
|
|
| 108 |
|
| 109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
console.error(`β [${requestId}] Writing file took too long!`);
|
| 114 |
-
writer.destroy();
|
| 115 |
-
return res.status(500).json({ error: "β File write timeout" });
|
| 116 |
-
}, 300000); // 5 minutes timeout
|
| 117 |
|
| 118 |
-
|
|
|
|
|
|
|
|
|
|
| 119 |
|
| 120 |
-
|
| 121 |
-
clearTimeout(streamTimeout); // Clear timeout when done
|
| 122 |
-
const hostUrl = `${req.protocol}://${req.get("host")}`;
|
| 123 |
|
| 124 |
if (isMkv) {
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
}
|
| 129 |
-
console.error(`β [${requestId}] Conversion error:`, error.message);
|
| 130 |
-
return res.status(500).json({ error: "β Conversion failed" });
|
| 131 |
-
}
|
| 132 |
}
|
| 133 |
|
| 134 |
-
const servedUrl = `${hostUrl}/files/${mp4Filename}`;
|
| 135 |
scheduleFileDeletion(mp4FilePath);
|
| 136 |
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
}
|
| 140 |
-
|
| 141 |
-
writer.on("error", (err) => {
|
| 142 |
-
console.error(`β [${requestId}] Error writing file:`, err);
|
| 143 |
-
res.status(500).json({ error: "Error saving file" });
|
| 144 |
-
});
|
| 145 |
-
|
| 146 |
-
} catch (error) {
|
| 147 |
-
console.error(`β [${requestId}] Download error:`, error.message);
|
| 148 |
-
res.status(500).json({ error: "Failed to download file" });
|
| 149 |
-
}
|
| 150 |
});
|
| 151 |
|
| 152 |
// Serve files from downloads directory
|
|
|
|
| 76 |
}, delay);
|
| 77 |
};
|
| 78 |
|
| 79 |
+
// **API Route - Responds Immediately, Processes in Background**
|
| 80 |
app.get("/download", async (req, res) => {
|
| 81 |
const fileUrl = req.query.url;
|
| 82 |
|
|
|
|
| 87 |
|
| 88 |
// Generate a unique request ID
|
| 89 |
const requestId = generateRequestId();
|
| 90 |
+
console.log(`π₯ [${requestId}] Received request for: ${fileUrl}`);
|
| 91 |
|
| 92 |
+
const isMkv = fileUrl.toLowerCase().endsWith(".mkv");
|
| 93 |
+
const originalFilename = `${requestId}${isMkv ? ".mkv" : ".mp4"}`;
|
| 94 |
+
const originalFilePath = path.join(DOWNLOAD_DIR, originalFilename);
|
| 95 |
+
const mp4Filename = `${requestId}.mp4`;
|
| 96 |
+
const mp4FilePath = path.join(DOWNLOAD_DIR, mp4Filename);
|
| 97 |
|
| 98 |
+
const hostUrl = `${req.protocol}://${req.get("host")}`;
|
| 99 |
+
const servedUrl = `${hostUrl}/files/${mp4Filename}`;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
|
| 101 |
+
// **Respond to the client immediately**
|
| 102 |
+
res.json({ message: "Processing in background", fileUrl: servedUrl });
|
|
|
|
| 103 |
|
| 104 |
+
// **Background Processing (Download & Convert)**
|
| 105 |
+
(async () => {
|
| 106 |
+
try {
|
| 107 |
+
console.log(`β¬οΈ [${requestId}] Downloading: ${fileUrl}`);
|
| 108 |
|
| 109 |
+
const response = await axiosInstance({
|
| 110 |
+
url: fileUrl,
|
| 111 |
+
method: "GET",
|
| 112 |
+
responseType: "stream",
|
| 113 |
+
headers: { "User-Agent": "Mozilla/5.0", "Accept": "*/*" }
|
| 114 |
+
});
|
| 115 |
|
| 116 |
+
const writer = fs.createWriteStream(originalFilePath);
|
| 117 |
+
response.data.pipe(writer);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
|
| 119 |
+
await new Promise((resolve, reject) => {
|
| 120 |
+
writer.on("finish", resolve);
|
| 121 |
+
writer.on("error", reject);
|
| 122 |
+
});
|
| 123 |
|
| 124 |
+
console.log(`β
[${requestId}] Download complete: ${originalFilePath}`);
|
|
|
|
|
|
|
| 125 |
|
| 126 |
if (isMkv) {
|
| 127 |
+
console.log(`π [${requestId}] Converting MKV to MP4...`);
|
| 128 |
+
await convertToMp4(originalFilePath, mp4FilePath);
|
| 129 |
+
fs.unlinkSync(originalFilePath); // Remove MKV file
|
| 130 |
+
console.log(`β
[${requestId}] Conversion complete: ${mp4FilePath}`);
|
|
|
|
|
|
|
|
|
|
| 131 |
}
|
| 132 |
|
|
|
|
| 133 |
scheduleFileDeletion(mp4FilePath);
|
| 134 |
|
| 135 |
+
} catch (error) {
|
| 136 |
+
console.error(`β [${requestId}] Processing error:`, error.message);
|
| 137 |
+
}
|
| 138 |
+
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
});
|
| 140 |
|
| 141 |
// Serve files from downloads directory
|