From 71ebe80a0f85e8f8b895a241aa9ab23da9d98d5d Mon Sep 17 00:00:00 2001 From: Ev-1 <33662061+Ev-1@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:48:16 +0100 Subject: [PATCH] Try to improve broken track handling. Attempt to switch lavalink nodes if tracks are broken. --- musicbot/cogs/music/__init__.py | 27 +++++++++++++++++++++++++++ musicbot/utils/mixplayer/player.py | 7 ++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/musicbot/cogs/music/__init__.py b/musicbot/cogs/music/__init__.py index 2161b13..93e72a2 100644 --- a/musicbot/cogs/music/__init__.py +++ b/musicbot/cogs/music/__init__.py @@ -1,4 +1,5 @@ import asyncio +import random import re import urllib.parse as urlparse from typing import List, Optional, Tuple @@ -15,6 +16,7 @@ PlayerUpdateEvent, QueueEndEvent, TrackEndEvent, + TrackExceptionEvent, TrackStartEvent, TrackStuckEvent, ) @@ -807,6 +809,30 @@ async def cog_unload(self): self.lavalink._event_hooks.clear() async def track_hook(self, event): + if isinstance(event, TrackExceptionEvent): + if isinstance(event, TrackExceptionEvent): + self.logger.debug("Event stuck or except: %s" % event) + self.logger.debug("Event except: %s" % event.track) + self.logger.debug("Event except msg: %s" % event.message) + self.logger.debug("Event except sev: %s" % event.severity) + self.logger.debug("Got track exception, trying to switch node") + track = None + if isinstance(event, TrackEndEvent): + self.logger.debug("TrackEndEvent %s" % event.reason) + track = event.track + + self.logger.debug("Got trackexception") + player = event.player + nodes = self.lavalink.node_manager.nodes + for node in random.sample(nodes, len(nodes)): + if node != player.node: + self.logger.debug("Changing node to %s" % node) + await player.change_node(node) + await asyncio.sleep(2) + if track: + self.logger.debug("Trying to restart track %s" % track) + await player.play(track) + return if isinstance(event, TrackEndEvent): if channel := self.bot.get_channel(event.player.fetch('channel')): if isinstance(channel, VoiceChannel): @@ -829,6 +855,7 @@ async def track_hook(self, event): pass if isinstance(event, TrackStuckEvent): pass + return @commands.Cog.listener() async def on_voice_state_update(self, member: discord.Member, _: discord.VoiceState, after: discord.VoiceState): diff --git a/musicbot/utils/mixplayer/player.py b/musicbot/utils/mixplayer/player.py index 9265cca..0cedc91 100644 --- a/musicbot/utils/mixplayer/player.py +++ b/musicbot/utils/mixplayer/player.py @@ -4,7 +4,7 @@ import discord import lavalink from lavalink import AudioTrack, DefaultPlayer, Node -from lavalink.events import QueueEndEvent, TrackEndEvent, TrackExceptionEvent, TrackStartEvent, TrackStuckEvent +from lavalink.events import QueueEndEvent, TrackEndEvent, TrackStartEvent, TrackStuckEvent from lavalink.filters import Equalizer, Timescale from .mixqueue import MixQueue @@ -208,10 +208,7 @@ def enable_looping(self, looping: bool): async def handle_event(self, event): """Handles the given event as necessary.""" - if isinstance(event, (TrackStuckEvent, TrackExceptionEvent)) or \ - (isinstance(event, TrackEndEvent) and event.reason.may_start_next()): - if isinstance(event, (TrackStuckEvent, TrackExceptionEvent)): - self.logger.debug("Event stuck or except: %s" % event) + if isinstance(event, TrackStuckEvent) or isinstance(event, TrackEndEvent) and event.reason.may_start_next(): if isinstance(event, TrackEndEvent) and event.reason.may_start_next(): self.logger.debug("Event end: %s, %s, %s" % (event, event.reason, event.reason.may_start_next())) if event.track is not None: