From 6c5e3a18551618d69040e13a6a4c91e6a7f7fb3b Mon Sep 17 00:00:00 2001 From: peelz Date: Mon, 8 Apr 2024 14:06:34 -0400 Subject: [PATCH] Store MPV socket in $XDG_RUNTIME_DIR --- syncplay/players/mpv.py | 19 +++++++++++++++++-- syncplay/utils.py | 23 ++++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/syncplay/players/mpv.py b/syncplay/players/mpv.py index 093e780..cf9e745 100755 --- a/syncplay/players/mpv.py +++ b/syncplay/players/mpv.py @@ -1,5 +1,6 @@ # coding:utf8 import os +import random import re import sys import time @@ -10,7 +11,7 @@ import ast from syncplay import constants from syncplay.messages import getMessage from syncplay.players.basePlayer import BasePlayer -from syncplay.utils import isURL, findResourcePath +from syncplay.utils import getRuntimeDir, isURL, findResourcePath from syncplay.utils import isMacOS, isWindows, isASCII from syncplay.vendor.python_mpv_jsonipc.python_mpv_jsonipc import MPV @@ -621,7 +622,15 @@ class MpvPlayer(BasePlayer): env['PATH'] = python_executable + ':' + env['PATH'] env['PYTHONPATH'] = pythonPath try: - self.mpvpipe = self.playerIPCHandler(mpv_location=self.playerPath, loglevel="info", log_handler=self.__playerController.mpv_log_handler, quit_callback=self.stop_client, env=env, **self.mpv_arguments) + self.mpvpipe = self.playerIPCHandler( + loglevel="info", + ipc_socket=self._get_ipc_socket(), + mpv_location=self.playerPath, + log_handler=self.__playerController.mpv_log_handler, + quit_callback=self.stop_client, + env=env, + **self.mpv_arguments + ) except Exception as e: self.quitReason = getMessage("media-player-error").format(str(e)) + " " + getMessage("mpv-failed-advice") self.__playerController.reactor.callFromThread(self.__playerController._client.ui.showErrorMessage, self.quitReason, True) @@ -630,6 +639,12 @@ class MpvPlayer(BasePlayer): #self.mpvpipe.show_text("HELLO WORLD!", 1000) threading.Thread.__init__(self, name="MPV Listener") + def _get_ipc_socket(self): + if isWindows(): + # On Windows, mpv expects a named pipe identifier (not a path) + return "syncplay-mpv-{0}".format(random.randint(0, 2**48)) + return getRuntimeDir().joinpath("mpv-socket").as_posix() + def __getCwd(self, filePath, env): if not filePath: return None diff --git a/syncplay/utils.py b/syncplay/utils.py index 6adf663..556d461 100755 --- a/syncplay/utils.py +++ b/syncplay/utils.py @@ -1,5 +1,5 @@ - import ast +import atexit import datetime import hashlib import itertools @@ -10,11 +10,13 @@ import re import string import subprocess import sys +import tempfile import time import traceback import urllib.error import urllib.parse import urllib.request +from pathlib import Path from syncplay import constants from syncplay.messages import getMessage @@ -37,9 +39,28 @@ def isMacOS(): def isBSD(): return constants.OS_BSD in sys.platform or sys.platform.startswith(constants.OS_DRAGONFLY) + def isWindowsConsole(): return os.path.basename(sys.executable) == "SyncplayConsole.exe" + +def getRuntimeDir(): + cachedPath = getattr(getRuntimeDir, "cachedPath", None) + if cachedPath is not None: + return cachedPath + + baseDir = None + if not isWindows() and not isMacOS(): + baseDir = os.getenv("XDG_RUNTIME_DIR", None) + + tmp = tempfile.TemporaryDirectory(prefix="syncplay-", dir=baseDir) + atexit.register(tmp.cleanup) + + o = Path(tmp.name) + setattr(getRuntimeDir, "cachedPath", o) + return o + + def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None): """Retry calling the decorated function using an exponential backoff.