Code Monkey home page Code Monkey logo

kazagumo's Introduction

Kazagumo

A Shoukaku wrapper with built in queue system

AppVeyor Downloads npm GitHub contributors GitHub commit activity GitHub last commit NPM

Kazagumo

Kazagumo © Azur Lane

Features:

✓ Built-in queue system
✓ Easy to use
✓ Plugin system
✓ Uses shoukaku v4 + capable of Lavalink v4
✓ Stable 🙏

Documentation

Pls read the docs before asking 🙏🙏🙏 There is a useful search feature there

Shoukaku by Deivu; https://deivu.github.io/Shoukaku
Kazagumo; https://takiyo0.github.io/Kazagumo

Installation

npm i kazagumo

Metadata

version: 3.1.2
pre-release: false
Last build: 7-18-2024 23.36 PM

Plugins

npm i kazagumo-spotify

npm i kazagumo-apple

npm i kazagumo-filter

npm i kazagumo-nico

npm i kazagumo-deezer

npm i stone-deezer

Lavalink installation

Full tutorial step-by-step with image here ©Weeb-Devs, the owner is me tbh
System requirements here

Changes

// You can get ShoukakuPlayer from here
+ <KazagumoPlayer>.shoukaku
+ this.player.players.get("69696969696969").shoukaku

// Search tracks
- this.player.getNode().rest.resolve("ytsearch:pretender Official髭男dism") // Shoukaku
+ this.player.search("pretender Official髭男dism") // Kazagumo
    
// Create a player
- this.player.getNode().joinChannel(...) // Shoukaku
+ this.player.createPlayer(...) // Kazagumo
    
// Add a track to the queue. MUST BE A kazagumoTrack, you can get from <KazagumoPlayer>.search()
+ this.player.players.get("69696969696969").queue.add(kazagumoTrack) // Kazagumo       

// Play a track
- this.player.players.get("69696969696969").playTrack(shoukakuTrack) // Shoukaku
+ this.player.players.get("69696969696969").play() // Kazagumo, take the first song on queue
+ this.player.players.get("69696969696969").play(kazagumoTrack) // Kazagumo, will unshift current song and forceplay this song
        
// Play previous song
+ this.player.players.get("69696969696969").play(this.player.players.get("69696969696969").getPrevious()) // Kazagumo, make sure it's not undefined first        

// Pauses or resumes the player. Control from kazagumoPlayer instead of shoukakuPlayer
- this.player.players.get("69696969696969").setPaused(true) // Shoukaku
+ this.player.players.get("69696969696969").pause(true) // Kazagumo
    
// Set filters. Access shoukakuPlayer from <KazagumoPlayer>.player
- this.player.players.get("69696969696969").setFilters({lowPass: {smoothing: 2}}) // Shoukaku
+ this.player.players.get("69696969696969").shoukaku.setFilters({lowPass: {smoothing: 2}}) // Kazagumo

// Set volume, use Kazagumo's for smoother volume
- this.player.players.get("69696969696969").setVolume(1) // Shoukaku 100% volume
+ this.player.players.get("69696969696969").setVolume(100) // Kazagumo 100% volume

// Skip the current song
- this.player.players.get("69696969696969").stopTrack() // Stoptrack basically skip on shoukaku
+ this.player.players.get("69696969696969").skip() // skip on kazagumo. easier to find :v

Migration from v2 to v3

- playerResumed event
+ queueUpdate event
- KazagumoPlayer#getPrevious function
* previous object to an array
* `uri` property on track is now optional
* add NEARLY and RECONNECTING to State
+ VoiceState enum

Support

⚠️ Please read the docs first before asking question ⚠️

Kazagumo support server: https://discord.gg/nPPW2Gzqg2 (anywhere lmao)
Shoukaku support server: https://discord.gg/FVqbtGu (#development)
Report if you found a bug here https://github.com/Takiyo0/Kazagumo/issues/new/choose

Enable playerMoved event

import { Kazagumo, Payload, Plugins } from "kazagumo";

const kazagumo = new Kazagumo({
    ...,
    plugins: [new Plugins.PlayerMoved(client)]
}, Connector, Nodes, ShoukakuOptions)

Example bot

const {Client, GatewayIntentBits} = require('discord.js');
const {Guilds, GuildVoiceStates, GuildMessages, MessageContent} = GatewayIntentBits;
const {Connectors} = require("shoukaku");
const {Kazagumo, KazagumoTrack} = require("../dist");

const Nodes = [{
    name: 'owo',
    url: 'localhost:2333',
    auth: 'youshallnotpass',
    secure: false
}];
const client = new Client({intents: [Guilds, GuildVoiceStates, GuildMessages, MessageContent]});
const kazagumo = new Kazagumo({
    defaultSearchEngine: "youtube",
    // MAKE SURE YOU HAVE THIS
    send: (guildId, payload) => {
        const guild = client.guilds.cache.get(guildId);
        if (guild) guild.shard.send(payload);
    }
}, new Connectors.DiscordJS(client), Nodes);

client.on("ready", () => console.log(client.user.tag + " Ready!"));

