Skip to content

Commit

Permalink
Try to improve broken track handling.
Browse files Browse the repository at this point in the history
Attempt to switch lavalink nodes if tracks are broken.
  • Loading branch information
Ev-1 committed Mar 28, 2024
1 parent 687f76d commit 71ebe80
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 5 deletions.
27 changes: 27 additions & 0 deletions musicbot/cogs/music/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import asyncio
import random
import re
import urllib.parse as urlparse
from typing import List, Optional, Tuple
Expand All @@ -15,6 +16,7 @@
PlayerUpdateEvent,
QueueEndEvent,
TrackEndEvent,
TrackExceptionEvent,
TrackStartEvent,
TrackStuckEvent,
)
Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand Down
7 changes: 2 additions & 5 deletions musicbot/utils/mixplayer/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 71ebe80

Please sign in to comment.