| const express = require("express"); |
| const { spawn } = require("child_process"); |
| const fs = require("fs"); |
| const path = require("path"); |
| const crypto = require("crypto"); |
|
|
| const app = express(); |
| const PORT = 7860; |
|
|
| |
| const TMP = "/tmp"; |
|
|
| |
| const cleanup = (file) => { |
| try { |
| if (fs.existsSync(file)) fs.unlinkSync(file); |
| } catch {} |
| }; |
|
|
| app.get("/", async (req, res) => { |
| const url = req.query.url; |
|
|
| if (!url) { |
| return res.json({ |
| status: false, |
| message: "Use ?url=video_link" |
| }); |
| } |
|
|
| const id = crypto.randomBytes(6).toString("hex"); |
|
|
| const outputFile = path.join(TMP, `${id}.mp4`); |
|
|
| |
| const ffmpegArgs = [ |
| "-y", |
| "-user_agent", "Mozilla/5.0", |
| "-i", url, |
| "-c", "copy", |
| "-bsf:a", "aac_adtstoasc", |
| "-movflags", "+faststart", |
| outputFile |
| ]; |
|
|
| const ffmpeg = spawn("ffmpeg", ffmpegArgs); |
|
|
| let timeout = setTimeout(() => { |
| ffmpeg.kill("SIGKILL"); |
| cleanup(outputFile); |
| }, 1000 * 60 * 8); |
|
|
| ffmpeg.stderr.on("data", () => {}); |
|
|
| ffmpeg.on("close", (code) => { |
| clearTimeout(timeout); |
|
|
| if (code !== 0 || !fs.existsSync(outputFile)) { |
| cleanup(outputFile); |
|
|
| return res.json({ |
| status: false, |
| error: "Download failed or blocked stream" |
| }); |
| } |
|
|
| |
| const fileUrl = `https://${req.headers.host}/file/${id}`; |
|
|
| return res.json({ |
| status: true, |
| download: fileUrl |
| }); |
| }); |
| }); |
|
|
| |
| app.get("/file/:id", (req, res) => { |
| const file = path.join(TMP, `${req.params.id}.mp4`); |
|
|
| if (!fs.existsSync(file)) { |
| return res.json({ |
| status: false, |
| error: "File expired or not found" |
| }); |
| } |
|
|
| res.download(file, "video.mp4", () => { |
| cleanup(file); |
| }); |
| }); |
|
|
| app.listen(PORT, () => { |
| console.log("Running on", PORT); |
| }); |