Xalwer

Untitled

Jan 6th, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.60 KB | Source Code | 0 0
  1. import asyncio
  2. import disnake
  3. from disnake.ext import commands,tasks
  4.  
  5. from yt_dlp import YoutubeDL
  6.  
  7. FFMPEG_OPTIONS = {
  8.     'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5',
  9.     'options': '-vn'
  10. }
  11.  
  12. class Music(commands.Cog):
  13.     def __init__(self, bot: commands.Bot):
  14.         self.bot = bot
  15.  
  16.         self.YDL_OPTIONS = {
  17.             "format": "bestaudio/best",
  18.             "outtmpl": "%(extractor)s-%(id)s-%(title)s.%(ext)s",
  19.             "restrictfilenames": True,
  20.             "noplaylist": True,
  21.             "nocheckcertificate": True,
  22.             "ignoreerrors": False,
  23.             "logtostderr": False,
  24.             "quiet": True,
  25.             "no_warnings": True,
  26.             "default_search": "auto",
  27.             "source_address": "0.0.0.0",  # bind to ipv4 since ipv6 addresses cause issues sometimes
  28.         }
  29.         self.FFMPEG_OPTIONS = {
  30.             'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5',
  31.             'options': '-vn'
  32.         }
  33.         self.vc = None
  34.         self.owner = None
  35.         self.playlisturl = []
  36.  
  37.  
  38.  
  39.     def URLconvert(self,url):
  40.         with YoutubeDL(self.YDL_OPTIONS) as ydl:
  41.             if 'https://www.youtube.com' not in url:
  42.                 info = ydl.extract_info('ytsearch:%s' % url,download=False)['entries'][0]
  43.             else:
  44.                 info = ydl.extract_info(url, download=False)
  45.         return (info['url'],info['original_url'])
  46.  
  47.     def after(self,err):
  48.         #if any(self.playlisturl) == False:
  49.         CheckSound = tasks.loop(seconds=1,count=60)(self.SoundLoop)
  50.         CheckSound.start()
  51.  
  52.  
  53.         if True:
  54.  
  55.             URL = self.playlisturl.pop(0)
  56.  
  57.             link = self.URLconvert(url=URL)[0]
  58.  
  59.             print(link, '\n')
  60.  
  61.             FFmpeg = disnake.FFmpegPCMAudio(link, **self.FFMPEG_OPTIONS,)
  62.             FFmpeg.read()
  63.  
  64.             self.vc.play(FFmpeg,after=self.after)
  65.  
  66.  
  67.  
  68.     async def SoundLoop(self):
  69.         #if any(self.playlisturl) == True:
  70.         #    print(2)
  71.         #    return
  72.         #if self.SoundLoop.current_loop == self.SoundLoop.count - 1:
  73.         #    print(1)
  74.         print(1)
  75.  
  76.  
  77.     @commands.slash_command(name='play', description='')
  78.     async def play(self, inter: disnake.ApplicationCommandInteraction,
  79.                    url: str = commands.Param(name='url-or-name',description='Введите название трека или его URL-адрес(YouTube).')):
  80.  
  81.         try:
  82.             channelX = inter.author.voice.channel
  83.         except:
  84.             embed_0 = disnake.Embed(title="error",
  85.                                     description="Чтобы использовать данную команду, нужно находится в голосовом канале.",
  86.                                     colour=0xCB2C31, )
  87.             await inter.send(embed=embed_0, ephemeral=True)
  88.             return
  89.  
  90.         if channelX.id == 892458918775758858:
  91.             embed_0 = disnake.Embed(title="error",
  92.                                     description="Перейдите в другой голосовой канал.",
  93.                                     colour=0xCB2C31, )
  94.             await inter.send(embed=embed_0, ephemeral=True)
  95.  
  96.         # проверка на заказчика
  97.         if self.owner != None:
  98.             if self.owner != inter.author.id:
  99.                 embed_0 = disnake.Embed(title="error",
  100.                                         description="Бота уже заказал другой пользователь.",
  101.                                         colour=0xCB2C31, )
  102.                 await inter.send(embed=embed_0, ephemeral=True)
  103.                 return
  104.  
  105.  
  106.  
  107.  
  108.         try:
  109.             if (self.vc.is_playing() is True) or (self.vc.is_paused() is True):
  110.                 self.vc.stop()
  111.         except:
  112.             pass
  113.  
  114.  
  115.         try:
  116.             self.vc = await channelX.connect()
  117.         except:
  118.             pass
  119.  
  120.  
  121.         link = self.URLconvert(url=url)[0]
  122.  
  123.         print(link,'\n')
  124.  
  125.         FFmpeg = disnake.FFmpegPCMAudio(link,**self.FFMPEG_OPTIONS)
  126.         FFmpeg.read()
  127.  
  128.         self.vc.play(FFmpeg,after=self.after)
  129.  
  130.  
  131.     @commands.slash_command(name='stop', description='')
  132.     async def stop(self,inter: disnake.ApplicationCommandInteraction):
  133.  
  134.         # проверка на заказчика
  135.         if self.owner != None:
  136.             if self.owner != inter.author.id:
  137.                 embed_0 = disnake.Embed(title="error",
  138.                                         description="Саундтрек может прервать только тот, кто его начал.",
  139.                                         colour=0xCB2C31, )
  140.                 await inter.send(embed=embed_0, ephemeral=True)
  141.                 return
  142.  
  143.         try:
  144.             self.vc.stop()
  145.         except:
  146.             pass
  147.         await self.vc.disconnect()
  148.         self.owner = None
  149.         self.playlisturl = []
  150.  
  151.     @commands.slash_command(name='playlist', description='Добавить или удалить трек из плейлиста.')
  152.     async def playlist(self, inter: disnake.ApplicationCommandInteraction,
  153.                        action: str = commands.Param(default='add',name='action',choices=['add','remove'],description='Выберите действие.'),
  154.                        url: str = commands.Param(name='url-or-name',description='Введите название трека или его URL-адрес(YouTube).')):
  155.         if action == 'add':
  156.             self.playlisturl.append(self.URLconvert(url=url)[1])
  157.  
  158.  
  159.  
  160. def setup(bot: commands.Bot):
  161.     bot.add_cog(Music(bot))
Advertisement
Add Comment
Please, Sign In to add comment