Haha-Yes/utils/videos.js

133 lines
3.1 KiB
JavaScript
Raw Normal View History

2022-06-17 01:25:43 +02:00
import os from 'node:os';
import { execFile } from 'node:child_process';
2022-09-14 11:32:01 +02:00
const { NODE_ENV } = process.env;
2024-01-30 00:28:27 +01:00
const ytdlpMaxResolution = 2160;
2022-06-17 01:25:43 +02:00
export default {
downloadVideo,
upload,
2022-06-17 02:14:14 +02:00
ffmpeg,
stringIsAValidurl,
2022-08-22 20:23:27 +02:00
compressVideo,
2023-03-20 03:55:53 +01:00
getVideoCodec,
2023-04-11 20:16:18 +02:00
getVideoSize,
2023-04-11 14:34:19 +02:00
getMaxFileSize,
2022-06-17 01:25:43 +02:00
};
2024-01-30 00:28:27 +01:00
async function downloadVideo(urlArg, output, format = `bestvideo[height<=?${ytdlpMaxResolution}]+bestaudio/best`) {
2022-06-17 01:25:43 +02:00
await new Promise((resolve, reject) => {
execFile('./bin/yt-dlp', ['-f', format, urlArg, '-o', `${os.tmpdir()}/${output}.%(ext)s`, '--force-overwrites', '--no-playlist', '--remux-video=mp4/webm/mov', '--no-warnings'], (err, stdout, stderr) => {
2022-06-17 01:25:43 +02:00
if (err) {
2024-01-30 00:28:27 +01:00
return reject(stderr);
2022-06-17 01:25:43 +02:00
}
if (stderr) {
console.error(stderr);
2024-01-30 00:28:27 +01:00
// Should already be rejected at that points
return reject(stderr);
2022-06-17 01:25:43 +02:00
}
2022-09-14 11:32:01 +02:00
console.log(NODE_ENV === 'development' ? stdout : null);
2024-01-30 00:28:27 +01:00
return resolve();
2022-06-17 01:25:43 +02:00
});
});
}
async function upload(file) {
return await new Promise((resolve, reject) => {
execFile('./bin/upload.sh', [file], (err, stdout, stderr) => {
2022-06-17 01:25:43 +02:00
if (err) {
reject(stderr);
}
if (stderr) {
console.error(stderr);
}
resolve(stdout);
});
});
}
async function ffmpeg(command) {
return await new Promise((resolve, reject) => {
execFile('ffmpeg', ['-hide_banner', ...command], (err, stdout, stderr) => {
2022-06-17 01:25:43 +02:00
if (err) {
reject(stderr);
}
if (stderr) {
console.error(stderr);
}
2022-09-14 11:32:01 +02:00
console.log(NODE_ENV === 'development' ? stdout : null);
2022-09-12 11:33:25 +02:00
resolve();
2022-06-17 01:25:43 +02:00
});
});
}
async function stringIsAValidurl(s) {
try {
new URL(s);
return true;
}
catch (err) {
return false;
}
2022-07-06 18:52:44 +02:00
}
2022-08-22 20:23:27 +02:00
async function compressVideo(input, output, preset) {
await new Promise((resolve, reject) => {
execFile('./bin/HandBrakeCLI', ['-i', input, '-Z', preset, '-o', `${os.tmpdir()}/${output}`], (err, stdout, stderr) => {
2022-08-22 20:23:27 +02:00
if (err) {
reject(stderr);
}
if (stderr) {
console.error(stderr);
}
2022-09-14 11:32:01 +02:00
console.log(NODE_ENV === 'development' ? stdout : null);
2022-09-12 11:33:25 +02:00
resolve();
2022-08-22 20:23:27 +02:00
});
});
2023-03-20 03:55:53 +01:00
}
async function getVideoCodec(input) {
return await new Promise((resolve, reject) => {
execFile('ffprobe', ['-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=codec_name', '-of', 'default=noprint_wrappers=1:nokey=1', input], (err, stdout, stderr) => {
2023-03-20 03:55:53 +01:00
if (err) {
reject(stderr);
}
if (stderr) {
console.error(stderr);
}
resolve(stdout.trim());
});
});
2023-04-11 14:34:19 +02:00
}
2024-01-30 00:28:27 +01:00
async function getVideoSize(urlArg, format = `bestvideo[height<=?${ytdlpMaxResolution}]+bestaudio/best`) {
2023-04-11 14:34:19 +02:00
return await new Promise((resolve, reject) => {
execFile('./bin/yt-dlp', [urlArg, '-f', format, '--no-warnings', '-O', '%(filesize,filesize_approx)s'], (err, stdout, stderr) => {
2023-04-11 20:16:18 +02:00
if (err) {
reject(stderr);
}
if (stderr) {
console.error(stderr);
}
resolve(stdout / 1000000.0);
});
});
}
async function getMaxFileSize(guild) {
return await new Promise((resolve) => {
2023-04-11 14:34:19 +02:00
const tier = guild.premiumTier;
switch (tier) {
case 0:
case 1:
2023-04-19 16:58:42 +02:00
resolve(25);
2023-04-11 14:34:19 +02:00
break;
case 2:
2023-04-19 16:58:42 +02:00
resolve(50);
2023-04-11 14:34:19 +02:00
break;
case 3:
2023-04-19 16:58:42 +02:00
resolve(100);
2023-04-11 14:34:19 +02:00
break;
default:
2023-04-19 16:58:42 +02:00
resolve(25);
2023-04-11 14:34:19 +02:00
break;
}
});
2022-08-22 20:23:27 +02:00
}