ytm / server.js
Reaperxxxx's picture
Update server.js
59429a4 verified
Raw
History Blame Contribute Delete
3.73 kB
const express = require("express");
const { chromium } = require("playwright-core");
const fs = require("fs");
const path = require("path");
const axios = require("axios");
const app = express();
const PORT = 7860;
const DOMAIN = "https://reikerxx-ytm.hf.space";
const DOWNLOADS_DIR = path.join(__dirname, "downloads");
if (!fs.existsSync(DOWNLOADS_DIR)) {
fs.mkdirSync(DOWNLOADS_DIR, { recursive: true });
}
async function getDownloadLink(youtubeUrl) {
const browser = await chromium.launch({
headless: true,
executablePath: "/usr/bin/chromium",
args: ["--no-sandbox", "--disable-setuid-sandbox"]
});
const page = await browser.newPage();
let downloadLink = null;
try {
await page.goto("https://ogmp3.com", { waitUntil: "domcontentloaded" });
await page.fill("#url", youtubeUrl);
page.on("response", async (response) => {
const url = response.url();
if (url.includes("safestytmp3.cc") && url.includes("/download/")) {
downloadLink = url;
}
});
await page.click("#convert-button");
await page.waitForTimeout(15000);
} catch (error) {
console.error("Error extracting download link:", error);
} finally {
await browser.close();
}
return downloadLink;
}
async function downloadMP3(url) {
try {
const response = await axios({
url,
method: "GET",
responseType: "stream",
});
let fileName = `download_${Date.now()}.mp3`;
const contentDisposition = response.headers["content-disposition"];
if (contentDisposition) {
const match = contentDisposition.match(/filename="?(.+?)"?$/);
if (match) {
fileName = match[1];
}
}
if (!fileName.endsWith(".mp3")) {
fileName += ".mp3";
}
const filePath = path.join(DOWNLOADS_DIR, fileName);
const writer = fs.createWriteStream(filePath);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on("finish", () => {
setTimeout(() => {
fs.unlink(filePath, (err) => {
if (!err) {
console.log(`Deleted: ${fileName}`);
}
});
}, 300000);
resolve(fileName);
});
writer.on("error", reject);
});
} catch (error) {
console.error("Error downloading MP3:", error.message);
return null;
}
}
app.get("/api/q", async (req, res) => {
const youtubeUrl = req.query.url;
if (!youtubeUrl) {
return res.status(400).json({ success: false, error: "Missing YouTube URL" });
}
console.log(`Processing: ${youtubeUrl}`);
try {
const downloadLink = await getDownloadLink(youtubeUrl);
if (downloadLink) {
const fileName = await downloadMP3(downloadLink);
if (fileName) {
res.json({ success: true, file: `${DOMAIN}/downloads/${fileName}` });
} else {
res.status(500).json({ success: false, error: "Failed to download MP3" });
}
} else {
res.status(404).json({ success: false, error: "No MP3 link found" });
}
} catch (error) {
console.error("Error processing YouTube link:", error);
res.status(500).json({ success: false, error: "Internal Server Error" });
}
});
app.use("/downloads", express.static(DOWNLOADS_DIR));
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});