kazagumo.shoukaku.on('ready', (name) => console.log(`Lavalink ${name}: Ready!`));
kazagumo.shoukaku.on('error', (name, error) => console.error(`Lavalink ${name}: Error Caught,`, error));
kazagumo.shoukaku.on('close', (name, code, reason) => console.warn(`Lavalink ${name}: Closed, Code ${code}, Reason ${reason || 'No reason'}`));
kazagumo.shoukaku.on('debug', (name, info) => console.debug(`Lavalink ${name}: Debug,`, info));
kazagumo.shoukaku.on('disconnect', (name, count) => {
    const players = [...kazagumo.shoukaku.players.values()].filter(p => p.node.name === name);
    players.map(player => {
        kazagumo.destroyPlayer(player.guildId);
        player.destroy();
    });
    console.warn(`Lavalink ${name}: Disconnected`);
});

kazagumo.on("playerStart", (player, track) => {
    client.channels.cache.get(player.textId)?.send({content: `Now playing **${track.title}** by **${track.author}**`})
        .then(x => player.data.set("message", x));
});

kazagumo.on("playerEnd", (player) => {
    player.data.get("message")?.edit({content: `Finished playing`});
});

kazagumo.on("playerEmpty", player => {
    client.channels.cache.get(player.textId)?.send({content: `Destroyed player due to inactivity.`})
        .then(x => player.data.set("message", x));
    player.destroy();
});

client.on("messageCreate", async msg => {
    if (msg.author.bot) return;

    if (msg.content.startsWith("!play")) {
        const args = msg.content.split(" ");
        const query = args.slice(1).join(" ");

        const {channel} = msg.member.voice;
        if (!channel) return msg.reply("You need to be in a voice channel to use this command!");

        let player = await kazagumo.createPlayer({
            guildId: msg.guild.id,
            textId: msg.channel.id,
            voiceId: channel.id,
            volume: 40
        })

        let result = await kazagumo.search(query, {requester: msg.author});
        if (!result.tracks.length) return msg.reply("No results found!");

        if (result.type === "PLAYLIST") for (let track of result.tracks) player.queue.add(track);
        else player.queue.add(result.tracks[0]);

        if (!player.playing && !player.paused) player.play();
        return msg.reply({content: result.type === "PLAYLIST" ? `Queued ${result.tracks.length} from ${result.playlistName}` : `Queued ${result.tracks[0].title}`});
    }

    if (msg.content.startsWith("!forceplay")) {
        let player = kazagumo.players.get(msg.guild.id);
        if (!player) return msg.reply("No player found!");
        const args = msg.content.split(" ");
        const query = args.slice(1).join(" ");
        let result = await kazagumo.search(query, {requester: msg.author});
        if (!result.tracks.length) return msg.reply("No results found!");
        player.play(new KazagumoTrack(result.tracks[0].getRaw(), msg.author));
        return msg.reply({content: `Forced playing **${result.tracks[0].title}** by **${result.tracks[0].author}**`});
    }

    if (msg.content.startsWith("!previous")) {
        let player = kazagumo.players.get(msg.guild.id);
        if (!player) return msg.reply("No player found!");
        const previous = player.getPrevious(); // we get the previous track without removing it first
        if (!previous) return msg.reply("No previous track found!");
        await player.play(player.getPrevious(true)); // now we remove the previous track and play it
        return msg.reply("Previous!");
    }
})


client.login('');

Known issue

This part should be in kazagumo-spotify but whatever
  • Force playing song from spotify module (player.play(result.tracks[0]); result.tracks[0] is from spotify) is currently not working. ONLY WHEN YOU DO player.play(thing), NOT player.play() OR player.queue.add(new KazagumoTrack(...)) Please use this workaround
    const { KazagumoTrack } = require("kazagumo"); // CommonJS
    import { KazagumoTrack } from "kazagumo"; // ES6; don't laugh if it's wrong

    let track = result.tracks[0] // the spotify track
    let convertedTrack = new KazagumoTrack(track.getRaw()._raw, track.author);
    player.play(convertedTrack);

Contributors

kazagumo's People

Contributors

aadi0009 avatar achiragaming avatar dependabot[bot] avatar emirkabal avatar evilg-mc avatar null8626 avatar rainyxeon avatar sarcasterxo avatar takiyo0 avatar vann-dev avatar xenofic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

kazagumo's Issues

Add volume to player creation

on erela.js its like this

player = await client.manager.create({
      guild: id,
      voiceChannel: id,
      textChannel: id,
      volume: number
    });

but on kazagumo

client.kazagumo.createPlayer({
        guildId: id,
        voiceId: id,
        textId: id,
      });
      await player.setVolume(nubmer);

on this it give the error if player created but no track added like join command so i suggest to add on createplayer volume option

kazagumoPlayer is unexported

Is your feature request related to a problem? Please describe.
kazagumoPlayer is not exported so we can't use it for params

Describe the solution you'd like
Export the kazagumoPlayer from the typings too

Describe alternatives you've considered
null

Additional context
null

kazagumoTrack: _kazagumoOptions.defaultThumbnail in getThumbnail() is returning undefined.

