import asyncio import discord import yt_dlp from discord.ext import commands from youtubesearchpython import VideosSearch # Suppress noise about console usage from yt-dlp yt_dlp.utils.bug_reports_message = lambda: '' class Play(commands.Cog): def __init__(self, bot): self.bot = bot self.ydl_opts = { 'format': 'bestaudio/best', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }], 'noplaylist': True, 'quiet': True, 'no_warnings': True, 'default_search': 'auto', 'source_address': '0.0.0.0', } async def play_audio(self, ctx, vc, url, title): try: with yt_dlp.YoutubeDL(self.ydl_opts) as ydl: info = await self.bot.loop.run_in_executor( None, lambda: ydl.extract_info(url, download=False) ) if 'entries' in info: info = info['entries'][0] url2 = info['url'] ffmpeg_options = { 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn' } def after_playing(error): if error: print(f'Player error: {error}') coro = vc.disconnect() fut = asyncio.run_coroutine_threadsafe(coro, self.bot.loop) try: fut.result() except Exception as e: print(f'Error disconnecting: {e}') source = discord.FFmpegPCMAudio(url2, **ffmpeg_options) vc.play(source, after=after_playing) await ctx.followup.send(f"gra: {title}") except Exception as e: await ctx.followup.send(f"Wystąpił błąd podczas odtwarzania: {str(e)}") @commands.slash_command(name="grajcuj", description="grajcuj melodyje") async def play(self, ctx, *, search: str): await ctx.defer() if not (ctx.author.voice and ctx.author.voice.channel): await ctx.followup.send("nie jesteś w kanale głosowym") return channel = ctx.author.voice.channel vc = ctx.voice_client or await channel.connect() if vc.channel != channel: await vc.move_to(channel) # Search for the video videos_search = VideosSearch(search, limit=1) result = videos_search.result() if not result['result']: await ctx.followup.send("nie znaleziono wideo dla twojego wyszukiwania.", ephemeral=True) return video = result['result'][0] title = video['title'] url = video['link'] # Play the audio directly if vc.is_playing() or vc.is_paused(): vc.stop() await self.play_audio(ctx, vc, url, title) def setup(bot): bot.add_cog(Play(bot))