From 97050de99ab4af722643d3ee606540d8e1aee31d Mon Sep 17 00:00:00 2001 From: Yuzu Date: Sat, 17 Aug 2024 16:04:30 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Audio=20metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/speaker.ts | 8 ++++++-- src/index.ts | 2 ++ src/player/index.ts | 2 +- src/providers/base.ts | 4 ++++ src/providers/yt-dlp.ts | 22 ++++++++++++++++++++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/example/speaker.ts b/example/speaker.ts index c110053..0875028 100644 --- a/example/speaker.ts +++ b/example/speaker.ts @@ -9,7 +9,7 @@ import dotenv from "dotenv"; dotenv.config(); const main = async () => { - const videoId = "2gigEGxnsmo"; + const videoId = "l6gPxDSNbVk"; const videoId2 = "oM-JneFEdBk"; // Providers @@ -21,7 +21,11 @@ const main = async () => { player.startCurrentStream(); }); - await player.enqueue(`https://www.youtube.com/watch?v=${videoId}`); + const info = await player.enqueue( + `https://www.youtube.com/watch?v=${videoId}`, + ); + console.log(info); + await player.enqueue(`https://www.youtube.com/watch?v=${videoId2}`); }; diff --git a/src/index.ts b/src/index.ts index d30bfb7..8679523 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,10 @@ import { Player, createPlayer } from "./player"; +import { YtDlpProvider } from "./providers"; export { Player, createPlayer }; export default { Player, + YtDlpProvider, createPlayer, }; diff --git a/src/player/index.ts b/src/player/index.ts index bfbd429..627dbeb 100644 --- a/src/player/index.ts +++ b/src/player/index.ts @@ -113,7 +113,7 @@ export class Player { this.queue.push(information); } - console.log("Enqueued", url); + return information; } public async seek(time: number) { diff --git a/src/providers/base.ts b/src/providers/base.ts index 14354f7..4de373a 100644 --- a/src/providers/base.ts +++ b/src/providers/base.ts @@ -8,6 +8,10 @@ export interface AudioInformation { }; bitrate: number; livestream: boolean; + metadata: { + title: string | null; + thumbnail: string | null; + }; refreshInfoFunction: () => Promise; } diff --git a/src/providers/yt-dlp.ts b/src/providers/yt-dlp.ts index 0bcf02d..0340d90 100644 --- a/src/providers/yt-dlp.ts +++ b/src/providers/yt-dlp.ts @@ -43,6 +43,24 @@ export class YtDlpProvider extends Provider { throw new Error("Failed to parse YouTube formats"); } + let bestThumbnail = null; + + type Thumbnail = { url: string; preference: number }; + const sortedThumbnails = ytDlpWrapInfo.thumbnails.sort( + (a: Thumbnail, b: Thumbnail) => b.preference - a.preference, + ); + + for (let thumbnail of sortedThumbnails) { + try { + const response = await fetch(thumbnail.url); + + if (response.status === 200) { + bestThumbnail = thumbnail.url; + break; + } + } catch (error) {} + } + return { url: ytDlpWrapInfo.url, fileSize: ytDlpWrapInfo.filesize, @@ -52,6 +70,10 @@ export class YtDlpProvider extends Provider { bitrate: ytDlpWrapInfo.asr, //bitrate: Math.ceil((ytDlpWrapInfo.tbr || 128) * 1000), livestream: ytDlpWrapInfo.is_live, refreshInfoFunction, + metadata: { + title: ytDlpWrapInfo.title, + thumbnail: bestThumbnail, + }, } as AudioInformation; };