From 9cd0f5bf8a3716cc9832be2e8c568158072fba4e Mon Sep 17 00:00:00 2001 From: rzmk Date: Fri, 21 May 2021 01:44:57 -0400 Subject: [PATCH] music edited requirements removed something testing no music let's try token token pls music working! testing remove fix added requirements --- .gitignore | 3 +- bot.py | 3 ++ cogs/musicCog.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 11 ++++- 4 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 cogs/musicCog.py diff --git a/.gitignore b/.gitignore index 7240761..62bf56b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env env -__pycache__ \ No newline at end of file +__pycache__ +song.mp3 \ No newline at end of file diff --git a/bot.py b/bot.py index 966acfc..fa5776c 100644 --- a/bot.py +++ b/bot.py @@ -1,6 +1,9 @@ import os import discord from discord.ext import commands +from dotenv import load_dotenv + +load_dotenv() TOKEN = os.environ.get("TOKEN") client = commands.Bot(command_prefix= 'd!') diff --git a/cogs/musicCog.py b/cogs/musicCog.py new file mode 100644 index 0000000..74198f1 --- /dev/null +++ b/cogs/musicCog.py @@ -0,0 +1,120 @@ +import asyncio +import discord +from discord.ext import commands +import youtube_dl +import os + +ffmpeg_options = { + 'options': '-vn' +} + +ytdl_format_options = { + 'format': 'bestaudio/best', + 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', + 'restrictfilenames': True, + 'noplaylist': True, + 'nocheckcertificate': True, + 'ignoreerrors': False, + 'logtostderr': False, + 'quiet': True, + 'no_warnings': True, + 'default_search': 'auto', + 'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes +} + +ytdl = youtube_dl.YoutubeDL(ytdl_format_options) + +class YTDLSource(discord.PCMVolumeTransformer): + def __init__(self, source, *, data, volume=0.5): + super().__init__(source, volume) + + self.data = data + + self.title = data.get('title') + self.url = data.get('url') + + @classmethod + async def from_url(cls, url, *, loop=None, stream=False): + loop = loop or asyncio.get_event_loop() + data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream)) + + if 'entries' in data: + # take first item from a playlist + data = data['entries'][0] + + filename = data['url'] if stream else ytdl.prepare_filename(data) + return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) + +class MusicCog(commands.Cog): + + def __init__(self, client): + self.client = client + + # Commands + + @commands.command() + async def play(self, ctx, *, url): + """Streams from a url (same as yt, but doesn't predownload)""" + try: + voiceChannel = discord.utils.get(ctx.guild.voice_channels, guild=ctx.guild) + await voiceChannel.connect() + except: + pass + async with ctx.typing(): + player = await YTDLSource.from_url(url, loop=self.client.loop, stream=True) + ctx.voice_client.play(player, after=lambda e: print(f'Player error: {e}') if e else None) + + await ctx.send(f'Now playing: {player.title}') + + @commands.command() + async def leave(self, ctx): + voice = ctx.voice_client + if voice.is_connected(): + await voice.disconnect() + else: + await ctx.send("The bot is not connected to a voice channel.") + + @commands.command() + async def volume(self, ctx, volume: int): + """Changes the player's volume""" + + if ctx.voice_client is None: + return await ctx.send("Not connected to a voice channel.") + + ctx.voice_client.source.volume = volume / 100 + await ctx.send(f"Changed volume to {volume}%") + + @commands.command() + async def pause(self, ctx): + voice = ctx.voice_client + if voice.is_playing(): + voice.pause() + else: + await ctx.send("Currently no audio is playing.") + + @commands.command() + async def resume(self, ctx): + voice = ctx.voice_client + if voice.is_paused(): + voice.resume() + else: + await ctx.send("The audio is not paused.") + + @commands.command() + async def stop(self, ctx): + """Stops and disconnects the bot from voice""" + + voice = ctx.voice_client + voice.stop() + + '''@commands.command(aliases=['join']) + async def connect(self, ctx): + channel = ctx.author.voice.channel + await channel.connect() + + @commands.command(aliases=['dc','leave']) + async def disconnect(self, ctx): + await ctx.voice_client.disconnect()''' + +def setup(client): + client.add_cog(MusicCog(client)) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 3700a09..e3cc27d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,16 @@ -aiohttp==3.7.4 +aiohttp==3.7.4.post0 async-timeout==3.0.1 attrs==21.2.0 +cffi==1.14.5 chardet==4.0.0 +discord==1.0.1 discord.py==1.7.2 idna==3.1 multidict==5.1.0 +pycparser==2.20 +PyNaCl==1.4.0 +python-dotenv==0.17.1 +six==1.16.0 typing-extensions==3.10.0.0 -yarl==1.6.3 \ No newline at end of file +yarl==1.6.3 +youtube-dl==2021.5.16