Check for video format

This commit is contained in:
supositware 2021-06-12 16:27:46 +02:00
parent a4bc4748ea
commit cef981c522
2 changed files with 108 additions and 86 deletions

View file

@ -80,12 +80,39 @@ router.get('/', function(req, res, next) {
router.get('/status/:uuid', function (req, res ,next) {
let uuid = req.params.uuid;
if (progress[uuid]) {
res.send(progress[uuid]);
return res.send(progress[uuid]);
} else {
res.send(undefined);
return res.send(undefined);
}
});
router.get('/format', function (req, res ,next) {
let url;
let i = 0;
try {
url = new URL(req.query.url);
} catch (e) {
return res.send(undefined);
}
let formats = [];
youtubedl.exec(url.href, ['--dump-json'], {}, function(err, output) {
if (err) throw err
let json = JSON.parse(output);
json.formats.forEach(format => {
if (format.vcodec === 'none' || format.acodec === 'none')
return;
i++;
formats.push({ext: format.ext, id: format.format_id, note: format.format_note});
});
return res.send(formats);
});
return;
});
router.post('/', async function(req, res, next) {
let data;
const form = formidable({ multiples: true});
@ -99,22 +126,17 @@ router.post('/', async function(req, res, next) {
})
});
console.log(data.url);
if (data.url === undefined) {
//res.render('index', { error: true, errormsg: 'You didn\'t input a link'})
return res.send('You didn\'t input a link')
}
let quality;
if (data.quality === 'worst') {
quality = 'worst';
} else {
quality = 'best';
}
console.log(data.format);
if (data.format === undefined) {
data.format = 'mp4';
let format = data.format;
if (data.format === undefined || data.format === 'mp3' || data.format === 'flac') {
format = 'best';
}
if (data.url.toLowerCase().includes('porn')) {
@ -132,7 +154,7 @@ router.post('/', async function(req, res, next) {
}
}
let options = ['--format=mp4', '-f', quality];
let options = ['-f', format];
if (data.proxy !== 'none') {
options.push('--proxy');
options.push(data.proxy);
@ -182,7 +204,28 @@ router.post('/', async function(req, res, next) {
video.on('end', function() {
progress[data.uuid] = 0;
if (data.format === 'mp4' || data.format === 'webm') {
if (data.format === 'mp3' || data.format === 'flac') {
// If user requested an audio format, convert it
ffmpeg(`./public/uploads/${DLFile}`)
.noVideo()
.audioChannels('2')
.audioFrequency('44100')
.audioBitrate('320k')
.format(data.format)
.save(`./public/uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`)
.on('error', function(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
return res.json({error: err.message});
//return res.render('index', { error: true, errormsg: err.message})
})
.on('end', () => {
fs.unlinkSync(`./public/uploads/${DLFile}`);
if (data.feed !== 'on') generateWaveform(DLFile.replace(`.${ext}`, `.${data.format}`));
return res.json({url: `uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`});
//return res.attachment(`./public/uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`);
});
} else {
if (data.sponsorBlock) { // WARNING: THIS PART SUCK
let filter = '';
let abc = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
@ -246,26 +289,6 @@ router.post('/', async function(req, res, next) {
res.json({url: `uploads/${DLFile}`})
if (data.feed !== 'on') generateThumbnail(DLFile);
}
} else {
// If user requested an audio format, convert it
ffmpeg(`./public/uploads/${DLFile}`)
.noVideo()
.audioChannels('2')
.audioFrequency('44100')
.audioBitrate('320k')
.format(data.format)
.save(`./public/uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`)
.on('error', function(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
return res.json({error: err.message});
//return res.render('index', { error: true, errormsg: err.message})
})
.on('end', () => {
fs.unlinkSync(`./public/uploads/${DLFile}`);
if (data.feed !== 'on') generateWaveform(DLFile.replace(`.${ext}`, `.${data.format}`));
return res.json({url: `uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`});
//return res.attachment(`./public/uploads/${DLFile.replace(`.${ext}`, `.${data.format}`)}`);
});
}
});

View file

@ -4,7 +4,7 @@ I guess have fun looking at the html, no easter egg to find here.
Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for all my bad coding
-->
<!DOCTYPE html>
<html class="gradientBG" lang="en">
<html class="has-background-grey-dark" lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -24,20 +24,8 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
<title>Le epic video downloader v<%= version %></title>
</head>
<body class="has-text-light gradientBG">
<ul class="circles">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<section class="section has-text-centered">
<div class="container ">
<div class="container">
<h1 class="title has-text-light">Le epic downloader v<%= version %></h1>
<div class="downloader form">
<form id="download-form" method="POST" action="/" enctype="application/x-www-form-urlencoded">
@ -45,21 +33,6 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
<div class="field-body">
<div class="field is-horizontal">
<div class="control">
<label class="radio" for="small">
<input class="radio" type="radio" name="quality" id="small" value="small">
Low quality
</label>
<label class="radio" for="high">
<input class="radio" type="radio" name="quality" id="high" value="high" checked>
High quality
</label>
<label class="checkbox" for="alt">
<input class="checkbox" type="checkbox" name="alt" id="alt" title="Use this if download dosen't work">
Alternate download
</label>
<label class="checkbox" for="feed">
<input class="checkbox" type="checkbox" name="feed" id="feed" title="Use this if you don't want the video you are downloading to be public">
Hide from feed
@ -78,8 +51,17 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
<div class="field-body">
<div class="field is-expanded">
<div class="field has-addons">
<p class="control">
<div class="select">
<select name="format" id="format">
<option value="mp4">MP4</option>
<option value="mp3">MP3</option>
<option value="flac">FLAC</option>
</select>
</div>
</p>
<p class="control is-expanded">
<input type="text" id="url" name="url" class="downloadurl input is-rounded" placeholder="Link">
<input type="text" id="url" name="url" class="downloadurl input is-rounded" placeholder="Link" onkeyup="CheckFormat()">
</p>
<p class="control">
<button type="submit" class="downloadbtn button is-primary is-rounded" id="button">Download that mf video</button>
@ -97,25 +79,7 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
</div>
<div class="field is-horizontal level">
<div class="control level-left">
<label class="radio" for="mp4">
<input class="radio" type="radio" name="format" value="mp4" id="mp4" checked>
Video?
</label>
<label class="radio" for="mp3">
<input class="radio" type="radio" name="format" value="mp3" id="mp3">
MP3?
</label>
<label class="radio" for="flac" title="This is pure placebo">
<input class="radio" type="radio" name="format" value="flac" id="flac" title="This is pure placebo">
FLAC?
</label>
</div>
<div class="field-body level-right">
<div class="field-body">
<div class="field is-horizontal">
<div class="control">
<span>Proxy options:</span>
@ -216,13 +180,11 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
document.getElementById('progress').innerHTML = '<progress class="progress is-success" id="progress-bar" max="100">0%</progress>';
let frm = new FormData(form);
frm.append('uuid', uuid);
console.log(...frm);
let xhttp = new XMLHttpRequest();
console.log('hi');
let progress = setInterval(() => {
CheckProgress();
}, 1000);
}, 2000);
xhttp.addEventListener("load", function(event) {
const json = JSON.parse(event.target.responseText);
@ -280,6 +242,43 @@ Come take a look here https://git.namejeff.xyz/Supositware/jeff-downloader for a
});
}
function CheckFormat() {
let url;
try {
url = new URL(document.getElementById("url").value);
} catch (e) {
return;
}
document.getElementsByClassName("select")[0].className = "select is-loading";
console.log(encodeURI(url.href));
let xhttp = new XMLHttpRequest();
xhttp.open("get", `/format?url=${url.href}`, true);
xhttp.send();
xhttp.addEventListener("load", function(event) {
console.log(event.target.responseText);
let html = [];
let json = JSON.parse(event.target.responseText);
json.forEach(format => {
html.push(`<option value="${format.id}">${format.ext} - ${format.note}</option>`);
});
html.reverse();
html.push('<option value="mp3">MP3</option>');
html.push('<option value="flac">FLAC</option>');
document.getElementById("format").innerHTML = html;
document.getElementsByClassName("select")[0].className = "select";
});
xhttp.addEventListener("error", function(event) {
console.error(event.target.responseText);
});
}
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);