diff --git a/resources/mpc-be.png b/resources/mpc-be.png new file mode 100644 index 0000000..984887e Binary files /dev/null and b/resources/mpc-be.png differ diff --git a/syncplay/__init__.py b/syncplay/__init__.py index f3e9aa8..02e8e74 100644 --- a/syncplay/__init__.py +++ b/syncplay/__init__.py @@ -1,4 +1,4 @@ version = '1.5.0' milestone = 'Yoitsu' -release_number = '49' +release_number = '50' projectURL = 'http://syncplay.pl/' diff --git a/syncplay/constants.py b/syncplay/constants.py index 2da9113..cba53af 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -83,6 +83,7 @@ COMMANDS_CREATE = ['c','create'] COMMANDS_AUTH = ['a','auth'] COMMANDS_TOGGLE = ['t','toggle'] MPC_MIN_VER = "1.6.4" +MPC_BE_MIN_VER = "1.5.2.3123" VLC_MIN_VERSION = "2.2.1" VLC_INTERFACE_MIN_VERSION = "0.3.4" VLC_LATENCY_ERROR_THRESHOLD = 2.0 @@ -105,6 +106,12 @@ MPC_PATHS = [ r"c:\program files\combined community codec pack\mpc\mpc-hc.exe", r"c:\program files\mpc homecinema (x64)\mpc-hc64.exe", ] +MPC_BE_PATHS = [ + r"c:\Program Files\MPC-BE x64\mpc-be64.exe", + r"c:\Program Files\MPC-BE x64\mpc-be.exe", + r"c:\Program Files\MPC-BE\mpc-be64.exe", + r"c:\Program Files\MPC-BE\mpc-be.exe" +] MPLAYER_PATHS = ["mplayer2", "mplayer"] MPV_PATHS = ["mpv", "/opt/mpv/mpv", r"c:\program files\mpv\mpv.exe", r"c:\program files\mpv-player\mpv.exe", r"c:\program Files (x86)\mpv\mpv.exe", r"c:\program Files (x86)\mpv-player\mpv.exe", @@ -124,6 +131,7 @@ MPLAYER_ICONPATH = "mplayer.png" MPV_ICONPATH = "mpv.png" MPC_ICONPATH = "mpc-hc.png" MPC64_ICONPATH = "mpc-hc64.png" +MPC_BE_ICONPATH = "mpc-be.png" MPV_ERROR_MESSAGES_TO_REPEAT = ['[ytdl_hook] Your version of youtube-dl is too old', '[ytdl_hook] youtube-dl failed', 'Failed to recognize file format.'] diff --git a/syncplay/messages_de.py b/syncplay/messages_de.py index 7af6bff..819ca79 100644 --- a/syncplay/messages_de.py +++ b/syncplay/messages_de.py @@ -108,9 +108,10 @@ de = { "server-timeout-error" : u"Timeout: Verbindung zum Server fehlgeschlagen", "mpc-slave-error" : u"Kann MPC nicht im Slave-Modus starten!", "mpc-version-insufficient-error" : u"MPC-Version nicht ausreichend, bitte nutze `mpc-hc` >= `{}`", + "mpc-be-version-insufficient-error" : u"MPC-Version nicht ausreichend, bitte nutze `mpc-be` >= `{}`", "mpv-version-error" : u"Syncplay ist nicht kompatibel mit dieser Version von mpv. Bitte benutze eine andere Version (z.B. Git HEAD).", "player-file-open-error" : u"Fehler beim Öffnen der Datei durch den Player", - "player-path-error" : u"Ungültiger Player-Pfad. Supported players are: mpv, VLC, MPC-HC and mplayer2", # To do: Translate end + "player-path-error" : u"Ungültiger Player-Pfad. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", # To do: Translate end "hostname-empty-error" : u"Hostname darf nicht leer sein", "empty-error" : u"{} darf nicht leer sein", # Configuration "media-player-error": u"Player-Fehler: \"{}\"", # Error line @@ -120,7 +121,7 @@ de = { "unable-to-start-client-error" : u"Client kann nicht gestartet werden", - "player-path-config-error": u"Player-Pfad ist nicht ordnungsgemäß gesetzt. Supported players are: mpv, VLC, MPC-HC and mplayer2.", # To do: Translate end + "player-path-config-error": u"Player-Pfad ist nicht ordnungsgemäß gesetzt. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", # To do: Translate end "no-file-path-config-error": u"Es muss eine Datei ausgewählt werden, bevor der Player gestartet wird.", "no-hostname-config-error": u"Hostname darf nicht leer sein", "invalid-port-config-error" : u"Port muss gültig sein", @@ -151,7 +152,7 @@ de = { "failed-to-load-server-list-error" : u"Konnte die Liste der öffentlichen Server nicht laden. Bitte besuche http://www.syncplay.pl/ [Englisch] mit deinem Browser.", # Client arguments - "argument-description" : u'Syncplay ist eine Anwendung um mehrere MPlayer, MPC-HC und VLC-Instanzen über das Internet zu synchronisieren.', + "argument-description" : u'Syncplay ist eine Anwendung um mehrere MPlayer, MPC-HC, MPC-BE und VLC-Instanzen über das Internet zu synchronisieren.', "argument-epilog" : u'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet', "nogui-argument" : u'Keine GUI anzeigen', "host-argument" : u'Server-Adresse', @@ -195,7 +196,7 @@ de = { "filename-privacy-label" : u"Dateiname:", "filesize-privacy-label" : u"Dateigröße:", "checkforupdatesautomatically-label" : u"Automatisch nach Updates suchen", - "slowondesync-label" : u"Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC)", + "slowondesync-label" : u"Verlangsamen wenn nicht synchron (nicht unterstützt mit MPC-HC/BE)", "dontslowdownwithme-label" : u"Nie verlangsamen oder andere zurückspulen (Experimentell)", "pausing-title" : u"Pausing", # TODO: Translate "pauseonleave-label" : u"Pausieren wenn ein Benutzer austritt", @@ -320,7 +321,7 @@ de = { "password-tooltip" : u"Passwörter sind nur bei Verbindung zu privaten Servern nötig.", "room-tooltip" : u"Der Raum, der betreten werden soll, kann ein x-beliebiger sein. Allerdings werden nur Clients im selben Raum synchronisiert.", - "executable-path-tooltip" : u"Pfad zum ausgewählten, unterstützten Mediaplayer (MPC-HC, VLC, mplayer2 or mpv).", + "executable-path-tooltip" : u"Pfad zum ausgewählten, unterstützten Mediaplayer (MPC-HC, MPC-BE, VLC, mplayer2 or mpv).", "media-path-tooltip" : u"Pfad zum wiederzugebenden Video oder Stream. Notwendig für mplayer2.", # TODO: Confirm translation "player-arguments-tooltip" : u"Zusätzliche Kommandozeilenparameter / -schalter für diesen Mediaplayer.", "mediasearcdirectories-arguments-tooltip" : u"Verzeichnisse, in denen Syncplay nach Mediendateien suchen soll, z.B. wenn du das Click-to-switch-Feature verwendest. Syncplay wird rekursiv Unterordner durchsuchen.", # TODO: Translate Click-to-switch? (or use as name for feature) @@ -383,7 +384,7 @@ de = { "no-salt-notification" : u"WICHTIGER HINWEIS: Damit von dem Server generierte Passwörter für geführte Räume auch nach einem Serverneustart funktionieren, starte den Server mit dem folgenden Parameter: --salt {}", #Salt # Server arguments - "server-argument-description" : u'Anwendung, um mehrere MPlayer, MPC-HC und VLC-Instanzen über das Internet zu synchronisieren. Server', + "server-argument-description" : u'Anwendung, um mehrere MPlayer, MPC-HC/BE und VLC-Instanzen über das Internet zu synchronisieren. Server', "server-argument-epilog" : u'Wenn keine Optionen angegeben sind, werden die _config-Werte verwendet', "server-port-argument" : u'Server TCP-Port', "server-password-argument" : u'Server Passwort', diff --git a/syncplay/messages_en.py b/syncplay/messages_en.py index dd97e2b..18476cb 100644 --- a/syncplay/messages_en.py +++ b/syncplay/messages_en.py @@ -107,9 +107,10 @@ en = { "server-timeout-error" : "Connection with server timed out", "mpc-slave-error" : "Unable to start MPC in slave mode!", "mpc-version-insufficient-error" : "MPC version not sufficient, please use `mpc-hc` >= `{}`", + "mpc-be-version-insufficient-error" : "MPC version not sufficient, please use `mpc-be` >= `{}`", "mpv-version-error" : "Syncplay is not compatible with this version of mpv. Please use a different version of mpv (e.g. Git HEAD).", "player-file-open-error" : "Player failed opening file", - "player-path-error" : "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC and mplayer2", + "player-path-error" : "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", "hostname-empty-error" : "Hostname can't be empty", "empty-error" : "{} can't be empty", # Configuration "media-player-error": "Media player error: \"{}\"", # Error line @@ -119,7 +120,7 @@ en = { "unable-to-start-client-error" : "Unable to start client", - "player-path-config-error": "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC and mplayer2.", + "player-path-config-error": "Player path is not set properly. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", "no-file-path-config-error" :"File must be selected before starting your player", "no-hostname-config-error": "Hostname can't be empty", "invalid-port-config-error" : "Port must be valid", @@ -149,7 +150,7 @@ en = { "failed-to-load-server-list-error" : u"Failed to load public server list. Please visit http://www.syncplay.pl/ in your browser.", # Client arguments - "argument-description" : 'Solution to synchronize playback of multiple MPlayer and MPC-HC instances over the network.', + "argument-description" : 'Solution to synchronize playback of multiple media player instances over the network.', "argument-epilog" : 'If no options supplied _config values will be used', "nogui-argument" : 'show no GUI', "host-argument" : 'server\'s address', @@ -193,7 +194,7 @@ en = { "filename-privacy-label" : "Filename information:", "filesize-privacy-label" : "File size information:", "checkforupdatesautomatically-label" : "Check for Syncplay updates automatically", - "slowondesync-label" : "Slow down on minor desync (not supported on MPC-HC)", + "slowondesync-label" : "Slow down on minor desync (not supported on MPC-HC/BE)", "rewindondesync-label" : "Rewind on major desync (recommended)", "fastforwardondesync-label" : "Fast-forward if lagging behind (recommended)", "dontslowdownwithme-label" : "Never slow down or rewind others (experimental)", @@ -320,7 +321,7 @@ en = { "password-tooltip" : "Passwords are only needed for connecting to private servers.", "room-tooltip" : "Room to join upon connection can be almost anything, but you will only be synchronised with people in the same room.", - "executable-path-tooltip" : "Location of your chosen supported media player (mpv, VLC, MPC-HC or mplayer2).", + "executable-path-tooltip" : "Location of your chosen supported media player (mpv, VLC, MPC-HC/BE or mplayer2).", "media-path-tooltip" : "Location of video or stream to be opened. Necessary for mplayer2.", "player-arguments-tooltip" : "Additional command line arguments / switches to pass on to this media player.", "mediasearcdirectories-arguments-tooltip" : u"Directories where Syncplay will search for media files, e.g. when you are using the click to switch feature. Syncplay will look recursively through sub-folders.", @@ -332,7 +333,7 @@ en = { "privacy-sendhashed-tooltip" : "Send a hashed version of the information, making it less visible to other clients.", "privacy-dontsend-tooltip" : "Do not send this information to the server. This provides for maximum privacy.", "checkforupdatesautomatically-tooltip" : "Regularly check with the Syncplay website to see whether a new version of Syncplay is available.", - "slowondesync-tooltip" : "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC.", + "slowondesync-tooltip" : "Reduce playback rate temporarily when needed to bring you back in sync with other viewers. Not supported on MPC-HC/BE.", "dontslowdownwithme-tooltip" : "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room operators.", "pauseonleave-tooltip" : "Pause playback if you get disconnected or someone leaves from your room.", "readyatstart-tooltip" : "Set yourself as 'ready' at start (otherwise you are set as 'not ready' until you change your readiness state)", @@ -382,7 +383,7 @@ en = { # Server arguments - "server-argument-description" : 'Solution to synchronize playback of multiple MPlayer and MPC-HC instances over the network. Server instance', + "server-argument-description" : 'Solution to synchronize playback of multiple MPlayer and MPC-HC/BE instances over the network. Server instance', "server-argument-epilog" : 'If no options supplied _config values will be used', "server-port-argument" : 'server TCP port', "server-password-argument" : 'server password', diff --git a/syncplay/messages_ru.py b/syncplay/messages_ru.py index e56f3de..8130c95 100644 --- a/syncplay/messages_ru.py +++ b/syncplay/messages_ru.py @@ -108,9 +108,10 @@ ru = { "server-timeout-error" : u"Подключение к серверу превысило лимит времени", "mpc-slave-error" : u"Невозможно запустить MPC в slave режиме!", "mpc-version-insufficient-error" : u"Версия MPC слишком старая, пожалуйста, используйте `mpc-hc` >= `{}`", + "mpc-be-version-insufficient-error" : u"Версия MPC слишком старая, пожалуйста, используйте `mpc-be` >= `{}`", "mpv-version-error" : u"Syncplay не совместим с данной версией mpv. Пожалуйста, используйте другую версию mpv (лучше свежайшую).", "player-file-open-error" : u"Проигрыватель не может открыть файл.", - "player-path-error" : u"Путь к проигрывателю задан неверно. Supported players are: mpv, VLC, MPC-HC and mplayer2.", # TODO: Translate last sentence + "player-path-error" : u"Путь к проигрывателю задан неверно. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2.", # TODO: Translate last sentence "hostname-empty-error" : u"Имя пользователя не может быть пустым.", "empty-error" : u"{} не может быть пустым.", # Configuration "media-player-error" : u"Ошибка проигрывателя: \"{}\"", # Error line @@ -120,7 +121,7 @@ ru = { "unable-to-start-client-error" : u"Невозможно запустить клиент", - "player-path-config-error": u"Путь к проигрывателю установлен неверно. Supported players are: mpv, VLC, MPC-HC and mplayer2", # To do: Translate end + "player-path-config-error": u"Путь к проигрывателю установлен неверно. Supported players are: mpv, VLC, MPC-HC, MPC-BE and mplayer2", # To do: Translate end "no-file-path-config-error" : u"Файл должен быть указан до включения проигрывателя", "no-hostname-config-error": u"Имя сервера не может быть пустым", "invalid-port-config-error" : u"Неверный номер порта", @@ -151,7 +152,7 @@ ru = { "failed-to-load-server-list-error" : u"Не удалось загрузить список публичных серверов. Откройте http://www.syncplay.pl/ через браузер.", # Client arguments - "argument-description" : u'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC через Интернет.', + "argument-description" : u'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет.', "argument-epilog" : u'Если параметр не будет передан, то будет использоваться значение, указанное в _config.', "nogui-argument" : u'не использовать GUI', "host-argument" : u'адрес сервера', @@ -195,7 +196,7 @@ ru = { "filename-privacy-label" : u"Имя файла:", "filesize-privacy-label" : u"Размер файла:", "checkforupdatesautomatically-label" : u"Проверять обновления автоматически", - "slowondesync-label" : u"Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC)", + "slowondesync-label" : u"Замедлять при небольших рассинхронизациях (не поддерживаетя в MPC-HC/BE)", "rewindondesync-label" : u"Перемотка при больших рассинхронизациях (настоятельно рекомендуется)", "dontslowdownwithme-label" : u"Никогда не замедлять и не перематывать видео другим (функция тестируется)", "pausing-title" : u"Приостановка", @@ -322,7 +323,7 @@ ru = { "password-tooltip" : u"Пароли нужны для подключения к приватным серверам.", "room-tooltip" : u"Комната, в которую Вы попадете сразу после подключения. Синхронизация возможна только между людьми в одной и той же комнате.", - "executable-path-tooltip" : u"Расположение Вашего видеопроигрывателя (MPC-HC, VLC, mplayer2 или mpv).", + "executable-path-tooltip" : u"Расположение Вашего видеопроигрывателя (MPC-HC, MPC-BE, VLC, mplayer2 или mpv).", "media-path-tooltip" : u"Расположение видеофайла или потока для просмотра. Обязательно для mplayer2.", # TODO: Confirm translation "player-arguments-tooltip" : u"Передавать дополнительные аргументы командной строки этому проигрывателю.", "mediasearcdirectories-arguments-tooltip" : u"Папки, где Syncplay будет искать медиа файлы, включая подпапки.", @@ -334,7 +335,7 @@ ru = { "privacy-sendhashed-tooltip" : u"Отправляет хэш-сумму этой информации, делая ее невидимой для других пользователей.", "privacy-dontsend-tooltip" : u"Не отправлять эту информацию на сервер. Предоставляет наибольшую приватность.", "checkforupdatesautomatically-tooltip" : u"Syncplay будет регулярно заходить на сайт и проверять наличие новых версий.", - "slowondesync-tooltip" : u"Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC.", + "slowondesync-tooltip" : u"Временно уменьшить скорость воспроизведения в целях синхронизации с другими зрителями. Не поддерживается в MPC-HC/BE.", "dontslowdownwithme-tooltip" : u"Ваши лаги не будут влиять на других зрителей.", "pauseonleave-tooltip" : u"Приостановить воспроизведение, если Вы покинули комнату или кто-то из зрителей отключился от сервера.", "readyatstart-tooltip" : u"Отметить Вас готовым к просмотру сразу же (по умолчанию Вы отмечены не готовым)", @@ -383,7 +384,7 @@ ru = { "no-salt-notification" : u"ВНИМАНИЕ: Чтобы сгенерированные сервером пароли операторов комнат работали после перезагрузки сервера, необходимо указать следующий аргумент командной строки при запуске сервера Syncplay: --salt {}", #Salt # Server arguments - "server-argument-description" : u'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC через Интернет. Серверная часть', + "server-argument-description" : u'Решение для синхронного воспроизведения в VLC, MPlayer или MPC-HC/BE через Интернет. Серверная часть', "server-argument-epilog" : u'Если параметр не будет передан, то будет использоваться значение, указанное в _config.', "server-port-argument" : u'номер TCP порта сервера', "server-password-argument" : u'пароль к серверу', diff --git a/syncplay/players/__init__.py b/syncplay/players/__init__.py index a1afcb4..710bfe1 100644 --- a/syncplay/players/__init__.py +++ b/syncplay/players/__init__.py @@ -6,6 +6,11 @@ try: except ImportError: from syncplay.players.basePlayer import DummyPlayer MPCHCAPIPlayer = DummyPlayer +try: + from syncplay.players.mpcbe import MpcBePlayer +except ImportError: + from syncplay.players.basePlayer import DummyPlayer + MpcBePlayer = DummyPlayer def getAvailablePlayers(): - return [MPCHCAPIPlayer, MplayerPlayer, MpvPlayer, VlcPlayer] + return [MPCHCAPIPlayer, MplayerPlayer, MpvPlayer, VlcPlayer, MpcBePlayer] diff --git a/syncplay/players/mpc.py b/syncplay/players/mpc.py index c38b074..1dc3064 100644 --- a/syncplay/players/mpc.py +++ b/syncplay/players/mpc.py @@ -327,6 +327,10 @@ class MPCHCAPIPlayer(BasePlayer): self.__versionUpdate = threading.Event() self.__fileUpdate = threading.RLock() self.__versionUpdate.clear() + + @staticmethod + def getMinVersionErrorMessage(): + return getMessage("mpc-version-insufficient-error").format(constants.MPC_MIN_VER) def drop(self): self.__preventAsking.set() @@ -365,7 +369,7 @@ class MPCHCAPIPlayer(BasePlayer): def __dropIfNotSufficientVersion(self): self._mpcApi.askForVersion() if not self.__versionUpdate.wait(0.1) or not self._mpcApi.version: - self.reactor.callFromThread(self.__client.ui.showErrorMessage, getMessage("mpc-version-insufficient-error").format(constants.MPC_MIN_VER), True) + self.reactor.callFromThread(self.__client.ui.showErrorMessage, self.getMinVersionErrorMessage(), True) self.reactor.callFromThread(self.__client.stop, True) def __testMpcReady(self): @@ -382,7 +386,7 @@ class MPCHCAPIPlayer(BasePlayer): self.reactor.callFromThread(self.__client.ui.showErrorMessage, err.message, True) self.reactor.callFromThread(self.__client.stop) - def initPlayer(self, filePath): + def initPlayer(self, filePath): self.__dropIfNotSufficientVersion() if not self._mpcApi.version: return diff --git a/syncplay/players/mpcbe.py b/syncplay/players/mpcbe.py new file mode 100644 index 0000000..68b2074 --- /dev/null +++ b/syncplay/players/mpcbe.py @@ -0,0 +1,50 @@ +from syncplay import constants +import os.path +from syncplay.messages import getMessage +from syncplay.players.mpc import MPCHCAPIPlayer + +class MpcBePlayer(MPCHCAPIPlayer): + @staticmethod + def run(client, playerPath, filePath, args): + args.extend(['/open', '/new']) + mpc = MpcBePlayer(client) + mpc._mpcApi.callbacks.onConnected = lambda: mpc.initPlayer(filePath if filePath else None) + mpc._mpcApi.startMpc(MpcBePlayer.getExpandedPath(playerPath), args) + client.initPlayer(mpc) + return mpc + + @staticmethod + def getDefaultPlayerPathsList(): + return constants.MPC_BE_PATHS + + @staticmethod + def getIconPath(path): + return constants.MPC_BE_ICONPATH + + @staticmethod + def isValidPlayerPath(path): + if MpcBePlayer.getExpandedPath(path): + return True + return False + + @staticmethod + def getExpandedPath(path): + if os.path.isfile(path): + if path.lower().endswith(u'mpc-be.exe'.lower()) or path.lower().endswith(u'mpc-be64.exe'.lower()): + return path + if os.path.isfile(path + u"mpc-be.exe"): + path += u"mpc-be.exe" + return path + if os.path.isfile(path + u"\\mpc-be.exe"): + path += u"\\mpc-be.exe" + return path + if os.path.isfile(path + u"mpc-be64.exe"): + path += u"mpc-be64.exe" + return path + if os.path.isfile(path + u"\\mpc-be64.exe"): + path += u"\\mpc-be64.exe" + return path + + @staticmethod + def getMinVersionErrorMessage(): + return getMessage("mpc-be-version-insufficient-error").format(constants.MPC_BE_MIN_VER)