async def timeout_handler(self): if len(self.guild.voice_client.channel.voice_states) == 1: await self.udisconnect() return sett = utils.guild_to_settings[self.guild] if sett.get('vc_timeout') == False: self.timer = utils.Timer(self.timeout_handler) # restart timer return if self.guild.voice_client.is_playing(): self.timer = utils.Timer(self.timeout_handler) # restart timer return self.timer = utils.Timer(self.timeout_handler) await self.udisconnect()
def __init__(self, bot, guild): self.bot = bot self.playlist = Playlist() self.current_song = None self.guild = guild sett = utils.guild_to_settings[guild] self._volume = sett.get('default_volume') self.timer = utils.Timer(self.timeout_handler)
async def play_song(self, song): """Plays a song object""" if self.playlist.loop != True: #let timer run thouh if looping self.timer.cancel() self.timer = utils.Timer(self.timeout_handler) if song.info.title == None: if song.host == linkutils.Sites.Spotify: conversion = self.search_youtube(await linkutils.convert_spotify(song.info.webpage_url)) song.info.webpage_url = conversion try: downloader = yt_dlp.YoutubeDL( {'format': 'bestaudio', 'title': True, "cookiefile": config.COOKIE_PATH}) r = downloader.extract_info( song.info.webpage_url, download=False) except: asyncio.wait(1) downloader = yt_dlp.YoutubeDL( {'title': True, "cookiefile": config.COOKIE_PATH}) r = downloader.extract_info( track, download=False) song.base_url = r.get('url') song.info.uploader = r.get('uploader') song.info.title = r.get('title') song.info.duration = r.get('duration') song.info.webpage_url = r.get('webpage_url') song.info.thumbnail = r.get('thumbnails')[0]['url'] self.playlist.add_name(song.info.title) self.current_song = song self.playlist.playhistory.append(self.current_song) self.guild.voice_client.play(discord.FFmpegPCMAudio( song.base_url, before_options='-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5'), after=lambda e: self.next_song(e)) self.guild.voice_client.source = discord.PCMVolumeTransformer( self.guild.voice_client.source) self.guild.voice_client.source.volume = float(self.volume) / 100.0 self.playlist.playque.popleft() for song in list(self.playlist.playque)[:config.MAX_SONG_PRELOAD]: asyncio.ensure_future(self.preload(song))
async def _prev(self, ctx): current_guild = utils.get_guild(self.bot, ctx.message) if await utils.play_check(ctx) == False: return audiocontroller = utils.guild_to_audiocontroller[current_guild] audiocontroller.playlist.loop = False audiocontroller.timer.cancel() audiocontroller.timer = utils.Timer(audiocontroller.timeout_handler) if current_guild is None: await ctx.send(config.NO_GUILD_MESSAGE) return await utils.guild_to_audiocontroller[current_guild].prev_song() await ctx.send("Playing previous song :track_previous:")
async def prev_song(self): """Loads the last song from the history into the queue and starts it""" self.timer.cancel() self.timer = utils.Timer(self.timeout_handler) if len(self.playlist.playhistory) == 0: return prev_song = self.playlist.prev(self.current_song) if not self.guild.voice_client.is_playing() and not self.guild.voice_client.is_paused(): if prev_song == "Dummy": self.playlist.next(self.current_song) return None await self.play_song(prev_song) else: self.guild.voice_client.stop()
async def _play_song(self, ctx, *, track: str): current_guild = utils.get_guild(self.bot, ctx.message) audiocontroller = utils.guild_to_audiocontroller[current_guild] if (await utils.is_connected(ctx) == None): if await audiocontroller.uconnect(ctx) == False: return if track.isspace() or not track: return if await utils.play_check(ctx) == False: return # reset timer audiocontroller.timer.cancel() audiocontroller.timer = utils.Timer(audiocontroller.timeout_handler) if audiocontroller.playlist.loop == True: await ctx.send("Loop is enabled! Use {}loop to disable".format( config.BOT_PREFIX)) return song = await audiocontroller.process_song(track) if song is None: await ctx.send(config.SONGINFO_ERROR) return if song.origin == linkutils.Origins.Default: if audiocontroller.current_song != None and len( audiocontroller.playlist.playque) == 0: await ctx.send( embed=song.info.format_output(config.SONGINFO_NOW_PLAYING)) else: await ctx.send( embed=song.info.format_output(config.SONGINFO_QUEUE_ADDED)) elif song.origin == linkutils.Origins.Playlist: await ctx.send(config.SONGINFO_PLAYLIST_QUEUED)
async def _skip(self, ctx): current_guild = utils.get_guild(self.bot, ctx.message) if await utils.play_check(ctx) == False: return audiocontroller = utils.guild_to_audiocontroller[current_guild] audiocontroller.playlist.loop = False audiocontroller.timer.cancel() audiocontroller.timer = utils.Timer(audiocontroller.timeout_handler) if current_guild is None: await ctx.send(config.NO_GUILD_MESSAGE) return if current_guild.voice_client is None or ( not current_guild.voice_client.is_paused() and not current_guild.voice_client.is_playing()): await ctx.send("Queue is empty :x:") return current_guild.voice_client.stop() await ctx.send("Skipped current song :fast_forward:")