DLAP/AudioBackend/PlayAudio.js

133 lines
4.1 KiB
JavaScript
Raw Normal View History

2022-12-01 21:56:03 -05:00
/**************************************************************************
*
* DLAP Bot: A Discord bot that plays local audio tracks.
* (C) Copyright 2022
* Programmed by Andrew Lee
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
***************************************************************************/
import { createAudioResource } from '@discordjs/voice';
import { parseFile } from 'music-metadata';
import { readdirSync, readFileSync, writeFile } from 'node:fs';
import { EmbedBuilder, AttachmentBuilder } from 'discord.js';
2022-12-01 21:56:03 -05:00
import { player } from './VoiceInitialization.js';
import { audioState, files } from './AudioControl.js';
import { integer } from '../Commands/play.js';
2022-12-01 21:56:03 -05:00
const { statusChannel, txtFile } = JSON.parse(readFileSync('./config.json', 'utf-8'));
let fileData;
2022-12-02 22:05:20 -05:00
2022-12-01 21:56:03 -05:00
export let audio;
2022-12-02 22:05:20 -05:00
export let currentTrack;
export let metadataEmpty;
2022-12-01 21:56:03 -05:00
export let audioTitle;
export let audioArtist;
export let audioYear;
export let audioAlbum;
export let audioPicture;
2022-12-02 22:05:20 -05:00
export let duration;
2022-12-01 21:56:03 -05:00
const inputFiles = readdirSync('music');
export async function playAudio(bot) {
const resource = createAudioResource('music/' + audio);
player.play(resource);
console.log(`Now playing: ${audio}`);
2022-12-01 21:56:03 -05:00
audioState(0);
const audioFile = audio;
try {
const { common, format } = await parseFile('music/' + audio);
metadataEmpty = false;
if (common.title && common.artist && common.year && common.album) {
audioTitle = common.title;
audioArtist = common.artist;
audioYear = common.year;
audioAlbum = common.album;
if (common.picture) audioPicture = new AttachmentBuilder(common.picture[0].data, { name: 'albumArt.png', description: 'Album Art' });
2022-12-01 21:56:03 -05:00
} else {
metadataEmpty = true;
}
duration = new Date(format.duration * 1000).toISOString().slice(11, 19);
2022-12-01 21:56:03 -05:00
} catch (e) {
console.error(e);
}
audio = audio.split('.').slice(0, -1).join('.');
2022-12-02 22:05:20 -05:00
if (txtFile) {
fileData = `Now Playing: ${audio}`;
2022-12-01 21:56:03 -05:00
writeFile('./now-playing.txt', fileData, (err) => {
if (err) { console.log(err); }
});
}
const statusEmbed = new EmbedBuilder();
if (metadataEmpty) {
2022-12-01 21:56:03 -05:00
statusEmbed.setTitle('Now Playing');
statusEmbed.addFields(
{ name: 'Title', value: `${audio}` },
{ name: 'Duration', value: `${duration}` }
2022-12-01 21:56:03 -05:00
);
statusEmbed.setColor('#0066ff');
} else {
statusEmbed.setTitle('Now Playing');
statusEmbed.addFields(
{ name: 'Title', value: `${audioTitle}`, inline: true },
{ name: 'Artist', value: `${audioArtist}`, inline: true },
2022-12-01 21:56:03 -05:00
{ name: 'Year', value: `${audioYear}` },
{ name: 'Duration', value: `${duration}` }
2022-12-01 21:56:03 -05:00
);
// console.log(audioPicture);
if (audioPicture) {
// statusEmbed.setThumbnail({ url: 'attachment://albumArt.png' });
}
2022-12-01 21:56:03 -05:00
statusEmbed.setFooter({ text: `Album: ${audioAlbum}\nFilename: ${audioFile}` });
statusEmbed.setColor('#0066ff');
}
const channel = bot.channels.cache.get(statusChannel);
if (!channel) return console.error('The status channel does not exist! Skipping.');
return await channel.send({ embeds: [statusEmbed], files: [audioPicture] });
2022-12-01 21:56:03 -05:00
}
export function updatePlaylist(option) {
switch (option) {
2022-12-01 21:56:03 -05:00
case 'next':
currentTrack++;
audio = files[currentTrack];
break;
case 'back':
currentTrack--;
audio = files[currentTrack];
break;
case 'reset':
currentTrack = 0;
audio = files[currentTrack];
break;
case 'input':
audio = inputFiles[integer];
break;
case 'stop':
audio = 'Not Playing';
break;
}
}