Univerter/index.js

107 lines
3.2 KiB
JavaScript
Raw Normal View History

2024-01-14 13:45:48 -06:00
const fs = require('fs'),
path = require('path'),
express = require('express'),
2024-01-17 19:48:08 -06:00
cp = require("child_process"),
ffmpeg = require("ffmpeg-static")
2023-05-05 11:15:22 -05:00
const PORT = process.env.PORT || 8080
const app = express()
2024-01-17 19:48:08 -06:00
const MAX_FILESIZE = process.env.MAX_FILESIZE || 500
app.get("/convert", async (req, res) => {
var file = req.query.file || ""
var format = req.query.format
var filePath = path.join(__dirname, 'downloads', file)
if (fs.existsSync(filePath)) {
res.setHeader('Content-Disposition', `attachment; filename="test.${format}"`);
const ffmpegProcess = cp.spawn(ffmpeg, [
'-i', filePath,
'-f', format,
'-vcodec', 'copy' ,
'-'
], {
stdio: [
'pipe', 'pipe', 'pipe', 'pipe', 'pipe',
],
})
// ffmpegProcess.stderr.setEncoding('utf-8')
// ffmpegProcess.stderr.on('data', (data) => {
// console.log(data)
// })
// These are debugging lines to watch FFMPEG output :3
ffmpegProcess.stdio[1].pipe(res)
.on('close', () => {
fs.rmSync(filePath)
})
}
})
2023-11-20 14:39:04 -06:00
app.get("/download", async (req, res) => {
2023-05-08 12:52:41 -05:00
const url = req.query.url
2023-12-09 12:10:50 -06:00
const format = req.query.format || 'mp4'
const quality = req.query.quality || 'highest'
const defin = req.query.definition || 'hd'
const preset = 'medium'
2023-05-10 12:36:26 -05:00
2023-10-25 22:07:48 -05:00
res.setHeader("X-Accel-Buffering", "no")
2024-01-17 19:48:08 -06:00
res.setHeader("Content-Type", "text/html")
var downloadHTML = fs.readFileSync(path.join(__dirname, 'resources/downloading.html')).toString()
res.write(downloadHTML.substring(0, downloadHTML.indexOf("{CONTENT}")))
var fileName = Math.round(Math.random() * 100_000_000_000_000).toString() + '.' + 'webm'
var filePath = path.join(__dirname, 'downloads', fileName)
var ytdlpProcess = cp.spawn('yt-dlp', [
url,
'-o', filePath,
'--max-filesize', MAX_FILESIZE + 'm'
])
var lastDownload = 0
ytdlpProcess.stderr.setEncoding('utf-8')
ytdlpProcess.stderr.on('data', (data) => {
console.log(data)
})
var debounce = false
ytdlpProcess.stdout.setEncoding('utf-8')
ytdlpProcess.stdout.on('data', (data) => {
if (!debounce) {
if (data.includes("max-filesize")) {
debounce = true
res.write(`<p>Uh oh! The video you're trying to download is too large for this server's current settings ${MAX_FILESIZE}. Please try another server? (Visit main page and go to the codeberg for a list of instances!)</p>`)
}
else if (data.includes("[download]")) {
res.write(`<style>#downloading${lastDownload}{ display: none; }</style>`)
lastDownload += 1
res.write(`<p id="downloading${lastDownload}">` + data.substring(12) + `</p>`)
}
}
2023-10-25 22:07:48 -05:00
2024-01-17 19:48:08 -06:00
})
2024-01-07 16:37:37 -06:00
2024-01-17 19:48:08 -06:00
ytdlpProcess.on('close', () => {
if (fs.existsSync(filePath)) {
res.write(`<iframe src="/convert?file=${fileName}&format=${format}"></iframe>"`)
res.write(downloadHTML.substring(downloadHTML.indexOf("{CONTENT}") + 9), () => {res.end()})
} else {
res.write("<p>An error has occured!!! We're not exactly sure what the error is, but we cant seem to find the download file.</p>")
console.log(filePath)
}
})
2023-11-20 14:39:04 -06:00
2023-10-20 18:03:54 -05:00
})
2023-05-05 11:15:22 -05:00
app.use(express.static(path.join(__dirname, 'static')))
2023-05-10 12:36:26 -05:00
app.listen(PORT, function () {
2023-05-05 11:15:22 -05:00
console.log("Hosted on port " + PORT)
})