When using <kazagumoPlayer>.search(), _kazagumoOptions.defaultThumbnail is returning undefined.

This is what is thrown:

TypeError: Cannot read properties of undefined (reading '_kazagumoOptions')
    at kazagumoTrack.getThumbnail (.\node_modules\kazagumo\src\kazagumoTrack.js:134:124)
    at new kazagumoTrack (.\node_modules\kazagumo\src\kazagumoTrack.js:50:14)
    at .\node_modules\kazagumo\src\kazagumoSearch.js:59:44
    at Array.map (<anonymous>)
    at kazagumoSearch.search (.\node_modules\kazagumo\src\kazagumoSearch.js:59:35)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async kazagumoPlayer.search (.\node_modules\kazagumo\src\kazagumoPlayer.js:161:16)
    at async CommandTest.exec (.\src\commands\core\test.js:64:24)
    at async CommandHandler.runCommand (.\node_modules\discord-akairo\src\struct\commands\CommandHandler.js:767:21)
    at async CommandHandler.handleDirectCommand (.\node_modules\discord-akairo\src\struct\commands\CommandHandler.js:439:20)
    at async CommandHandler.handle (.\node_modules\discord-akairo\src\struct\commands\CommandHandler.js:379:23)

Removing the variable from the URL string allows the program to continue.

Node: 16.10.0
Kazagumo: 1.0.10

Support for Deezer and Apple Music

I would really love to see the support for Deezer and Apple Music if it's possible. Also, discord.js is releasing v14 so adding support to it too would be great.

player.getPrevious() get the first track not the previous track

using playlist https://open.spotify.com/playlist/3sXxFdGLOmCDNcgwYduBvw?si=a936d593325746f4

image

I have skip 2 songs first then use the previous command. As you see in the screenshot it played the first song not the last song skipped.

i am using await player.play(player.getPrevious(true));

if I am using something wrong please guide me or if not that will be awesome if it plays from the last skip song and goes up the queue one by one not the first.

Type error

kazagumo.shoukaku.on('disconnect', (name, players, moved) => {
if (moved) return;
players.map(player => player.connection.disconnect())
console.warn(Lavalink ${name}: Disconnected);
});

parameters are wrong, correct them are (name, code)
update this on readme file

Video returned by YouTube isn't what was requested

Symptoms: bot finds tracks by request, adds them to the queue, playerStart event is triggered, then the TrackExceptionEvent is triggered...
Not sure if it's a kazagumo or shokaku error...

lavalink
2024-03-30T14:23:27.721+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : Starting Launcher v4.0.4 using Java 21.0.1 with PID 15764 (C:\Users\MaKarastY\Desktop\Java Projects\lavalink\Lavalink.jar started by MaKarastY in C:\Users\MaKarastY\Desktop\Java Projects\lavalink)
2024-03-30T14:23:27.725+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : No active profile set, falling back to 1 default profile: "default"
2024-03-30T14:23:28.376+02:00  INFO 15764 --- [           main] l.server.bootstrap.PluginManager         : Found plugin 'lavasrc-plugin' version 4.0.1
2024-03-30T14:23:28.439+02:00  INFO 15764 --- [           main] l.server.bootstrap.PluginManager         : Loaded lavasrc-plugin-4.0.1.jar (123 classes)
2024-03-30T14:23:28.526+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : Started Launcher in 1.167 seconds (process running for 1.531)
2024-03-30T14:23:28.579+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 :

