From 765b3c64f0cfb06b317428208a64d1186e3ccb58 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Thu, 4 Jul 2024 21:19:07 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Discord=20bot=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/test.ts | 83 ++++++++++++++-- package.json | 4 + pnpm-lock.yaml | 249 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 329 insertions(+), 7 deletions(-) diff --git a/example/test.ts b/example/test.ts index 2a83891..99b3897 100644 --- a/example/test.ts +++ b/example/test.ts @@ -2,22 +2,91 @@ import NekoMelody, { Player } from "../src"; import Speaker from "speaker"; import ffmpeg from "fluent-ffmpeg"; +import { + NoSubscriberBehavior, + VoiceConnectionStatus, + createAudioPlayer, + createAudioResource, + joinVoiceChannel, +} from "@discordjs/voice"; import { YtDlpProvider } from "../src/providers"; +import { AudioInformation } from "../src/providers/base"; +import { Client, IntentsBitField } from "discord.js"; + +import dotenv from "dotenv"; +dotenv.config(); const main = async () => { + // Discord Client + const client = new Client({ + intents: [ + IntentsBitField.Flags.Guilds, + IntentsBitField.Flags.GuildVoiceStates, + ], + }); + client.login(process.env.BOT_TOKEN); + + // Wait until the client is ready + await new Promise((resolve) => { + client.once("ready", resolve); + }); + + // Get channel + const guild = client.guilds.cache.get(process.env.GUILD_ID ?? ""); + if (!guild) throw new Error("Guild not found"); + + const member = guild.members.cache.get(process.env.MEMBER_ID ?? ""); + if (!member) throw new Error("Member not found"); + + if (!member.voice.channel) { + throw new Error("Member is not connected to a voice channel."); + } + + console.log("Joining voice channel", member.voice.channel.name); + // Join voice channel + const connection = joinVoiceChannel({ + channelId: member.voice.channel.id, + guildId: guild.id, + adapterCreator: member.voice.channel.guild.voiceAdapterCreator, + }); + + // Wait until the connection is ready + await new Promise((resolve) => { + connection.on(VoiceConnectionStatus.Ready, resolve); + }); + const videoId = "2gigEGxnsmo"; + const videoId2 = "oM-JneFEdBk"; // Providers const providers = [new YtDlpProvider()]; const player = NekoMelody.createPlayer(providers); + const discordPlayer = createAudioPlayer({ + behaviors: { + noSubscriber: NoSubscriberBehavior.Pause, + }, + }); + connection.subscribe(discordPlayer); - await player.play(`https://www.youtube.com/watch?v=${videoId}`); - playSpeaker(player); + player.on("play", (information: AudioInformation) => { + if (!player.stream) throw new Error("No input stream"); + //playSpeaker(player); - // setTimeout(async () => { - // await player.seek(100); - // playSpeaker(player); - // }, 5000); + const resource = createAudioResource(player.stream, { + //inlineVolume: true, + }); + discordPlayer.play(resource); + + discordPlayer.on("stateChange", (oldState, newState) => { + console.log("State change", oldState.status, newState.status); + if (oldState.status === "playing" && newState.status === "idle") { + player.endCurrentStream(); + } + }); + }); + + await player.enqueue(`https://www.youtube.com/watch?v=${videoId}`); + await player.enqueue(`https://www.youtube.com/watch?v=${videoId2}`); }; // TODO: player end event to automate changing the stream @@ -57,7 +126,7 @@ const playSpeaker = async (player: Player) => { .audioChannels(2) .audioFrequency(44100) .on("error", (err) => { - console.error("An error occurred:", err.message); + console.error("[FFmpeg] > Error:", err.message); }); // Pipe the ffmpeg output to the speaker diff --git a/package.json b/package.json index d58a02f..e5f0330 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,12 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "dependencies": { + "@discordjs/voice": "^0.17.0", "axios": "^1.7.2", + "discord.js": "^14.15.3", + "dotenv": "^16.4.5", "fluent-ffmpeg": "^2.1.3", + "libsodium-wrappers": "^0.7.13", "music-metadata": "^8.3.0", "play-audio": "^0.5.2", "play-dl": "github:YuzuZensai/play-dl-test#test", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf5e261..ead57c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,24 @@ importers: .: dependencies: + '@discordjs/voice': + specifier: ^0.17.0 + version: 0.17.0 axios: specifier: ^1.7.2 version: 1.7.2 + discord.js: + specifier: ^14.15.3 + version: 14.15.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 fluent-ffmpeg: specifier: ^2.1.3 version: 2.1.3 + libsodium-wrappers: + specifier: ^0.7.13 + version: 0.7.13 music-metadata: specifier: ^8.3.0 version: 8.3.0 @@ -72,6 +84,38 @@ importers: packages: + '@discordjs/builders@1.8.2': + resolution: {integrity: sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@1.5.3': + resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@2.1.0': + resolution: {integrity: sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==} + engines: {node: '>=18'} + + '@discordjs/formatters@0.4.0': + resolution: {integrity: sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==} + engines: {node: '>=16.11.0'} + + '@discordjs/rest@2.3.0': + resolution: {integrity: sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==} + engines: {node: '>=16.11.0'} + + '@discordjs/util@1.1.0': + resolution: {integrity: sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==} + engines: {node: '>=16.11.0'} + + '@discordjs/voice@0.17.0': + resolution: {integrity: sha512-hArn9FF5ZYi1IkxdJEVnJi+OxlwLV0NJYWpKXsmNOojtGtAZHxmsELA+MZlu2KW1F/K1/nt7lFOfcMXNYweq9w==} + engines: {node: '>=16.11.0'} + + '@discordjs/ws@1.1.1': + resolution: {integrity: sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==} + engines: {node: '>=16.11.0'} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -366,6 +410,18 @@ packages: cpu: [x64] os: [win32] + '@sapphire/async-queue@1.5.2': + resolution: {integrity: sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/shapeshift@3.9.7': + resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} + engines: {node: '>=v16'} + + '@sapphire/snowflake@3.5.3': + resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + '@swc/core-darwin-arm64@1.6.1': resolution: {integrity: sha512-u6GdwOXsOEdNAdSI6nWq6G2BQw5HiSNIZVcBaH1iSvBnxZvWbnIKyDiZKaYnDwTLHLzig2GuUjjE2NaCJPy4jg==} engines: {node: '>=10'} @@ -453,6 +509,9 @@ packages: '@types/node@20.14.5': resolution: {integrity: sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==} + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@typescript-eslint/eslint-plugin@7.13.1': resolution: {integrity: sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -511,6 +570,10 @@ packages: resolution: {integrity: sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==} engines: {node: ^18.18.0 || >=20.0.0} + '@vladfrangu/async_event_emitter@2.4.0': + resolution: {integrity: sha512-eNb/9DMwNvhhgn1UuQ8Rl90jhj9PBkYH4oQ522TkiWUVWRfbh3PjdOTFkVGNKs5+xUXalkgFrUSwtY8u0g0S4g==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -660,6 +723,17 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + discord-api-types@0.37.83: + resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} + + discord.js@14.15.3: + resolution: {integrity: sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==} + engines: {node: '>=16.11.0'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -926,6 +1000,12 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsodium-wrappers@0.7.13: + resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==} + + libsodium@0.7.13: + resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==} + lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -944,13 +1024,22 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + magic-bytes.js@1.10.0: + resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -1098,6 +1187,23 @@ packages: engines: {node: '>=14'} hasBin: true + prism-media@1.3.5: + resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} + peerDependencies: + '@discordjs/opus': '>=0.8.0 <1.0.0' + ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 + node-opus: ^0.3.3 + opusscript: ^0.0.8 + peerDependenciesMeta: + '@discordjs/opus': + optional: true + ffmpeg-static: + optional: true + node-opus: + optional: true + opusscript: + optional: true + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -1256,6 +1362,12 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} @@ -1295,6 +1407,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@6.13.0: + resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} + engines: {node: '>=18.0'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1328,6 +1444,18 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + yaml@2.4.5: resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} engines: {node: '>= 14'} @@ -1342,6 +1470,68 @@ packages: snapshots: + '@discordjs/builders@1.8.2': + dependencies: + '@discordjs/formatters': 0.4.0 + '@discordjs/util': 1.1.0 + '@sapphire/shapeshift': 3.9.7 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + ts-mixer: 6.0.4 + tslib: 2.6.3 + + '@discordjs/collection@1.5.3': {} + + '@discordjs/collection@2.1.0': {} + + '@discordjs/formatters@0.4.0': + dependencies: + discord-api-types: 0.37.83 + + '@discordjs/rest@2.3.0': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@sapphire/snowflake': 3.5.3 + '@vladfrangu/async_event_emitter': 2.4.0 + discord-api-types: 0.37.83 + magic-bytes.js: 1.10.0 + tslib: 2.6.3 + undici: 6.13.0 + + '@discordjs/util@1.1.0': {} + + '@discordjs/voice@0.17.0': + dependencies: + '@types/ws': 8.5.10 + discord-api-types: 0.37.83 + prism-media: 1.3.5 + tslib: 2.6.3 + ws: 8.17.1 + transitivePeerDependencies: + - '@discordjs/opus' + - bufferutil + - ffmpeg-static + - node-opus + - opusscript + - utf-8-validate + + '@discordjs/ws@1.1.1': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/rest': 2.3.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@types/ws': 8.5.10 + '@vladfrangu/async_event_emitter': 2.4.0 + discord-api-types: 0.37.83 + tslib: 2.6.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -1539,6 +1729,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true + '@sapphire/async-queue@1.5.2': {} + + '@sapphire/shapeshift@3.9.7': + dependencies: + fast-deep-equal: 3.1.3 + lodash: 4.17.21 + + '@sapphire/snowflake@3.5.3': {} + '@swc/core-darwin-arm64@1.6.1': optional: true @@ -1603,6 +1802,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.14.5 + '@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.1 @@ -1684,6 +1887,8 @@ snapshots: '@typescript-eslint/types': 7.13.1 eslint-visitor-keys: 3.4.3 + '@vladfrangu/async_event_emitter@2.4.0': {} + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: acorn: 8.12.0 @@ -1820,6 +2025,28 @@ snapshots: dependencies: path-type: 4.0.0 + discord-api-types@0.37.83: {} + + discord.js@14.15.3: + dependencies: + '@discordjs/builders': 1.8.2 + '@discordjs/collection': 1.5.3 + '@discordjs/formatters': 0.4.0 + '@discordjs/rest': 2.3.0 + '@discordjs/util': 1.1.0 + '@discordjs/ws': 1.1.1 + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + lodash.snakecase: 4.1.1 + tslib: 2.6.2 + undici: 6.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + dotenv@16.4.5: {} + eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} @@ -2114,6 +2341,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsodium-wrappers@0.7.13: + dependencies: + libsodium: 0.7.13 + + libsodium@0.7.13: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -2126,10 +2359,16 @@ snapshots: lodash.merge@4.6.2: {} + lodash.snakecase@4.1.1: {} + lodash.sortby@4.7.0: {} + lodash@4.17.21: {} + lru-cache@10.2.2: {} + magic-bytes.js@1.10.0: {} + media-typer@1.1.0: {} merge-stream@2.0.0: {} @@ -2252,6 +2491,8 @@ snapshots: prettier@3.3.2: {} + prism-media@1.3.5: {} + proxy-from-env@1.1.0: {} punycode@2.3.1: {} @@ -2417,6 +2658,10 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-mixer@6.0.4: {} + + tslib@2.6.2: {} + tslib@2.6.3: {} tsup@8.1.0(@swc/core@1.6.1)(typescript@5.4.5): @@ -2457,6 +2702,8 @@ snapshots: undici-types@5.26.5: {} + undici@6.13.0: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -2493,6 +2740,8 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + ws@8.17.1: {} + yaml@2.4.5: {} yocto-queue@0.1.0: {}