-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
125 lines (112 loc) · 4.6 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
require('dotenv').config()
const fs = require('fs');
const mm = require('musicmetadata');
const moment = require('moment');
require("moment-duration-format");
const getYouTubeID = require('get-youtube-id');
const fetchVideoInfo = require('youtube-info');
const youtubeStream = require('youtube-audio-stream');
var ytdl = require('ytdl-core');
function getRandLocalSong(db) {
return new Promise(function(resolve, reject) {
let files = fs.readdirSync('./songs/');
files = files.filter(function(item) {
return item != '.DS_Store';
});
if (files.length > 0) {
const chosenSong = files[Math.floor(Math.random() * files.length)];
mm(fs.createReadStream('./songs/' + chosenSong), function (err, metadata) {
if (err) throw err;
let song = {};
if (chosenSong === 'bgm.mp3') {
song = {
title: 'BGM',
owner: 'Disbott',
url: process.env.WEBSITE + '/songs/' + chosenSong,
audioUrl: './songs/' + chosenSong,
medium: 'local'
};
} else {
const duration = parseInt(metadata.duration);
const prettyDuration = moment.duration(duration, 'seconds').format('mm:ss');
song = {
title: metadata.title,
album: metadata.album,
owner: metadata.artist[0],
prettyDuration: prettyDuration,
url: process.env.WEBSITE + '/songs/' + chosenSong,
audioUrl: './songs/' + chosenSong,
medium: 'local'
};
}
db.insert(song, function(err, song) {
if (err) { throw err; }
resolve(song);
});
});
}
})
}
exports.addUrl = function (url, db) {
return new Promise(function(resolve, reject) {
function onYtMediaInfo(err, mediaInfo) {
if (err) return console.log("ytdl error:", err);
// sort by bitrate, high to low; prefer webm over anything else
const formats = mediaInfo.formats.filter(f => f.container === "webm").sort((a, b) => b.audioBitrate - a.audioBitrate);
// get first audio-only format or fallback to non-dash video
const bestaudio = formats.find(f => f.audioBitrate > 0 && !f.bitrate) || formats.find(f => f.audioBitrate > 0);
if (!bestaudio) return console.log("[playRemote] No valid formats");
const duration = parseInt(mediaInfo.length_seconds);
const prettyDuration = moment.duration(duration, 'seconds').format('mm:ss');
const song = {
title: mediaInfo.title,
description: mediaInfo.description,
owner: mediaInfo.author,
thumbnailUrl: mediaInfo.thumbnail_url,
prettyDuration: prettyDuration,
views: mediaInfo.view_count,
url: 'https://www.youtube.com/watch?v=' + mediaInfo.video_id,
audioUrl: bestaudio.url,
medium: 'youtube'
};
db.insert(song, function(err, song) {
if (err) { throw err; }
resolve(song);
});
}
if (url.includes('youtube') || url.includes('youtu.be')) {
try {
ytdl.getInfo(url, onYtMediaInfo);
} catch (e) { console.log("ytdl threw:", e); }
}
})
};
exports.removeCurrentSong = function(db, _id) {
return new Promise(function(resolve, reject) {
db.remove({ _id: _id }, {}, function() {});
resolve(_id);
})
}
exports.getNextSong = function (db) {
return new Promise(function(resolve, reject) {
db.find({}, function (err, songs) {
var nextSong = songs.shift();
if (typeof nextSong === "undefined") {
// Get a random song from local files
getRandLocalSong(db).then(function(localSong) {
resolve(localSong);
})
} else {
resolve(nextSong);
}
});
})
}
exports.stopPlaying = function (bot) {
var voiceChannels = bot.VoiceConnections;
if (!voiceChannels[0]) return console.log("Voice not connected");
voiceChannels.forEach(function(voiceChannel) {
var encoderStream = voiceChannel.voiceConnection.getEncoderStream();
encoderStream.unpipeAll();
});
}