|
|
| const express = require("express") |
| const ytdl = require("@distube/ytdl-core") |
| const fetch = require("node-fetch") |
| const fs = require("fs") |
| const path = require("path") |
| const tmp = require("tmp") |
|
|
| const app = express() |
| app.use(express.json()) |
|
|
| app.get("/download", async (req, res) => { |
| const url = req.query.url |
| const type = req.query.type || "video" |
| if (!url) return res.status(400).json({ error: "url required" }) |
|
|
| const cookieHeader = process.env.YT_COOKIE |
|
|
| try { |
| const info = await ytdl.getInfo(url, { |
| requestOptions: { headers: { Cookie: cookieHeader } } |
| }) |
|
|
| let ryd = {} |
| try { |
| const r = await fetch(`https://returnyoutubedislikeapi.com/votes?videoId=${info.videoDetails.videoId}`) |
| ryd = await r.json() |
| } catch {} |
|
|
| const metadata = { |
| title: info.videoDetails.title, |
| uploader: info.videoDetails.author.name, |
| duration: info.videoDetails.lengthSeconds, |
| views: info.videoDetails.viewCount, |
| likes: info.videoDetails.likes, |
| dislikes: ryd.dislikes || 0, |
| videoId: info.videoDetails.videoId |
| } |
|
|
| const tmpFile = tmp.fileSync({ postfix: type === "audio" ? ".mp3" : ".mp4" }) |
| const stream = ytdl.downloadFromInfo(info, { |
| requestOptions: { headers: { Cookie: cookieHeader } }, |
| quality: "highest", |
| filter: type === "audio" ? "audioonly" : "audioandvideo" |
| }) |
|
|
| stream.pipe(fs.createWriteStream(tmpFile.name)) |
| stream.on("end", () => { |
| res.json({ |
| metadata, |
| download_url: `/file?path=${encodeURIComponent(tmpFile.name)}` |
| }) |
| }) |
| } catch (e) { |
| res.status(500).json({ error: e.message }) |
| } |
| }) |
|
|
| app.get("/file", (req, res) => { |
| const filePath = req.query.path |
| if (!filePath || !fs.existsSync(filePath)) return res.status(404).json({ error: "file not found" }) |
| res.download(filePath, path.basename(filePath), () => { |
| fs.unlinkSync(filePath) |
| }) |
| }) |
|
|
| app.listen(process.env.PORT || 8000, () => console.log(`Server running on port ${process.env.PORT || 8000}`)) |