permanent-waves/discordeno-audio-plugin/src/audio-source/youtube.ts

43 lines
1.5 KiB
TypeScript

import { YouTube, ytDownload } from "../../deps.ts";
import { bufferIter, retry } from "../../utils/mod.ts";
import { demux } from "../demux/mod.ts";
import { createAudioSource, empty } from "./audio-source.ts";
import { errorMessageCallback, parseYoutubeId } from "../../../utils.ts";
export async function getYoutubeSources(guildId: bigint, added_by?: string, ...queries: string[]) {
const sources = queries.map((query) => getYoutubeSource(query, guildId, added_by));
const awaitedSources = await Promise.all(sources);
return awaitedSources
.filter((source) => source !== undefined)
.map((source) => source!);
}
export async function getYoutubeSource(query: string, guildId: bigint, added_by?: string) {
try {
query = parseYoutubeId(query);
const results = await YouTube.search(query, { limit: 1, type: "video" });
if (results.length > 0) {
const { id, title } = results[0];
return createAudioSource(title!, async () => {
const stream = await retry(
async () =>
await ytDownload(id!, {
mimeType: `audio/webm; codecs="opus"`,
})
);
if (stream === undefined) {
errorMessageCallback(guildId, `There was an error trying to play **${title}**:\n
something broke in getYoutubeSource`);
console.log(`Failed to play ${title}\n Returning empty stream`);
return empty();
}
return bufferIter(demux(stream));
}, guildId, added_by);
}
} catch(err) {
console.error(err);
return undefined;
}
}