fix: prevents youtube bot blocking #171
6 changed files with 1000 additions and 94 deletions
1037
package-lock.json
generated
1037
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -25,6 +25,7 @@
|
|||
"discord-player-youtubei": "^1.3.1",
|
||||
"discord.js": "^14.16.2",
|
||||
"mediaplex": "^0.0.9",
|
||||
"puppeteer": "^23.4.0",
|
||||
"sqlite3": "^5.1.7",
|
||||
"typescript": "^5.6.2",
|
||||
"uuid": "^10.0.0"
|
||||
|
|
|
@ -1,13 +1,37 @@
|
|||
import { Player, PlayerEvents, useMainPlayer } from "discord-player";
|
||||
import { PlayerEvents, useMainPlayer } from "discord-player";
|
||||
import { Client } from "discord.js";
|
||||
import { readdir } from "fs/promises";
|
||||
|
||||
/** Load all the events */
|
||||
export default async (client: Client) => {
|
||||
export default async (client: Client, isDev: boolean) => {
|
||||
const events_categories = (await readdir(__dirname)).filter(
|
||||
(element) => !element.endsWith(".js") && !element.endsWith(".ts"),
|
||||
);
|
||||
|
||||
const player = useMainPlayer();
|
||||
|
||||
if (isDev) {
|
||||
player.on("debug", async (message) => {
|
||||
console.log(`General player debug event: ${message}`);
|
||||
});
|
||||
|
||||
player.events.on("debug", async (_, message) => {
|
||||
console.log(`Player debug event: ${message}`);
|
||||
});
|
||||
}
|
||||
|
||||
player.events.on("error", (_, error) => {
|
||||
// Emitted when the player queue encounters error
|
||||
console.error(`General player error event: ${error.message}`);
|
||||
console.error(error);
|
||||
});
|
||||
|
||||
player.events.on("playerError", (_, error) => {
|
||||
// Emitted when the audio player errors while streaming audio track
|
||||
console.error(`Player error event: ${error.message}`);
|
||||
console.error(error);
|
||||
});
|
||||
|
||||
events_categories.forEach(async (event_category) => {
|
||||
// Retrieve events
|
||||
const events = await readdir(`${__dirname}/${event_category}`);
|
||||
|
@ -29,7 +53,6 @@ export default async (client: Client) => {
|
|||
const event_type = event_type_ext.join(".");
|
||||
|
||||
if (event_category == "player") {
|
||||
const player = useMainPlayer() as Player;
|
||||
if (once) {
|
||||
// eslint-disable-next-line
|
||||
return player.events.once(event_type as keyof PlayerEvents, (...args: any[]) => {
|
||||
|
|
|
@ -21,7 +21,7 @@ export const run = async (isDev: boolean) => {
|
|||
|
||||
// Events Discord.JS and Player
|
||||
const events_name = "Events";
|
||||
await loadEvents(client)
|
||||
await loadEvents(client, isDev)
|
||||
.then(() => console.log(logStart(events_name, true)))
|
||||
.catch((err) => {
|
||||
console.error(err);
|
||||
|
|
|
@ -5,6 +5,7 @@ import { Database } from "sqlite3";
|
|||
import "../modules/client";
|
||||
import { loadLocales } from "./locales";
|
||||
import { YoutubeiExtractor } from "discord-player-youtubei";
|
||||
import { YoutubeWebTokenRoutine } from "./music";
|
||||
|
||||
/** Creation of the client and definition of its properties */
|
||||
export default async () => {
|
||||
|
@ -42,6 +43,9 @@ export default async () => {
|
|||
list: new Collection(),
|
||||
};
|
||||
|
||||
// Generate tokens
|
||||
const tokens = await YoutubeWebTokenRoutine(true);
|
||||
|
||||
const player = Player.singleton(client, {
|
||||
skipFFmpeg: true,
|
||||
ytdlOptions: {
|
||||
|
@ -50,7 +54,12 @@ export default async () => {
|
|||
},
|
||||
});
|
||||
await player.extractors.loadDefault((ext) => ext !== "YouTubeExtractor");
|
||||
await player.extractors.register(YoutubeiExtractor, {});
|
||||
await player.extractors.register(YoutubeiExtractor, {
|
||||
streamOptions: {
|
||||
useClient: "WEB",
|
||||
},
|
||||
trustedTokens: tokens,
|
||||
});
|
||||
|
||||
console.log("Translations progression :");
|
||||
client.locales = await loadLocales(client.config.default_lang);
|
||||
|
|
|
@ -2,6 +2,7 @@ import { EmbedBuilder } from "@discordjs/builders";
|
|||
import { GuildQueue, QueueRepeatMode, Track } from "discord-player";
|
||||
import { Client } from "discord.js";
|
||||
import { getLocale } from "./locales";
|
||||
import { generateTrustedToken, YoutubeiExtractor } from "discord-player-youtubei";
|
||||
|
||||
export const embedListQueue = (
|
||||
client: Client,
|
||||
|
@ -57,3 +58,16 @@ const printRepeatMode = (mode: QueueRepeatMode, loc: Map<string, string>) => {
|
|||
break;
|
||||
}
|
||||
};
|
||||
|
||||
export const YoutubeWebTokenRoutine = async (first: boolean) => {
|
||||
// Repeat in one week : 7 * 24 * 60 * 60 * 1000
|
||||
setTimeout(YoutubeWebTokenRoutine, 604800000, false);
|
||||
|
||||
const tokens = await generateTrustedToken();
|
||||
if (first) {
|
||||
return tokens;
|
||||
}
|
||||
|
||||
const instance = YoutubeiExtractor.getInstance();
|
||||
instance?.setTrustedTokens(tokens);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue