Reaperxxxx commited on
Commit
3c65dd1
Β·
verified Β·
1 Parent(s): de32a43

Update server.js

Browse files
Files changed (1) hide show
  1. server.js +36 -47
server.js CHANGED
@@ -76,7 +76,7 @@ const scheduleFileDeletion = (filePath, delay = 600000) => {
76
  }, delay);
77
  };
78
 
79
- // API Route to download, convert, and serve .mp4 files
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}] Processing request for: ${fileUrl}`);
91
 
92
- try {
93
- console.log(`⬇️ [${requestId}] Downloading: ${fileUrl}`);
 
 
 
94
 
95
- const response = await axiosInstance({
96
- url: fileUrl,
97
- method: "GET",
98
- responseType: "stream",
99
- headers: { "User-Agent": "Mozilla/5.0", "Accept": "*/*" }
100
- });
101
 
102
- const isMkv = fileUrl.toLowerCase().endsWith(".mkv");
103
- const originalFilename = `${requestId}${isMkv ? ".mkv" : ".mp4"}`;
104
- const originalFilePath = path.join(DOWNLOAD_DIR, originalFilename);
105
 
106
- const mp4Filename = `${requestId}.mp4`;
107
- const mp4FilePath = path.join(DOWNLOAD_DIR, mp4Filename);
 
 
108
 
109
- const writer = fs.createWriteStream(originalFilePath);
 
 
 
 
 
110
 
111
- // Handle stream timeout manually
112
- const streamTimeout = setTimeout(() => {
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
- response.data.pipe(writer);
 
 
 
119
 
120
- writer.on("close", async () => {
121
- clearTimeout(streamTimeout); // Clear timeout when done
122
- const hostUrl = `${req.protocol}://${req.get("host")}`;
123
 
124
  if (isMkv) {
125
- try {
126
- await convertToMp4(originalFilePath, mp4FilePath);
127
- fs.unlinkSync(originalFilePath); // Remove MKV file
128
- } catch (error) {
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
- console.log(`βœ… [${requestId}] Download & conversion complete: ${servedUrl}`);
138
- res.json({ message: "Download & conversion complete", fileUrl: servedUrl });
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