2024-01-14 13:45:48 -06:00
const fs = require ( 'fs' ) ,
2023-08-21 11:46:48 -05:00
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 ( )
2023-10-23 10:57:35 -05:00
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-10-23 10:57:35 -05:00
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 )
} )