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
|