rain / index.js
fast72's picture
Create index.js
f6a1fc1 verified
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}`))