implement youtube autoplay
This commit is contained in:
parent
72bd3bf645
commit
66ed2b7117
2 changed files with 32 additions and 5 deletions
|
@ -866,6 +866,18 @@ export class Player extends EventEmitter {
|
||||||
return data as LyricsData;
|
return data as LyricsData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggle autoplay for youtube streams
|
||||||
|
* @param message The message object
|
||||||
|
* @param enable Enable/Disable autoplay
|
||||||
|
*/
|
||||||
|
setAutoplay(message: Message, enable: boolean): void {
|
||||||
|
const queue = this.getQueue(message);
|
||||||
|
if (!queue) return void this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message);
|
||||||
|
|
||||||
|
queue.autoPlay = Boolean(enable);
|
||||||
|
}
|
||||||
|
|
||||||
private _handleVoiceStateUpdate(oldState: VoiceState, newState: VoiceState) {
|
private _handleVoiceStateUpdate(oldState: VoiceState, newState: VoiceState) {
|
||||||
const queue = this.queues.find((g) => g.guildID === oldState.guild.id);
|
const queue = this.queues.find((g) => g.guildID === oldState.guild.id);
|
||||||
if (!queue) return;
|
if (!queue) return;
|
||||||
|
@ -964,7 +976,7 @@ export class Player extends EventEmitter {
|
||||||
private async _playTrack(queue: Queue, firstPlay: boolean): Promise<void> {
|
private async _playTrack(queue: Queue, firstPlay: boolean): Promise<void> {
|
||||||
if (queue.stopped) return;
|
if (queue.stopped) return;
|
||||||
|
|
||||||
if (queue.tracks.length === 1 && !queue.loopMode && !queue.repeatMode && !firstPlay) {
|
if (!queue.autoPlay && queue.tracks.length === 1 && !queue.loopMode && !queue.repeatMode && !firstPlay) {
|
||||||
if (this.options.leaveOnEnd && !queue.stopped) {
|
if (this.options.leaveOnEnd && !queue.stopped) {
|
||||||
this.queues.delete(queue.guildID);
|
this.queues.delete(queue.guildID);
|
||||||
const timeout = setTimeout(() => {
|
const timeout = setTimeout(() => {
|
||||||
|
@ -982,7 +994,22 @@ export class Player extends EventEmitter {
|
||||||
return void this.emit(PlayerEvents.QUEUE_END, queue.firstMessage, queue);
|
return void this.emit(PlayerEvents.QUEUE_END, queue.firstMessage, queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!queue.repeatMode && !firstPlay) {
|
if (queue.autoPlay && !queue.repeatMode && !firstPlay) {
|
||||||
|
const oldTrack = queue.tracks.shift();
|
||||||
|
|
||||||
|
const info = oldTrack.raw.source === 'youtube' ? await ytdl.getInfo(oldTrack.url).catch((e) => {}) : null;
|
||||||
|
if (info) {
|
||||||
|
const res = await Util.ytSearch(info.related_videos[0].title, { player: this, limit: 1 })
|
||||||
|
.then((v) => v[0])
|
||||||
|
.catch((e) => {});
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
queue.tracks.push(res);
|
||||||
|
if (queue.loopMode) queue.tracks.push(oldTrack);
|
||||||
|
queue.previousTracks.push(oldTrack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!queue.autoPlay && !queue.repeatMode && !firstPlay) {
|
||||||
const oldTrack = queue.tracks.shift();
|
const oldTrack = queue.tracks.shift();
|
||||||
if (queue.loopMode) queue.tracks.push(oldTrack);
|
if (queue.loopMode) queue.tracks.push(oldTrack);
|
||||||
queue.previousTracks.push(oldTrack);
|
queue.previousTracks.push(oldTrack);
|
||||||
|
@ -998,8 +1025,8 @@ export class Player extends EventEmitter {
|
||||||
|
|
||||||
private _playStream(queue: Queue, updateFilter: boolean, seek?: number): Promise<void> {
|
private _playStream(queue: Queue, updateFilter: boolean, seek?: number): Promise<void> {
|
||||||
return new Promise(async (resolve) => {
|
return new Promise(async (resolve) => {
|
||||||
const ffmeg = Util.checkFFmpeg();
|
const ffmpeg = Util.checkFFmpeg();
|
||||||
if (!ffmeg) return;
|
if (!ffmpeg) return;
|
||||||
|
|
||||||
const seekTime =
|
const seekTime =
|
||||||
typeof seek === 'number'
|
typeof seek === 'number'
|
||||||
|
|
|
@ -24,7 +24,7 @@ export class Queue extends EventEmitter {
|
||||||
public filters: QueueFilters;
|
public filters: QueueFilters;
|
||||||
public additionalStreamTime: number;
|
public additionalStreamTime: number;
|
||||||
public firstMessage: Message;
|
public firstMessage: Message;
|
||||||
public ytLast?: Track;
|
public autoPlay = false;
|
||||||
|
|
||||||
constructor(player: Player, message: Message) {
|
constructor(player: Player, message: Message) {
|
||||||
super();
|
super();
|
||||||
|
|
Loading…
Reference in a new issue