{"id":14983521,"url":"https://github.com/parasop/poru","last_synced_at":"2025-05-16T12:10:33.864Z","repository":{"id":37398784,"uuid":"504802159","full_name":"parasop/poru","owner":"parasop","description":"A stable and powerful Lavalink client with some best features","archived":false,"fork":false,"pushed_at":"2024-12-19T14:31:35.000Z","size":4273,"stargazers_count":87,"open_issues_count":1,"forks_count":57,"subscribers_count":2,"default_branch":"v5","last_synced_at":"2025-04-03T09:08:01.174Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/parasop.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"parasdev","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2022-06-18T09:42:34.000Z","updated_at":"2025-03-10T16:33:41.000Z","dependencies_parsed_at":"2024-02-26T21:28:38.418Z","dependency_job_id":"a5d0b1d0-0e54-4ffb-b1f5-d76cdf6f57ac","html_url":"https://github.com/parasop/poru","commit_stats":{"total_commits":399,"total_committers":22,"mean_commits":"18.136363636363637","dds":"0.43107769423558895","last_synced_commit":"77c8ef828c3c6059b89f8ffc0af5316b5a58062e"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parasop%2Fporu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parasop%2Fporu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parasop%2Fporu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/parasop%2Fporu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/parasop","download_url":"https://codeload.github.com/parasop/poru/tar.gz/refs/heads/v5","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248519542,"owners_count":21117761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T14:07:19.705Z","updated_at":"2025-04-12T06:14:20.464Z","avatar_url":"https://github.com/parasop.png","language":"TypeScript","funding_links":["https://ko-fi.com/parasdev"],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/parasop/poru/v5/assets/poru.png\" alt=\"Poru Logo\" height=\"340\" width=\"340\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://discord.gg/Zmmc47Nrh8\"\u003e\n    \u003cimg src=\"https://img.shields.io/discord/567705326774779944?style=flat-square\" alt=\"Discord\"/\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/poru\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/poru?style=flat-square\" alt=\"npm\"/\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/parasop/poru?style=flat-square\" alt=\"GitHub Stars\"/\u003e\n  \u003cimg src=\"https://img.shields.io/github/issues-raw/parasop/poru?style=flat-square\" alt=\"GitHub issues\"/\u003e\n  \u003cimg src=\"https://img.shields.io/snyk/vulnerabilities/npm/poru?style=flat-square\" alt=\"Snyk Vulnerabilities for npm package\"/\u003e\n  \u003cimg src=\"https://img.shields.io/npm/l/poru?style=flat-square\" alt=\"NPM\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  note: this version supports only Lavalink v4 or above\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://nodei.co/npm/poru/\"\u003e\n    \u003cimg src=\"https://nodei.co/npm/poru.png?downloads=true\u0026downloadRank=true\u0026stars=true\" alt=\"Poru NPM Package\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n## Table of contents\n\n- [Documentation](https://poru.js.org)\n- [Installation](#installation)\n- [About](#about)\n- [Implementation Repo](#implementation-repo)\n- [Basic Usage](#example-usage-basic-bot)\n- [Plugins List](#plugins-list)\n- [Help \u0026 Support](#need-help)\n- [Example Bot](https://github.com/parasop/poru-example)\n\n## Installation\n\n```bash\n# Using npm\nnpm install poru\n\n# Using yarn\nyarn add poru\n```\n\n## About\n\nTo use, you need a configured [Lavalink](https://github.com/lavalink-devs/Lavalink) instance.\n\n- Stable client\n- Support TypeScript\n- 100% Compatible with Lavalink\n- Object-oriented\n- 100% Customizable\n- Easy to setup\n- Inbuilt Queue System\n- Inbuilt support for Spotify, Apple Music, and Deezer\n\n## Implementation Repo:\n\nNote: Send PR to add your repo here\n\n| URL | Features | Additional Information |\n|-----|----------|------------------------|\n| [Poru Music](https://github.com/parasop/poru-example) | Basic example | Works with the latest Discord.js version |\n| [The world machine](https://github.com/Reishimanfr/TWM-bot) | See GitHub repo for the full list | - |\n| [Lunox](https://github.com/adh319/Lunox) | Look over the repo for the full list of features | Simply powerful Discord Music Bot |\n\n## Example usage basic bot\n\n```javascript\nconst { Client, GatewayIntentBits } = require(\"discord.js\");\nconst { Poru } = require(\"poru\");\n\nconst nodes = [\n    {\n        name: \"local-node\",\n        host: \"localhost\",\n        port: 2333,\n        password: \"youshallnotpass\",\n    },\n];\n\nconst PoruOptions = {\n    library: \"discord.js\",\n    defaultPlatform: \"scsearch\",\n};\n\nconst client = new Client({\n    intents: [\n        GatewayIntentBits.Guilds,\n        GatewayIntentBits.GuildMessages,\n        GatewayIntentBits.GuildVoiceStates,\n        GatewayIntentBits.MessageContent,\n    ],\n});\n\nclient.poru = new Poru(client, nodes, PoruOptions);\n\nclient.poru.on(\"trackStart\", (player, track) =\u003e {\n    const channel = client.channels.cache.get(player.textChannel);\n    return channel.send(`Now playing \\`${track.info.title}\\``);\n});\n\nclient.on(\"ready\", () =\u003e {\n    console.log(\"Ready!\");\n    client.poru.init(client);\n});\n\nclient.on(\"interactionCreate\", async (interaction) =\u003e {\n    if (!interaction.isChatInputCommand()) return;\n    if (!interaction.member.voice.channel) {\n        return interaction.reply({\n            content: `Please connect with a voice channel `,\n            ephemeral: true,\n        });\n    }\n\n    const track = interaction.options.getString(\"track\");\n\n    const res = await client.poru.resolve({ query: track, source: \"scsearch\", requester: interaction.member });\n\n    if (res.loadType === \"error\") {\n        return interaction.reply(\"Failed to load track.\");\n    } else if (res.loadType === \"empty\") {\n        return interaction.reply(\"No source found!\");\n    }\n\n    // Create connection with Discord voice channel\n    const player = client.poru.createConnection({\n        guildId: interaction.guild.id,\n        voiceChannel: interaction.member.voice.channelId,\n        textChannel: interaction.channel.id,\n        deaf: true,\n    });\n\n    if (res.loadType === \"playlist\") {\n        for (const track of res.tracks) {\n            track.info.requester = interaction.user;\n            player.queue.add(track);\n        }\n\n        interaction.reply(\n            `${res.playlistInfo.name} has been loaded with ${res.tracks.length}`\n        );\n    } else {\n        const track = res.tracks[0];\n        track.info.requester = interaction.user;\n        player.queue.add(track);\n        interaction.reply(`Queued Track \\n \\`${track.info.title}\\``)\n    }\n\n    if (!player.isPlaying \u0026\u0026 player.isConnected) player.play();\n});\n\nclient.login(\"TOKEN\");\n```\n\n## Plugins list:\n\nNote: Open a PR to add your plugin here\n\n| Name | Link | Additional Description |\n|------|------|------------------------|\n| Poru Spotify | [poru-spotify](https://github.com/parasop/poru-spotify) | Plugin for integrating Spotify with Poru |\n| Poru Deezer | [poru-deezer](https://github.com/parasop/poru-deezer) | Plugin for integrating Deezer with Poru |\n| Poru Apple Music | [poru-applemusic](https://github.com/parasop/poru-applemusic) | Plugin for integrating Apple Music with Poru |\n\n## Need Help?\n\nFeel free to join our [Discord server](https://discord.gg/Zmmc47Nrh8). Give us suggestions and advice about errors and new features.\n\nWith ❤️ by [Paras](https://github.com/parasop).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparasop%2Fporu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fparasop%2Fporu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparasop%2Fporu/lists"}