我正在使用 python-mpd2 模块在 GUI 应用程序中控制 Raspberry Pi 上的媒体播放器。因此,我想在后台优雅地处理连接错误和超时(有问题的播放器在 60 秒后断开 MPD 连接)。但是,MPD 模块没有单一的入口点,通过它可以发送所有命令或检索我可以修补的信息。
我想要一个允许访问所有与 mpd.MPDClient 相同的方法的类,但让我添加我自己的错误处理。换句话说,如果我这样做:
client.play()
并且抛出了一个连接错误,我想抓住它并重新发送相同的命令。除了必须重新连接到服务器造成的小延迟之外,用户不应该注意到有任何问题。
到目前为止,这是我想出的解决方案。它在我的应用程序中工作,但并没有真正实现我的目标。
from functools import partial
from mpd import MPDClient, ConnectionError
class PersistentMPDClient(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.client = MPDClient()
self.client.connect(self.host, self.port)
def command(self, cmd, *args, **kwargs):
command_callable = partial(self.client.__getattribute__(cmd), *args, **kwargs)
try:
return command_callable()
except ConnectionError:
# Mopidy drops our connection after a while, so reconnect to send the command
self.client._soc = None
self.client.connect(self.host, self.port)
return command_callable()
我可以为每个 MPD 命令添加一个方法到这个类,例如:
def play(self):
return self.command("play")
但这似乎远非实现它的最佳方式。