From 1ea8a6f26e57c32b97dd8e91866dfaba937e9fb8 Mon Sep 17 00:00:00 2001
From: Supositware <sup@libtar.de>
Date: Sun, 22 Sep 2024 01:34:35 +0200
Subject: [PATCH] UNTESTED: auto detect source fps

---
 commands/utility/vid2gif.js | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/commands/utility/vid2gif.js b/commands/utility/vid2gif.js
index 4e09891..9d68833 100644
--- a/commands/utility/vid2gif.js
+++ b/commands/utility/vid2gif.js
@@ -21,7 +21,7 @@ export default {
 				.setRequired(false))
 		.addIntegerOption(option =>
 			option.setName('fps')
-				.setDescription('Change the speed at which the gif play at. Default 20. Number between 1 and 100.')
+				.setDescription('Change the speed at which the gif play at. Number between 1 and 100.')
 				.setRequired(false))
 		.addBooleanOption(option =>
 			option.setName('autocrop')
@@ -81,13 +81,18 @@ export default {
 					await utils.autoCrop(oldOutput, output);
 				}
 
+				// Get the fps of the original video
+				if (!args.fps) {
+					args.fps = getVideoFramerate(output);
+				}
+
 				const gifskiOutput = output.replace(path.extname(output), '.gif');
 				const gifsicleOutput = output.replace(path.extname(output), 'gifsicle.gif');
 
 				// Extract every frame for gifski
 				await utils.ffmpeg(['-i', output, `${os.tmpdir()}/frame${interaction.id}%04d.png`]);
 				// Make it look better
-				await gifski(gifskiOutput, `${os.tmpdir()}/frame${interaction.id}*`, quality, args.fps);
+				await gifski(gifskiOutput, `${os.tmpdir()}/frame${interaction.id}*`, quality, await args.fps);
 				// Optimize it
 				await gifsicle(gifskiOutput, gifsicleOutput, args.noloop);
 
@@ -143,3 +148,19 @@ async function gifsicle(input, output, loop = false) {
 		});
 	});
 }
+
+async function getVideoFramerate(input) {
+	return await new Promise((resolve, reject) => {
+		execFile('ffprobe', ['-v', 'error', '-of', 'csv=p=0', '-select_streams', 'v:0', '-show_entries', 'stream=r_frame_rate', input], (err, stdout, stderr) => {
+			if (err) {
+				reject(stderr);
+			}
+			if (stderr) {
+				console.error(stderr);
+			}
+			const tempfps = stdout.trim().split('/');
+			const fps = tempfps[0] / tempfps[1];
+			return resolve(fps);
+		});
+	});
+}
\ No newline at end of file