←[32m       .  ←[31m _                  _ _       _    ←[32m__ _ _
←[32m      /\\ ←[31m| | __ ___   ____ _| (_)_ __ | | __←[32m\ \ \ \
←[32m     ( ( )←[31m| |/ _` \ \ / / _` | | | '_ \| |/ /←[32m \ \ \ \
←[32m      \\/ ←[31m| | (_| |\ V / (_| | | | | | |   < ←[32m  ) ) ) )
←[32m       '  ←[31m|_|\__,_| \_/ \__,_|_|_|_| |_|_|\_\←[32m / / / /
←[0m    =========================================←[32m/_/_/_/←[0m

        Version:        4.0.4
        Build time:     10.03.2024 17:32:10 UTC
        Branch          HEAD
        Commit:         bb5e126
        Commit time:    10.03.2024 17:29:08 UTC
        JVM:            21.0.1
        Lavaplayer      2.1.1

2024-03-30T14:23:28.586+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : No active profile set, falling back to 1 default profile: "default"
2024-03-30T14:23:29.110+02:00  WARN 15764 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2024-03-30T14:23:29.131+02:00  INFO 15764 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2024-03-30T14:23:29.132+02:00  INFO 15764 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 541 ms
2024-03-30T14:23:29.195+02:00  INFO 15764 --- [           main] c.g.t.lavasrc.plugin.LavaSrcPlugin       : Loading LavaSrc plugin...
2024-03-30T14:23:29.331+02:00  INFO 15764 --- [           main] c.s.d.l.tools.GarbageCollectionMonitor   : GC monitoring enabled, reporting results every 2 minutes.
2024-03-30T14:23:30.780+02:00  INFO 15764 --- [           main] c.g.t.lavasrc.plugin.LavaSrcPlugin       : Registering Spotify audio source manager...
2024-03-30T14:23:30.881+02:00  INFO 15764 --- [           main] l.server.config.KoeConfiguration         : OS: WINDOWS, Arch: X86_64
2024-03-30T14:23:30.882+02:00  INFO 15764 --- [           main] l.server.config.KoeConfiguration         : Enabling JDA-NAS
2024-03-30T14:23:30.885+02:00  INFO 15764 --- [           main] c.s.l.c.natives.NativeLibraryLoader      : Native library udpqueue: loading with filter null
2024-03-30T14:23:30.888+02:00  INFO 15764 --- [           main] c.s.l.c.natives.NativeLibraryLoader      : Native library udpqueue: successfully loaded.
2024-03-30T14:23:30.901+02:00  WARN 15764 --- [           main] l.server.config.SentryConfiguration      : Turning off sentry
2024-03-30T14:23:31.122+02:00  INFO 15764 --- [           main] io.undertow                              : starting server: Undertow - 2.3.6.Final
2024-03-30T14:23:31.131+02:00  INFO 15764 --- [           main] org.xnio                                 : XNIO version 3.8.8.Final
2024-03-30T14:23:31.137+02:00  INFO 15764 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.8.Final
2024-03-30T14:23:31.206+02:00  INFO 15764 --- [           main] org.jboss.threads                        : JBoss Threads version 3.5.0.Final
2024-03-30T14:23:31.259+02:00  INFO 15764 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 40010 (http)
2024-03-30T14:23:31.263+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : Started Launcher in 2.731 seconds (process running for 4.268)
2024-03-30T14:23:31.263+02:00  INFO 15764 --- [           main] lavalink.server.Launcher                 : Lavalink is ready to accept connections.
2024-03-30T14:23:31.525+02:00  INFO 15764 --- [  XNIO-1 task-2] io.undertow.servlet                      : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-30T14:23:31.525+02:00  INFO 15764 --- [  XNIO-1 task-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-03-30T14:23:31.526+02:00  INFO 15764 --- [  XNIO-1 task-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2024-03-30T14:23:31.544+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.HandshakeInterceptorImpl     : Incoming connection from /192.168.0.197:57807
2024-03-30T14:23:31.557+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : GET /v4/websocket, client=192.168.0.197
2024-03-30T14:23:31.598+02:00  INFO 15764 --- [  XNIO-1 task-2] lavalink.server.io.SocketServer          : Connection successfully established from shoukakubot/4.0.1 (https://github.com/shipgirlproject/Shoukaku.git)
2024-03-30T14:23:34.664+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : PATCH /v4/sessions/kqupney56n819t83/players/785107327413911592?noReplace=false, client=192.168.0.197, payload={"voice":{"token":"52e91378146380c3","endpoint":"bucharest146.discord.media:443","sessionId":"d3cfc1767ebe4c0675268460387c5a7e"}}
2024-03-30T14:23:34.971+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.player.AudioLoaderRestHandler   : Got request to load for identifier "ytsearch:skillet monster"
2024-03-30T14:23:35.783+02:00  INFO 15764 --- [  XNIO-1 task-2] lavalink.server.player.AudioLoader       : Loaded playlist Search results for: skillet monster
2024-03-30T14:23:35.794+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : GET /v4/loadtracks?identifier=ytsearch%3Askillet+monster, client=192.168.0.197
2024-03-30T14:23:35.813+02:00  WARN 15764 --- [back-1-thread-1] c.s.d.l.s.y.YoutubeAccessTokenTracker    : YouTube auth tokens can't be retrieved because email and password is not set in YoutubeAudioSourceManager, age restricted videos will throw exceptions.
2024-03-30T14:23:35.813+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : PATCH /v4/sessions/kqupney56n819t83/players/785107327413911592?noReplace=false, client=192.168.0.197, payload={"encodedTrack":"QAAAwAMAIlNraWxsZXQgLSBNb25zdGVyIChPZmZpY2lhbCBWaWRlbykAEEF0bGFudGljIFJlY29yZHMAAAAAAALaeAALMW1qbE1fUm5zVkUAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xbWpsTV9SbnNWRQEAMGh0dHBzOi8vaS55dGltZy5jb20vdmkvMW1qbE1fUm5zVkUvbXFkZWZhdWx0LmpwZwAAB3lvdXR1YmUAAAAAAAAAAA=="}
2024-03-30T14:23:36.477+02:00  INFO 15764 --- [back-1-thread-1] c.s.d.l.s.y.YoutubeAccessTokenTracker    : Updating YouTube visitor id (current is null).
2024-03-30T14:23:36.726+02:00  INFO 15764 --- [back-1-thread-1] c.s.d.l.s.y.YoutubeAccessTokenTracker    : Updating YouTube visitor id succeeded, new one is CgttTnEyX0I2dXhYQSjGiKCwBjIKCgJSVRIEGgAgWjoKIJ6o1O7hiIGEZg%3D%3D, next update will be after 600 seconds.
2024-03-30T14:23:36.878+02:00  INFO 15764 --- [  XNIO-1 task-3] l.server.io.RequestLoggingFilter         : PATCH /v4/sessions/kqupney56n819t83/players/785107327413911592?noReplace=false, client=192.168.0.197, payload={"paused":true}
2024-03-30T14:23:36.881+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : DELETE /v4/sessions/kqupney56n819t83/players/785107327413911592, client=192.168.0.197
2024-03-30T14:23:36.883+02:00  INFO 15764 --- [  XNIO-1 task-2] l.server.io.RequestLoggingFilter         : DELETE /v4/sessions/kqupney56n819t83/players/785107327413911592, client=192.168.0.197
"kazagumo": "3.0.3"
"shoukaku": "4.0.1"
KazagumoTrack {
      raw: [Object],
      resolvedBySource: false,
      kazagumo: undefined,
      track: 'QAAAwAMAIlNraWxsZXQgLSBNb25zdGVyIChPZmZpY2lhbCBWaWRlbykAEEF0bGFudGljIFJlY29yZHMAAAAAAALaeAALMW1qbE1fUm5zVkUAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xbWpsTV9SbnNWRQEAMGh0dHBzOi8vaS55dGltZy5jb20vdmkvMW1qbE1fUm5zVkUvbXFkZWZhdWx0LmpwZwAAB3lvdXR1YmUAAAAAAAAAAA==',
      sourceName: 'youtube',
      title: 'Skillet - Monster (Official Video)',
      uri: 'https://www.youtube.com/watch?v=1mjlM_RnsVE',
      identifier: '1mjlM_RnsVE',
      isSeekable: true,
      isStream: false,
      author: 'Atlantic Records',
      length: 187000,
      thumbnail: 'https://img.youtube.com/vi/1mjlM_RnsVE/hqdefault.jpg',
      realUri: 'https://www.youtube.com/watch?v=1mjlM_RnsVE',
      requester: [User]
    },
{
  op: 'event',
  type: 'TrackExceptionEvent',
  guildId: '785107327413911592',
  track: {
    encoded: 'QAAAwAMAIlNraWxsZXQgLSBNb25zdGVyIChPZmZpY2lhbCBWaWRlbykAEEF0bGFudGljIFJlY29yZHMAAAAAAALaeAALMW1qbE1fUm5zVkUAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0xbWpsTV9SbnNWRQEAMGh0dHBzOi8vaS55dGltZy5jb20vdmkvMW1qbE1fUm5zVkUvbXFkZWZhdWx0LmpwZwAAB3lvdXR1YmUAAAAAAAAAAA==',
    info: {
      identifier: '1mjlM_RnsVE',
      isSeekable: true,
      author: 'Atlantic Records',
      length: 187000,
      isStream: false,
      position: 0,
      title: 'Skillet - Monster (Official Video)',
      uri: 'https://www.youtube.com/watch?v=1mjlM_RnsVE',
      sourceName: 'youtube',
      artworkUrl: 'https://i.ytimg.com/vi/1mjlM_RnsVE/mqdefault.jpg',
      isrc: null
    },
    pluginInfo: {},
    userData: {}
  },
  exception: {
    message: "Video returned by YouTube isn't what was requested",
    severity: 'common',
    cause: 'java.lang.IllegalStateException: {"responseContext":{"serviceTrackingParams":[{"service":"GFEEDBACK","params":[{"key":"is_alc_surface","value":"false"},{"key":"is_viewed_live","value":"False"},{"key":"ipcc","value":"0"},{"key":"logged_in","value":"0"},{"key":"e","value":"23946420,23966208,23983296,23998056,24004644,24036948,24077241,24078649,24080738,24094147,24108448,24117491,24120819,24132305,24135310,24143331,24166867,24181174,24187377,24230811,24232551,24241378,24265964,24267186,24290971,24377598,24397985,24421104,24451319,24457333,24458317,24458324,24458329,24458684,24459435,24468724,24506784,24515423,24522874,24524098,24542367,24548627,24548629,24556101,24560416,24585133,24585737,39325978,39326127,51003636,51009781,51012659,51014091,51016856,51017346,51019626,51020570,51025415,51027870,51030101,51033399,51033765,51037342,51037351,51037540,51042259,51043774,51048489,51050361,51053689,51057848,51057853,51060353,51064835,51068313,51068632,51069269,51074183,51076170,51079239,51079305,51080128,51082236,51083232,51084277,51084292,51089175,51089441,51089841,51092661,51094175,51094197,51094200,51094205,51094720,51095478,51096646,51096989,51099412,51101454,51101465,51103518,51103858,51105797,51105868,51106995,51107338,51108006,51108620,51108975,51110160,51111738,51112401,51113658,51113663,51115184,51116067,51117319,51117353,51118293,51118932,51120109,51123077,51123540,51124104,51125857,51125903,51127136,51128585,51129377,51131840,51132393,51134506,51134883,51134989,51135346,51135652,51136217,51136785,51136843,51137185,51137671,51138687,51138923,51139378,51139565,51139764,51140749,51140807,51141541,51141767,51141779,51141800,51142567,51143691,51143864,51146285,51146435,51146962,51147093,51148974,51149471,51150783,51152050,51152207,51152444,51152502,51152517,51154012"}]},{"service":"CSI","params":[{"key":"c","value":"ANDROID"},{"key":"cver","value":"18.06.35"},{"key":"yt_li","value":"0"},{"key":"GetPlayer_rid","value":"0xb2d6b46aa8ec82c3"}]},{"service":"GUIDED_HELP","params":[{"key":"logged_in","value":"0"}]},{"service":"ECATCHER","params":[{"key":"client.version","value":"18.06"},{"key":"client.name","value":"ANDROID"}]},{"service":"LISTNR","params":[{"key":"e","value":"24181216,51150783,51108006,51152444,24290971,51048489,51064835,24458329,51096989,24515423,51101454,51136843,51053689,51102763,51134506,51103518,51111738,51136217,51116067,51074183,51142567,51146435,24250570,51132393,24033252,51104424,24143331,51137671,24254870,24024517,51068632,51117319,51144986,24459435,51117353,51128585,24377598,51020570,24117491,51140749,24036948,51140807,24548627,51112401,51143691,51125903,39325978,24421104,51134883,51014091,24195115,51146962,51025415,51104418,51074286,24274141,51030735,51003636,24181174,51104447,51079239,51096646,51124104,51012659,51033399,51037540,51089441,51139378,51139565,51101465,24267186,51118293,51069269,51080128,24135310,51033765,51137185,51131840,51060353,51106995,24286257,39326127,51009998,51141779,24166867,51019626,24524098,24560416,24230811,51152050,24556101,51125857,24232551,51016856,24195012,24458324,51043774,24506784,24522874,24410415,24458684,51092661,24397985,51027870,51050361,24458317,51105868,24542367,24548629,51152207,51154012,51152502,24220751,51110160,51095478,24451319,51009781,24585737,24585133,51118932,51123540,51136785,51135346"}]}],"maxAgeSeconds":0},"playabilityStatus":{"status":"OK","playableInEmbed":true,"miniplayer":{"miniplayerRenderer":{"playbackMode":"PLAYBACK_MODE_ALLOW"}},"contextParams":"Q0FFU0FnZ0M="},"streamingData":{"expiresInSeconds":"21540","formats":[{"itag":18,"url":"https://rr1---sn-gxuo03g-ig3e.googlevideo.com/videoplayback?expire=1711823014&ei=RgQIZsXgMfyxi9oPvdio-AU&ip=62.133.60.10&id=o-ADaSFhnFbDjYxVExfyr5l6QjbTMNkFKk4CDn6oyG1SWO&itag=18&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=T2&mm=31%2C29&mn=sn-gxuo03g-ig3e%2Csn-5hne6nzy&ms=au%2Crdu&mv=m&mvi=1&pl=26&initcwndbps=882500&vprv=1&svpuc=1&mime=video%2Fmp4&cnr=14&ratebypass=yes&dur=300.071&lmt=1711576327765252&mt=1711801252&fvip=5&fexp=51141541&c=ANDROID&txp=5538434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Ccnr%2Cratebypass%2Cdur%2Clmt&sig=AJfQdSswRQIhANyQMjEjynalKBVYljXU_PXWEj_1SLRFnlkFKkI_TPFmAiB872XReHHhITrJRbpL5WH8tCl3yrh0zI3t8nF4tL2eKQ%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ALClDIEwRQIhAMrGUeEs0YmpyVpVtRLPYWdRTAEs-hJim0FNwgO6B0m9AiBoFqb3eDT6lK8C4cEWPMVKYDddgqPBn9iXMx8DKdMHNQ%3D%3D","mimeType":"video/mp4; codecs=\\"avc1.42001E, mp4a.40.2\\"","bitrate":137681,"width":640,"height":358,"lastModified":"1711576327765252","quality":"medium","fps":6,"qualityLabel":"360p","projectionType":"RECTANGULAR","audioQuality":"AUDIO_QUALITY_LOW","approxDurationMs":"300071","audioSampleRate":"44100","audioChannels":2}],"adaptiveFormats":[{"itag":134,"url":"https://rr1---sn-gxuo03g-ig3e.googlevideo.com/videoplayback?expire=1711823014&ei=RgQIZsXgMfyxi9oPvdio-AU&ip=62.133.60.10&id=o-ADaSFhnFbDjYxVExfyr5l6QjbTMNkFKk4CDn6oyG1SWO&itag=134&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=T2&mm=31%2C29&mn=sn-gxuo03g-ig3e%2Csn-5hne6nzy&ms=au%2Crdu&mv=m&mvi=1&pl=26&initcwndbps=882500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=310413&dur=300.000&lmt=1711576325179364&mt=1711801252&fvip=5&keepalive=yes&fexp=51141541&c=ANDROID&txp=5532434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgeYsRu5loeIKu1t5SyTkaHP49cS3YqPxjqcLqDz2oP94CIQCQOi-bSNaBRDhTEzsoliHAjARsSZktKAjVv7e6yUOLTg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ALClDIEwRQIhAMrGUeEs0YmpyVpVtRLPYWdRTAEs-hJim0FNwgO6B0m9AiBoFqb3eDT6lK8C4cEWPMVKYDddgqPBn9iXMx8DKdMHNQ%3D%3D","mimeType":"video/mp4; codecs=\\"avc1.4d4016\\"","bitrate":9667,"width":640,"height":358,"initRange":{"start":"0","end":"740"},"indexRange":{"start":"741","end":"1288"},"lastModified":"1711576325179364","contentLength":"310413","quality":"medium","fps":6,"qualityLabel":"360p","projectionType":"RECTANGULAR","averageBitrate":8277,"highReplication":true,"approxDurationMs":"300000"},{"itag":243,"url":"https://rr1---sn-gxuo03g-ig3e.googlevideo.com/videoplayback?expire=1711823014&ei=RgQIZsXgMfyxi9oPvdio-AU&ip=62.133.60.10&id=o-ADaSFhnFbDjYxVExfyr5l6QjbTMNkFKk4CDn6oyG1SWO&itag=243&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=T2&mm=31%2C29&mn=sn-gxuo03g-ig3e%2Csn-5hne6nzy&ms=au%2Crdu&mv=m&mvi=1&pl=26&initcwndbps=882500&vprv=1&svpuc=1&mime=video%2Fwebm&gir=yes&clen=620700&dur=299.999&lmt=1711576309861254&mt=1711801252&fvip=5&keepalive=yes&fexp=51141541&c=ANDROID&txp=5537434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAO9KBt1WDs4Lupt-x2fgxwfftEzRXHcEx597fiijv9mzAiEAgZkLK-LZAdIFnJzBAIj2Rlfduu46qqEUcJpngzMdmPI%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ALClDIEwRQIhAMrGUeEs0YmpyVpVtRLPYWdRTAEs-hJim0FNwgO6B0m9AiBoFqb3eDT6lK8C4cEWPMVKYDddgqPBn9iXMx8DKdMHNQ%3D%3D","mimeType":"video/webm; codecs=\\"vp9\\"","bitrate":19045,"width":640,"height":358,"initRange":{"start":"0","end":"218"},"indexRange":{"start":"219","end":"939"},"lastModified":"1711576309861254","contentLength":"620700","quality":"medium","fps":6,"qualityLabel":"360p","projectionType":"RECTANGULAR","averageBitrate":16552,"colorInfo":{"primaries":"COLOR_PRIMARIES_BT709","transferCharacteristics":"COLOR_TRANSFER_CHARACTERISTICS_BT709","matrixCoefficients":"COLOR_MATRIX_COEFFICIENTS_BT709"},"approxDurationMs":"299999"},{"itag":396,"url":"https://rr1---sn-gxuo03g-ig3e.googlevideo.com/videoplayback?expire=1711823014&ei=RgQIZsXgMfyxi9oPvdio-AU&ip=62.133.60.10&id=o-ADaSFhnFbDjYxVExfyr5l6QjbTMNkFKk4CDn6oyG1SWO&itag=396&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=T2&mm=31%2C29&mn=sn-gxuo03g-ig3e%2Csn-5hne6nzy&ms=au%2Crdu&mv=m&mvi=1&pl=26&initcwndbps=882500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=563729&dur=300.000&lmt=1711576399164396&mt=1711801252&fvip=5&keepalive=yes&fexp=51141541&c=ANDROID&txp=5537434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRAIgfsJpvL7FdtHzGqXAOl1X735bv8hFp3vqR3gCnzuQK3QCIBU2BRHqXBRRPcorkjMIbKG1yxhM34g2v0FuEO_QIlEO&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ALClDIEwRQIhAMrGUeEs0YmpyVpVtRLPYWdRTAEs-hJim0FNwgO6B0m9AiBoFqb3eDT6lK8C4cEWPMVKYDddgqPBn9iXMx8DKdMHNQ%3D%3D","mimeType":"video/mp4; codecs=\\"av01.0.01M.08\\"","bitrate":17204,"width":640,"height":358,"initRange":{"start":"0","end":"699"},"indexRange":{"start":"700","end":"1247"},"lastModified":"1711576399164396","contentLength":"563729","quality":"medium","fps":6,"qualityLabel":"360p","projectionType":"RECTANGULAR","averageBitrate":15032,"colorInfo":{"primaries":"COLOR_PRIMARIES_BT709","transferCharacteristics":"COLOR_TRANSFER_CHARACTERISTICS_BT709","matrixCoefficients":"COLOR_MATRIX_COEFFICIENTS_BT709"},"approxDurationMs":"300000"},{"itag":133,"url":"https://rr1---sn-gxuo03g-ig3e.googlevideo.com/videoplayback?expire=1711823014&ei=RgQIZsXgMfyxi9oPvdio-AU&ip=62.133.60.10&id=o-ADaSFhnFbDjYxVExfyr5l6QjbTMNkFKk4CDn6oyG1SWO&itag=133&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=T2&mm=31%2C29&mn=sn-gxuo03g-ig3e%2Csn-5hne6nzy&ms=au%2Crdu&mv=m&mvi=1&pl=26&initcwndbps=882500&vprv=1&svpuc=1&mime=video%2Fmp4&gir=yes&clen=208905&dur=300.000&lmt=1711576334264359&mt=1711801252&fvip=5&keepalive=yes&fexp=51141541&c=ANDROID&txp=5532434&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cvprv%2Csvpuc%2Cmime%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIgHSJrPn7eACKEELa-KX-eSVREZJ09lKyFZUQsz85LJZACIQCp7FtO1Y9Xje_es4pva-nd26-p7-O9UjgwPkg-8t2e7A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ALClDIEwRQIhAMrGUeEs0YmpyVpVtRLPYWdRTAEs-hJim0FNwgO6B0m9AiBoFqb3eDT6lK8C4cEWPMVKYDddgqPBn9iXMx8DKdMHNQ%3D%3D","mimeType":"video/mp4; codecs=\\"avc1.4d4015\\"","bitrate":7003,"width":426,"height":238,"initRange":{"start":"0","end":"740"},"indexRange":{"start":"741","end":"1288"},"lastModified":'... 41507 more characters
  }
}

When trying to turn on music from Spotify, playlist 750 tracks this problem repeats cyclically, and the tracks are not played back

"kazagumo-spotify": "^2.0.1",

Using vpn, proxy has no effect on causing problem

Found the same problem in lavalink issues

[BUG] Player Error

Player not plays
When we play a song for first time it plays. And the second time it says added to queue but doesn't play. All nodes are connected. It has all required perms and intents.

Expected behavior
Music should be played and now playing message should be sent. But it doesn't happen it just says added to queue.

Screenshots
None

Version:

  • node.js - 19
  • Kazagumo - latest

Incorrect player volume

The problem occurs when you get the player volume when it is 0.
In this case you get 1

// player volume = 0
console.log(player.volume); // 1

Add seek player

Why is that seek is removed on v1.0.14 it had seekTo, Add seek again its a necessary features

[BUG] Kazagumo.search() only gets 320 tracks from a playlist

Describe the bug
I don't know if this is normal but if I take a playlist which has like 1K tracks (from YouTube) and pass it to <Kazagumo>.search() it only gets the first 320 tracks from it.

To Reproduce
Steps to reproduce the behavior:

  1. Get a playlist which has more than 320 tracks from YouTube, I used this one (https://www.youtube.com/watch?v=JGwWNGJdvx8&list=PLhsz9CILh357zA1yMT-K5T9ZTNEU6Fl6n)
  2. Pass it to <Kazagumo>.search()
  3. result.length is 320 (assumed that i stored the values of <Kazagumo>.search() in a variable called result)

Expected behavior
I think it should've added all of the tracks? as adding individual tracks after those 320 tracks work just fine.

Screenshots
image

Version:

  • node.js: [v19.4.0]
  • Kazagumo: [v2.3.2]

Filters

Add filter more easy to setup player.setRotation({ rotationHz: .2 }) like this this is on 8d filter
and add example on docs to how to setup it

Update shoukaku

Is your feature request related to a problem? Please describe.
Since Shoukaku is adopting Lavalink v4 API, which is deprecating support for v3 API, I think you should update the library to use v4 API to prevent any possible disruption in the future

Describe the solution you'd like
Use latest shoukaku version and make adjustments to make this library fully compatible with v4 API

Describe alternatives you've considered
I haven't tried any alternatives

Additional context
No

[BUG] current.setKazagumo is not a function

TypeError: current.setKazagumo is not a function
1|real     |     at MorePlayer.<anonymous> (/home/ubuntu/Data/Real/node_modules/kazagumo/dist/Managers/KazagumoPlayer.js:223:21)
1|real     |     at Generator.next (<anonymous>)
1|real     |     at /home/ubuntu/Data/Real/node_modules/kazagumo/dist/Managers/KazagumoPlayer.js:8:71
1|real     |     at new Promise (<anonymous>)
1|real     |     at __awaiter (/home/ubuntu/Data/Real/node_modules/kazagumo/dist/Managers/KazagumoPlayer.js:4:12)
1|real     |     at MorePlayer.play (/home/ubuntu/Data/Real/node_modules/kazagumo/dist/Managers/KazagumoPlayer.js:204:16)
1|real     |     at Player.<anonymous> (/home/ubuntu/Data/Real/node_modules/kazagumo/dist/Managers/KazagumoPlayer.js:90:25)
1|real     |     at Player.emit (node:events:513:28)
1|real     |     at Player.onPlayerEvent (/home/ubuntu/Data/Real/node_modules/shoukaku/dist/src/guild/Player.js:346:22)
1|real     |     at Player.onLavalinkMessage (/home/ubuntu/Data/Real/node_modules/shoukaku/dist/src/guild/Player.js:329:18)

When a track end and player is not destroyed but next song is not playable as it is mentioned

Version:

  • node.js: [e.g. 16.19.0]
  • Kazagumo [e.g. 1.0.2]

New options request

Add 24/7 system (on node ready it connect channels if player get destoryed it join user give channel) i already make this but i have some problem when i connect 2 nodes to bot and go to create player on 24/7 system it will connect both nodes some times after that when i play some thing it not give any audio out put

[BUG] sharding

This package is not supported for sharding fix it immediately

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.