60 lines
No EOL
2.2 KiB
JavaScript
60 lines
No EOL
2.2 KiB
JavaScript
/* TODO
|
|
*
|
|
* Merge with commands/fun/image2audio.js
|
|
*
|
|
*/
|
|
import { SlashCommandBuilder } from 'discord.js';
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
import fetch from 'node-fetch';
|
|
import util from 'node:util';
|
|
import stream from 'node:stream';
|
|
import utils from '../../utils/videos.js';
|
|
|
|
export default {
|
|
data: new SlashCommandBuilder()
|
|
.setName('audio2image')
|
|
.setDescription('Transform an audio file into an image.')
|
|
.addAttachmentOption(option =>
|
|
option.setName('audio')
|
|
.setDescription('The audio that will become image.')
|
|
.setRequired(true)),
|
|
category: 'fun',
|
|
alias: ['a2i'],
|
|
async execute(interaction, args) {
|
|
if (!args.audio) return interaction.reply('Please attach an image with your message.');
|
|
|
|
await interaction.deferReply();
|
|
|
|
ifExistDelete(`${os.tmpdir()}/${args.audio.name}`);
|
|
ifExistDelete(`${os.tmpdir()}/${args.audio.name}.png`);
|
|
ifExistDelete(`${os.tmpdir()}/${args.audio.name}.sw`);
|
|
ifExistDelete(`${os.tmpdir()}/${args.audio.name}.mp3`);
|
|
|
|
const streamPipeline = util.promisify(stream.pipeline);
|
|
const res = await fetch(args.audio.url);
|
|
if (!res.ok) return interaction.editReply('An error has occured while trying to download your image.');
|
|
await streamPipeline(res.body, fs.createWriteStream(`${os.tmpdir()}/${args.audio.name}`));
|
|
|
|
await utils.ffmpeg(['-i', `${os.tmpdir()}/${args.audio.name}`, '-sample_rate', '44100', '-ac', '1', '-f', 's16le', '-acodec', 'pcm_s16le', `${os.tmpdir()}/${args.audio.name}.sw`]);
|
|
await utils.ffmpeg(['-pixel_format', 'rgb24', '-video_size', '128x128', '-f', 'rawvideo', '-i', `${os.tmpdir()}/${args.audio.name}.sw`, '-frames:v', '1', `${os.tmpdir()}/${args.audio.name}.png`]);
|
|
|
|
const file = fs.statSync(`${os.tmpdir()}/${args.audio.name}.png`);
|
|
const fileSize = (file.size / 1000000.0).toFixed(2);
|
|
|
|
if (fileSize > await utils.getMaxFileSize(interaction.guild)) return interaction.editReply('error');
|
|
interaction.editReply({ content: `Image file is ${fileSize} MB` });
|
|
return interaction.followUp({ files: [`${os.tmpdir()}/${args.audio.name}.png`] });
|
|
},
|
|
};
|
|
|
|
async function ifExistDelete(path) {
|
|
if (fs.existsSync(path)) {
|
|
fs.rm(path, (err) => {
|
|
console.log('deleted');
|
|
if (err) {
|
|
return;
|
|
}
|
|
});
|
|
}
|
|
} |