From e52ba999a36186ac7c3ac8ed2f63a540fa838e7f Mon Sep 17 00:00:00 2001 From: Et0h Date: Mon, 7 Oct 2024 21:34:56 +0100 Subject: [PATCH] Improve handling of big media directories --- ..._arguments_with_spaces_quotes_(#665).patch | 79 ++ ...ss_override_(initial_implementation).patch | 993 ++++++++++++++++++ syncplay/client.py | 47 +- syncplay/constants.py | 3 +- syncplay/messages_de.py | 3 +- syncplay/messages_en.py | 3 +- syncplay/messages_eo.py | 3 +- syncplay/messages_es.py | 3 +- syncplay/messages_fi.py | 3 +- syncplay/messages_fr.py | 3 +- syncplay/messages_it.py | 3 +- syncplay/messages_ko.py | 3 +- syncplay/messages_pt_BR.py | 3 +- syncplay/messages_pt_PT.py | 3 +- syncplay/messages_ru.py | 3 +- syncplay/messages_tr.py | 3 +- syncplay/messages_zh_CN.py | 3 +- syncplay/ui/ConfigurationGetter.py | 4 +- vlc-help.txt | 349 ++++++ 19 files changed, 1470 insertions(+), 44 deletions(-) create mode 100644 Allow_player_arguments_with_spaces_quotes_(#665).patch create mode 100644 Readiness_override_(initial_implementation).patch create mode 100644 vlc-help.txt diff --git a/Allow_player_arguments_with_spaces_quotes_(#665).patch b/Allow_player_arguments_with_spaces_quotes_(#665).patch new file mode 100644 index 00000000..39a269ba --- /dev/null +++ b/Allow_player_arguments_with_spaces_quotes_(#665).patch @@ -0,0 +1,79 @@ +Subject: [PATCH] Allow player arguments with spaces/quotes (#665) +--- +Index: syncplay/utils.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/utils.py b/syncplay/utils.py +--- a/syncplay/utils.py (revision b22c9ab72148ef4c94fd8cb55803dc49a1b32fa5) ++++ b/syncplay/utils.py (date 1706291957961) +@@ -191,6 +191,10 @@ + return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s), minLength, -1)) + + ++def parseCommandLineString(s): ++ arsToReturn = re.findall(constants.ARGUMENT_SPLIT_REGEX, s) ++ return arsToReturn ++ + def blackholeStdoutForFrozenWindow(): + if getattr(sys, 'frozen', '') == "windows_exe": + class Stderr(object): +Index: syncplay/ui/GuiConfiguration.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/ui/GuiConfiguration.py b/syncplay/ui/GuiConfiguration.py +--- a/syncplay/ui/GuiConfiguration.py (revision b22c9ab72148ef4c94fd8cb55803dc49a1b32fa5) ++++ b/syncplay/ui/GuiConfiguration.py (date 1706289487195) +@@ -279,7 +279,7 @@ + currentplayerpath = self.executablepathCombobox.currentText() + + if currentplayerpath: +- NewPlayerArgs = self.playerargsTextbox.text().split(" ") if self.playerargsTextbox.text() else "" ++ NewPlayerArgs = utils.parseCommandLineString(self.playerargsTextbox.text()) if self.playerargsTextbox.text() else "" + self.perPlayerArgs[self.executablepathCombobox.currentText()] = NewPlayerArgs + + def languageChanged(self): +Index: syncplay/players/vlc.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/players/vlc.py b/syncplay/players/vlc.py +--- a/syncplay/players/vlc.py (revision b22c9ab72148ef4c94fd8cb55803dc49a1b32fa5) ++++ b/syncplay/players/vlc.py (date 1706291938733) +@@ -487,10 +487,14 @@ + + call.extend(self.__playerController.SLAVE_ARGS) + if args: +- call.extend(args) ++ for arg in args: ++ if "=" in arg and "\"" in arg: ++ (argName, argValue) = arg.split("=", 1) ++ if argValue.startswith("\"") and argValue.endswith("\""): ++ arg = argName + "=" + argValue[1:-1] ++ call.extend([arg]) + + self._vlcVersion = None +- + if isWindows() and getattr(sys, 'frozen', '') and getattr(sys, '_MEIPASS', '') is not None: # Needed for pyinstaller --onefile bundle + self.__process = subprocess.Popen( + call, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE, +Index: syncplay/constants.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/constants.py b/syncplay/constants.py +--- a/syncplay/constants.py (revision b22c9ab72148ef4c94fd8cb55803dc49a1b32fa5) ++++ b/syncplay/constants.py (date 1706289344189) +@@ -115,6 +115,7 @@ + FILENAME_STRIP_REGEX = "[-~_\.\[\](): ]" + CONTROL_PASSWORD_STRIP_REGEX = "[^a-zA-Z0-9\-]" + ROOM_NAME_STRIP_REGEX = "^(\+)(?P.*)(:)(\w{12})$" ++ARGUMENT_SPLIT_REGEX = r'(?:[^\s"]+|"[^"]*")+' + COMMANDS_UNDO = ["u", "undo", "revert"] + COMMANDS_CHAT = ["ch", "chat"] + COMMANDS_LIST = ["l", "list", "users"] diff --git a/Readiness_override_(initial_implementation).patch b/Readiness_override_(initial_implementation).patch new file mode 100644 index 00000000..75ea2ae6 --- /dev/null +++ b/Readiness_override_(initial_implementation).patch @@ -0,0 +1,993 @@ +Subject: [PATCH] Readiness override (initial implementation) +--- +Index: syncplay/messages_de.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_de.py b/syncplay/messages_de.py +--- a/syncplay/messages_de.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_de.py (date 1706899550302) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} authentifizierte sich als Raumleiter", + "created-controlled-room-notification": "Gesteuerten Raum „{}“ mit Passwort „{}“ erstellt. Bitte diese Informationen für die Zukunft aufheben! \n\nIn managed rooms everyone is kept in sync with the room operator(s) who are the only ones who can pause, unpause, seek, and change the playlist.\n\nYou should ask regular viewers to join the room '{}' but the room operators can join the room '{}' to automatically authenticate themselves.", # RoomName, operatorPassword, roomName, roomName:operatorPassword # TODO: Translate + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Deine Datei scheint sich von {}s zu unterscheiden", # User + "file-differences-notification": "Deine Datei unterscheidet sich auf folgende Art: {}", + "room-file-differences": "Unterschiedlich in: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", + "commandlist-notification/help": "\th - Diese Hilfe", + "commandlist-notification/toggle": "\tt - Bereitschaftsanzeige umschalten", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [name] - erstelle zentral gesteuerten Raum mit dem aktuellen Raumnamen", + "commandlist-notification/auth": "\ta [password] - authentifiziere als Raumleiter mit Passwort", + "commandlist-notification/chat": "\tch [message] - Chatnachricht an einem Raum senden", +@@ -158,6 +163,7 @@ + "feature-chat": "Chat", # used for not-supported-by-server-error + "feature-readiness": "Bereitschaftsstatus", # used for not-supported-by-server-error + "feature-managedRooms": "Zentral gesteuerte Räume", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "Diese Funktion wird vom Server nicht unterstützt. Es wird ein Server mit Syncplay Version {}+ benötigt, aktuell verwendet wird jedoch Version {}.", # minVersion, serverVersion + "shared-playlists-not-supported-by-server-error": "Die Geteilte-Playlists-Funktion wird von diesem Server eventuell nicht unterstützt. Um ein korrektes Funktionieren sicherzustellen wird ein Server mit Syncplay Version {}+ benötigt, aktuell verwendet wird jedoch Version {}.", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Du nutzt Syncplay Version {}, aber es gibt eine neuere Version auf https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # TO DO: Translate - NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Willkommen zum Syncplay-Server, v. {0}", # version +@@ -537,6 +545,9 @@ + "openusersstream-menu-label": "{}s Stream öffnen", # [username]'s + "openusersfile-menu-label": "{}s Datei öffnen", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Zieh eine Datei hierher, um sie zur geteilten Playlist hinzuzufügen.", + "sharedplaylistenabled-tooltip": "Raumleiter können Dateien zu einer geteilten Playlist hinzufügen und es so erleichtern, gemeinsam das Gleiche zu gucken. Konfiguriere Medienverzeichnisse unter „Diverse“", + +Index: syncplay/messages_en.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_en.py b/syncplay/messages_en.py +--- a/syncplay/messages_en.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_en.py (date 1706899550287) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} authenticated as a room operator", + "created-controlled-room-notification": "Created managed room '{}' with password '{}'. Please save this information for future reference!\n\nIn managed rooms everyone is kept in sync with the room operator(s) who are the only ones who can pause, unpause, seek, and change the playlist.\n\nYou should ask regular viewers to join the room '{}' but the room operators can join the room '{}' to automatically authenticate themselves.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready ++ + "file-different-notification": "File you are playing appears to be different from {}'s", # User + "file-differences-notification": "Your file differs in the following way(s): {}", # Differences + "room-file-differences": "File differences: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", + "commandlist-notification/help": "\th - this help", + "commandlist-notification/toggle": "\tt - toggles whether you are ready to watch or not", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", + "commandlist-notification/create": "\tc [name] - create managed room using name of current room", + "commandlist-notification/auth": "\ta [password] - authenticate as room operator with operator password", + "commandlist-notification/chat": "\tch [message] - send a chat message in a room", +@@ -158,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "readiness", # used for not-supported-by-server-error + "feature-managedRooms": "managed rooms", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error + + "not-supported-by-server-error": "The {} feature is not supported by this server..", # feature + "shared-playlists-not-supported-by-server-error": "The shared playlists feature may not be supported by the server. To ensure that it works correctly requires a server running Syncplay {}+, but the server is running Syncplay {}.", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "You are using Syncplay {} but a newer version is available from https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User ++ "not-ready-chat-message": "I have set {} as not ready.", # User + + # Server notifications + "welcome-server-notification": "Welcome to Syncplay server, ver. {0}", # version +@@ -538,6 +546,9 @@ + "openusersstream-menu-label": "Open {}'s stream", # [username]'s + "openusersfile-menu-label": "Open {}'s file", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] ++ + "playlist-instruction-item-message": "Drag file here to add it to the shared playlist.", + "sharedplaylistenabled-tooltip": "Room operators can add files to a synced playlist to make it easy for everyone to watching the same thing. Configure media directories under 'Misc'.", + +Index: syncplay/messages_pt_BR.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_pt_BR.py b/syncplay/messages_pt_BR.py +--- a/syncplay/messages_pt_BR.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_pt_BR.py (date 1706899550330) +@@ -62,6 +62,8 @@ + "authenticated-as-controller-notification": "{} autenticou-se como um operador da sala", + "created-controlled-room-notification": "Criou a sala gerenciada '{}' com a senha '{}'. Por favor, salve essa informação para futura referência!\n\nEm uma sala gerenciada, todos são mantidos em sincronia com o(s) operador(es) de sala, que é/são o(s) único(s) que pode(m) pausar, despausar, pular, e mudar a playlist.\n\nVocê deve pedir usuários comuns para se entrarem à sala '{}', mas os operadores de sala podem se entrar à sala '{}' para autenticarem-se automaticamente.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate + + "file-different-notification": "O arquivo que você está tocando parece ser diferente do arquivo de {}", # User + "file-differences-notification": "Seus arquivos se diferem da(s) seguinte(s) forma(s): {}", # Differences +@@ -99,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duração - Desloca a reprodução local pelo valor de duração fornecido (em segundos ou min:seg) em relação à posição de tepmo do servidor - essa é uma função descontinuada", + "commandlist-notification/help": "\th - esta mensagem de ajuda", + "commandlist-notification/toggle": "\tt - alterna o seu status de prontidão para assistir", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nome] - cria uma sala gerenciada usando o nome da sala atual", + "commandlist-notification/auth": "\ta [senha] - autentica-se como operador da sala com a senha", + "commandlist-notification/chat": "\tch [mensagem] - envia uma mensagem no chat da sala", +@@ -159,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "prontidão", # used for not-supported-by-server-error + "feature-managedRooms": "salas gerenciadas", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "O recurso {} não é suportado por este servidor.", # feature + "shared-playlists-not-supported-by-server-error": "O recurso de playlists compartilhadas pode não ser suportado por este servidor. Para garantir que funcione corretamente, é necessário um servidor rodando Syncplay {} ou superior, mas este está rodando Syncplay {}.", # minVersion, serverVersion +@@ -474,6 +479,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Você está usando o Syncplay {}, mas uma versão mais nova está disponível em https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "AVISO: Este servidor usa salas persistentes, o que significa que as informações da playlist são salvas entre sessões de reprodução. Se você quer criar uma sala onde a informação não será salva, coloque -temp no final do nome da sala.", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Seja bem-vindo ao servidor de Syncplay, versão {0}", # version +@@ -538,6 +545,9 @@ + "openusersstream-menu-label": "Abrir transmissão de {}", # [username]'s + "openusersfile-menu-label": "Abrir arquivo de {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Arraste um arquivo aqui para adicioná-lo à playlist compartilhada.", + "sharedplaylistenabled-tooltip": "Operadores da sala podem adicionar arquivos para a playlist compartilhada para tornar mais fácil para todo mundo assistir a mesma coisa. Configure os diretórios de mídia em 'Miscelânea'.", + +Index: syncplay/messages_fi.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_fi.py b/syncplay/messages_fi.py +--- a/syncplay/messages_fi.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_fi.py (date 1706899550316) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} tunnistautui huoneen operaattoriksi", + "created-controlled-room-notification": "Luotiin hallittu huone '{}' salasanalla '{}'. Kirjoita tämä talteen tulevaisuudessa löydettäväksi!\n\nHallinnoiduissa huoneissa kaikkien osallistujien kohdat pidetään synkronoituneena huoneen operaattori(e)n kanssa ja vain he voivat tauottaa, jatkaa tai kelata ja muuttaa soittolistaa.\n\nSinun tulisi pyytää vakiokatsojia liittymään huoneeseen '{}' huoneen operaattorit taas voivat liittyä huoneeseen '{}' tunnistautuakseen automaattisesti.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Vaikutat toistavan eri tiedostoa verrattuna käyttäjään {}", # User + "file-differences-notification": "Tiedostosi poikkeaa seuraavasti: {}", # Differences + "room-file-differences": "Tiedostoerot: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]kesto - tee aikaero palvelimeen paikallisesti keston verran - tämä ominaisuus on deprekoitu", + "commandlist-notification/help": "\th - tämä ohje", + "commandlist-notification/toggle": "\tt - määrittää oletko valmis aloittamaan katselun vaiko et", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nimi] - tee tästä huoneesta hallittu", + "commandlist-notification/auth": "\ta [salasana] - tunnistaudu operaattoriksi salasanalla", + "commandlist-notification/chat": "\tch [viesti] - lähetä viesti huoneeseen", +@@ -158,6 +163,7 @@ + "feature-chat": "keskustelu", # used for not-supported-by-server-error + "feature-readiness": "valmius", # used for not-supported-by-server-error + "feature-managedRooms": "hallinnoidut huoneet", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "Tämä {} ominaisuus ei ole tämän palvelimen tukema..", # feature + "shared-playlists-not-supported-by-server-error": "Jaetut toistoluettelot eivät välttämättä ole palvelimen tukemia. Varmistaaksesi että kaikki toimii oikein vaaditaan palvelin jossa ajetaan Syncplaytä {}+, mutta palvelin ajaa Syncplayn versiota {}.", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Käytät Syncplay:tä {} mutta uudempi julkaisu on tarjolla osoitteessa https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "HUOMIO: Tämä palvelin käyttää pysyviä huoneita, joka tarkoittaa, että toistoluettelojen tieto taltioidaan toistoistuntojen välillä. Mikäli halkuat luoda huoneen jossa tietoja ei tallenneta, laita vipu -temp huoneen nimen perään.", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Tervetuloa Syncplay-palvelimelle, ver. {0}", # version +@@ -534,6 +542,9 @@ + "openusersstream-menu-label": "Avaa {}'n suoratoisto", # [username]'s + "openusersfile-menu-label": "Avaa {}'n tiedosto", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Raahaa tiedosto tähän lisätäksesi sen jaettuun toistoluetteloon.", + "sharedplaylistenabled-tooltip": "Huonevalvojat voivat lisätä tiedostoja yhdennettävään toistoluetteloon tehdäkseen kaikille helpoksi katsoa samaa asiaa. Määritä mediahakemistot kohteen 'Muut' alta.", + +Index: syncplay/messages_fr.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_fr.py b/syncplay/messages_fr.py +--- a/syncplay/messages_fr.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_fr.py (date 1706899550265) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} authentifié en tant qu'opérateur de salle", + "created-controlled-room-notification": "Salle gérée créée «{}» avec le mot de passe «{}». Veuillez conserver ces informations pour référence future !\n\nDans les salons gérés, tout le monde est synchronisé avec le ou les opérateurs de salon qui sont les seuls à pouvoir mettre en pause, reprendre, se déplacer dans la lecture et modifier la liste de lecture.\n\nVous devez demander aux spectateurs réguliers de rejoindre le salon '{}' mais les opérateurs de salon peuvent rejoindre le salon '{}' pour s'authentifier automatiquement.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Le fichier que vous lisez semble être différent de celui de {}", # User + "file-differences-notification": "Votre fichier diffère de la (des) manière(s) suivante(s): {}", # Differences + "room-file-differences": "Différences de fichiers: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - cette aide", + "commandlist-notification/toggle": "\tt - bascule si vous êtes prêt à regarder ou non", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nom] - crée une salle gérée en utilisant le nom de la salle actuelle", + "commandlist-notification/auth": "\tun [mot de passe] - s'authentifier en tant qu'opérateur de salle avec le mot de passe opérateur", + "commandlist-notification/chat": "\tch [message] - envoyer un message de chat dans une pièce", +@@ -158,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "préparation", # used for not-supported-by-server-error + "feature-managedRooms": "salons gérés", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "La fonctionnalité {} n'est pas prise en charge par ce serveur.", # feature + "shared-playlists-not-supported-by-server-error": "La fonctionnalité de listes de lecture partagées peut ne pas être prise en charge par le serveur. Pour s'assurer qu'il fonctionne correctement, il faut un serveur exécutant Syncplay {}+, mais le serveur exécute Syncplay {}.", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Vous utilisez Syncplay {} mais une version plus récente est disponible sur https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # NOTE: Do not translate the word -temp # TODO: Translate ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Bienvenue sur le serveur Syncplay, ver.", # version +@@ -538,6 +546,9 @@ + "openusersstream-menu-label": "Ouvrir le flux de {}", # [username]'s + "openusersfile-menu-label": "Ouvrir le fichier de {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Faites glisser le fichier ici pour l'ajouter à la liste de lecture partagée.", + "sharedplaylistenabled-tooltip": "Les opérateurs de salle peuvent ajouter des fichiers à une liste de lecture synchronisée pour permettre à tout le monde de regarder facilement la même chose. Configurez les répertoires multimédias sous «Divers».", + +Index: syncplay/messages_ru.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_ru.py b/syncplay/messages_ru.py +--- a/syncplay/messages_ru.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_ru.py (date 1706899550338) +@@ -61,6 +61,10 @@ + "failed-to-identify-as-controller-notification": "{} не прошел идентификацию в качестве оператора комнаты.", + "authenticated-as-controller-notification": "{} вошёл как оператор комнаты.", + "created-controlled-room-notification": "Создана управляемая комната '{}' с паролем '{}'. Сохраните эти данные!\n\nВ управляемых комнатах всех синхронизируют с оператором (-ами) комнаты, только у которых есть права ставить и снимать с паузы, перематывать и изменять список воспроизведения.\n\nПопросите обычных зрителей подключиться к комнате '{}', а операторы могут подключиться к комнате '{}', чтобы автоматически авторизироваться.", # RoomName, operatorPassword, roomName, roomName:operatorPassword ++ ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Вероятно, файл, который вы смотрите, отличается от того, который смотрит {}.", # User + "file-differences-notification": "Ваш файл отличается: {}", # Differences + "room-file-differences": "Несовпадения файла: {}", # File differences (filename, size, and/or duration) +@@ -97,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - помощь", + "commandlist-notification/toggle": "\tt - переключить статус готов/не готов к просмотру", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [имя комнаты] - создать управляемую комнату с таким же именем, как у текущей", + "commandlist-notification/auth": "\ta [пароль] - авторизоваться как оператор комнаты с помощью пароля", + "commandlist-notification/chat": "\tch [сообщение] - выслать сообщение в комнату", +@@ -157,6 +163,7 @@ + "feature-chat": "чат", # used for not-supported-by-server-error + "feature-readiness": "готовность", # used for not-supported-by-server-error + "feature-managedRooms": "управляемые комнаты", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "Возможность '{}' не поддерживается сервером.", # feature + "shared-playlists-not-supported-by-server-error": "Общие списки воспроизведения могут не поддерживаться сервером. Для корректной работы требуется сервер Syncplay {}+, вы подключены к серверу Syncplay {}.", # minVersion, serverVersion +@@ -471,6 +478,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Вы используете Syncplay версии {}. На https://syncplay.pl/ доступна более новая версия.", # ClientVersion + "persistent-rooms-notice": "ВНИМАНИЕ: Этот сервер использует постоянные комнаты, это означает что информация списка воспроизведения сохраняется между сеансами воспроизведения. Если вы хотите создать комнату, в которой информация не сохраняется, поставьте -temp в конце названия комнаты.", ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Добро пожаловать на сервер Syncplay версии {0}", # version +@@ -533,6 +542,9 @@ + "openusersstream-menu-label": "Открыть поток {}", + "openusersfile-menu-label": "Открыть файл {}", + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Перетащите сюда файлы, чтобы добавить их в общий список.", + "sharedplaylistenabled-tooltip": "Оператор комнаты может добавлять файлы в список общего воспроизведения для удобного совместного просмотра. Папки воспроизведения настраиваются в меню 'Файл'.", + +Index: syncplay/messages_tr.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_tr.py b/syncplay/messages_tr.py +--- a/syncplay/messages_tr.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_tr.py (date 1706899550346) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{}, oda operatörü olarak doğrulandı", + "created-controlled-room-notification": "Yönetilen oda '{}' '{}' şifresiyle oluşturuldu. Lütfen bu bilgileri ileride başvurmak üzere kaydedin!\n\nYönetilen odalarda, oynatma listesini duraklatabilen, devam ettirebilen, arayabilen ve değiştirebilen tek kişi olan oda operatörleri ile herkes senkronize edilir.\n\nNormal izleyicilerden '{}' odasına katılmalarını istemelisiniz, ancak oda operatörleri kendilerini otomatik olarak doğrulamak için '{}' odasına katılabilir.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Oynadığınız dosya, {} dosyasından farklı görünüyor", # User + "file-differences-notification": "Dosyanız aşağıdaki şekil(ler)de farklılık gösterir: {}", # Differences + "room-file-differences": "Dosya farklılıkları: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - yardım", + "commandlist-notification/toggle": "\tt - izlemeye hazır olup olmadığınızı değiştirir", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [name] - mevcut odanın adını kullanarak yönetilen oda oluştur", + "commandlist-notification/auth": "\ta [password] - operatör şifresi ile oda operatörü olarak kimlik doğrular", + "commandlist-notification/chat": "\tch [message] - bir odaya sohbet mesajı gönderir", +@@ -158,6 +163,7 @@ + "feature-chat": "sohbet", # used for not-supported-by-server-error + "feature-readiness": "hazırlık", # used for not-supported-by-server-error + "feature-managedRooms": "yönetilen odalar", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "{} özelliği bu sunucu tarafından desteklenmiyor ..", # feature + "shared-playlists-not-supported-by-server-error": "Paylaşılan çalma listeleri özelliği sunucu tarafından desteklenmeyebilir. Doğru çalıştığından emin olmak için Syncplay {}+ çalıştıran bir sunucu gerektirir, ancak sunucu Syncplay {} çalıştırmaktadır.", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Syncplay {} kullanıyorsunuz ancak daha yeni bir sürüm https://syncplay.pl adresinde mevcut", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # TO DO: Translate - NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Syncplay sunucusuna hoş geldiniz, ver. {0}", # version +@@ -538,6 +546,9 @@ + "openusersstream-menu-label": "{} kişisinin akışını açın", # [username]'s + "openusersfile-menu-label": "{} kişisinin dosyasını açın", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Dosyayı paylaşılan çalma listesine eklemek için buraya sürükleyin.", + "sharedplaylistenabled-tooltip": "Oda operatörleri, herkesin aynı şeyi izlemesini kolaylaştırmak için senkronize edilmiş bir çalma listesine dosya ekleyebilir. 'Misc' altında ortam dizinlerini yapılandırın.", + +Index: syncplay/messages_pt_PT.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_pt_PT.py b/syncplay/messages_pt_PT.py +--- a/syncplay/messages_pt_PT.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_pt_PT.py (date 1706899550295) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} autenticou-se como um administrador da sala", + "created-controlled-room-notification": "Criou a sala controlada '{}' com a senha '{}'. Por favor, guarda essa informação para futura referência!\n\nIn managed rooms everyone is kept in sync with the room operator(s) who are the only ones who can pause, unpause, seek, and change the playlist.\n\nYou should ask regular viewers to join the room '{}' but the room operators can join the room '{}' to automatically authenticate themselves.", # RoomName, operatorPassword, roomName, roomName:operatorPassword # TODO: Translate + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "O ficheiro que você está tocando parece ser diferente do ficheiro de {}", # User + "file-differences-notification": "Seus ficheiros se diferem da(s) seguinte(s) forma(s): {}", # Differences + "room-file-differences": "Diferenças de ficheiros: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - esta mensagem de ajuda", + "commandlist-notification/toggle": "\tt - alterna o seu status de prontidão para assistir", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nome] - cria sala gerenciada usando o nome da sala atual", + "commandlist-notification/auth": "\ta [senha] - autentica-se como administrador da sala com a senha", + "commandlist-notification/chat": "\tch [mensagem] - envia uma mensagem no chat da sala", +@@ -158,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "prontidão", # used for not-supported-by-server-error + "feature-managedRooms": "salas administradas", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "O recurso {} não é suportado por este servidor.", # feature + "shared-playlists-not-supported-by-server-error": "O recurso de playlists compartilhadas pode não ser suportado por este servidor. Para garantir que funcione corretamente, é necessário um servidor a correr Syncplay {} ou superior, mas este está correndoo Syncplay {}.", # minVersion, serverVersion +@@ -473,6 +479,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Você está usando o Syncplay {}, mas uma versão mais nova está disponível em https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # TO DO: Translate - NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Seja bem-vindo ao servidor de Syncplay, versão {0}", # version +@@ -537,6 +545,9 @@ + "openusersstream-menu-label": "Abrir transmissão de {}", # [username]'s + "openusersfile-menu-label": "Abrir ficheiro de {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Arraste um ficheiro aqui para adicioná-lo à playlist compartilhada.", + "sharedplaylistenabled-tooltip": "Operadores da sala podem adicionar ficheiros para a playlist compartilhada para tornar mais fácil para todo mundo assistir a mesma coisa. Configure os pastas de mídia em 'Miscelânea'.", + +Index: syncplay/constants.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/constants.py b/syncplay/constants.py +--- a/syncplay/constants.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/constants.py (date 1706885764371) +@@ -131,6 +131,8 @@ + COMMANDS_SELECT = ['select', 'qs'] + COMMANDS_DELETE = ['delete', 'd', 'qd'] + COMMANDS_NEXT = ["next", "qn"] ++COMMANDS_SETREADY = ['setready', 'sr'] ++COMMANDS_SETNOTREADY = ['setready', 'snr'] + MPC_MIN_VER = "1.6.4" + MPC_BE_MIN_VER = "1.5.2.3123" + VLC_MIN_VERSION = "2.2.1" +@@ -142,6 +144,7 @@ + SHARED_PLAYLIST_MIN_VERSION = "1.4.0" + CHAT_MIN_VERSION = "1.5.0" + FEATURE_LIST_MIN_VERSION = "1.5.0" ++SET_OTHERS_READINESS_MIN_VERSION = "1.7.2" + + IINA_PATHS = ['/Applications/IINA.app/Contents/MacOS/IINA'] + MPC_PATHS = [ +Index: syncplay/messages_zh_CN.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_zh_CN.py b/syncplay/messages_zh_CN.py +--- a/syncplay/messages_zh_CN.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_zh_CN.py (date 1706899550309) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{}成为了管理员", + "created-controlled-room-notification": "已创建房间:'{}' ,密码是'{}'。请保存好以上信息以备用!\n\n只有房主或管理员可以暂停,继续播放,跳转播放,改变播放列表。每个人都与房主或管理员的播放进度同步。\n\n最近观看过的人都可加入'{}'房间,但只有房主或管理员在加入'{}'房间时才会自动认证为管理员。", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "您正在播放的视频与{}不一致", # User + "file-differences-notification": "你们播放的视频文件{}不一致", # Differences + "room-file-differences": "播放文件不同点:{}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - 将本地的播放偏移量设置为给定时长(输入格式可为秒或分:秒),您的本地播放进度将与服务器不一致,因此极不推荐使用该设置", + "commandlist-notification/help": "\th - 帮助菜单", + "commandlist-notification/toggle": "\tt - 准备/取消准备", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [name] - 以给定房间名创建一个由您管理的房间", + "commandlist-notification/auth": "\ta [password] - 用给定密码来认证为管理员", + "commandlist-notification/chat": "\tch [message] - 发送聊天信息", +@@ -158,6 +163,7 @@ + "feature-chat": "聊天", # used for not-supported-by-server-error + "feature-readiness": "准备状态", # used for not-supported-by-server-error + "feature-managedRooms": "房间管理", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "该服务器不支持{}功能", # feature + "shared-playlists-not-supported-by-server-error": "服务器可能不支持共享播放列表的功能。为确保其正常运行,需要一个运行Syncplay {}以上版本的服务器,但服务器是运行Syncplay {}的。", # minVersion, serverVersion +@@ -474,6 +480,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "您正在使用Syncplay {}版本,但已有较新的版本可从https://syncplay.pl下载。", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "欢迎使用Syncplay服务端,当前版本{0}", # version +@@ -538,6 +546,9 @@ + "openusersstream-menu-label": "打开{}的媒体流", # [username]'s + "openusersfile-menu-label": "打开{}的文件", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "把文件拖到这里,就可以把它添加到共享播放列表中。", + "sharedplaylistenabled-tooltip": "房间管理员可以将文件添加到共享播放列表中,以方便大家观看同样的东西。可以在其他设置中配置媒体目录。", + +Index: syncplay/messages_ko.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_ko.py b/syncplay/messages_ko.py +--- a/syncplay/messages_ko.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_ko.py (date 1706899550323) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{}님이 방 운영자로 인증되었습니다", + "created-controlled-room-notification": "'{}' 방을 '{}' 비밀번호로 관리되게 만들었습니다. 나중에 참조할 수 있도록 이 정보를 저장하세요!\n\n관리되는 방에서는 모든 사람이 재생목록을 일시 중지, 일시 중지 해제, 검색 및 변경할 수 있는 유일한 사람인 방 운영자와 동기화 상태를 유지합니다.\n\n일반 시청자에게 '{}' 방에 참여하도록 요청해야 하지만, 방 운영자는 '{}' 방에 참여하여 자동으로 자신을 인증할 수 있습니다.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "재생 중인 파일이 {}님의 파일과 다른 것 같습니다", # User + "file-differences-notification": "다음과 같은 방식으로 당신의 파일이 다릅니다: {}", # Differences + "room-file-differences": "파일 차이점: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - 서버 탐색 위치에서 지정된 시간(초 또는 분:초)만큼 로컬 재생을 오프셋합니다 - 이 기능은 사용되지 않습니다", + "commandlist-notification/help": "\th - 이 도움말", + "commandlist-notification/toggle": "\tt - 시청 준비 여부를 전환합니다", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [name] - 현재 방의 이름을 사용하여 관리되는 방을 만듭니다", + "commandlist-notification/auth": "\ta [password] - 운영자 비밀번호를 사용해 방 운영자로 인증합니다", + "commandlist-notification/chat": "\tch [message] - 방에서 채팅 메시지를 전송합니다", +@@ -158,6 +163,7 @@ + "feature-chat": "채팅", # used for not-supported-by-server-error + "feature-readiness": "준비", # used for not-supported-by-server-error + "feature-managedRooms": "관리되는 방", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "{} 기능은 이 서버에서 지원되지 않습니다..", # feature + "shared-playlists-not-supported-by-server-error": "공유 재생목록 기능은 서버에서 지원하지 않을 수 있습니다. 올바르게 작동하려면 Syncplay {}+를 실행하는 서버가 필요하지만 서버는 Syncplay {}를 실행하고 있습니다.", # minVersion, serverVersion +@@ -473,6 +479,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Syncplay {}를 사용 중이지만 https://syncplay.pl에서 최신 버전을 사용할 수 있습니다", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Syncplay 서버에 오신 것을 환영합니다. 버전 {0}", # version +@@ -533,6 +541,9 @@ + "openusersstream-menu-label": "{}의 스트림 열기", # [username]'s + "openusersfile-menu-label": "{}의 파일 열기", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "파일을 여기로 드래그하여 공유 재생목록에 추가하세요.", + "sharedplaylistenabled-tooltip": "방 운영자는 동기화된 재생목록에 파일을 추가하여 모든 사람이 쉽게 같은 내용을 볼 수 있도록 할 수 있습니다. '기타'에서 미디어 디렉터리를 구성합니다.", + +Index: syncplay/messages_eo.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_eo.py b/syncplay/messages_eo.py +--- a/syncplay/messages_eo.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_eo.py (date 1706899550273) +@@ -64,6 +64,9 @@ + "authenticated-as-controller-notification": "{} identiĝis ĉambrestro", + "created-controlled-room-notification": "Kreis estratan ĉambron «{}» kun pasvorto «{}». Bonvolu konservi tiujn informojn osen!\n\nEn estrataj ĉambroj, ĉiu spegulas la ĉambrestrojn, kiuj estas la solaj, kiuj povas paŭzigi, malpaŭzigi, iri, kaj ŝanĝi la ludliston.\n\nVi petu ordinarajn spektantojn aliĝi la ĉambron «{}», sed ĉambrestroj povas aliĝi la ĉambron «{}» por memage aŭtentikiĝi.", # RoomName, operatorPassword, roomName, roomName:operatorPassword + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "La dosiero, kiun vi ludas, ŝajnas malsama de tiu de {}", # User + "file-differences-notification": "Via dosiero malsamas per ĉi tiuj manieroj: {}", # Differences + "room-file-differences": "Malsamoj inter dosieroj: {}", # File differences (filename, size, and/or duration) +@@ -100,6 +103,8 @@ + "commandlist-notification/offset": "\to[+-]daŭro - fruigi lokan ludadon je la donita daŭro (en sekundoj aŭ minutoj:sekundoj), kompare al la servila pozicio – ĉi tiu kapablo ne plu estos subtenata", + "commandlist-notification/help": "\th – tiu ĉi helpilo", + "commandlist-notification/toggle": "\tt – ŝanĝas ĉu vi pretas spekti aŭ ne", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nomo] – krei estratan ĉambron kun nomo de la nuna ĉambro", + "commandlist-notification/auth": "\ta [pasvorto] – aŭtentikiĝi ĉambrestro per ĉambrestra pasvorto", + "commandlist-notification/chat": "\tch [mesaĝo] – sendi babilan mesaĝon al ĉambro", +@@ -161,6 +166,7 @@ + "feature-chat": "babilado", # used for not-supported-by-server-error + "feature-readiness": "preteco", # used for not-supported-by-server-error + "feature-managedRooms": "estrataj ĉambroj", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "La kapablo «{}» ne estas subtenata de ĉi tiu servilo.", # feature + "shared-playlists-not-supported-by-server-error": "La servilo eble ne subtenas komunajn ludlistojn. Ĝusta funkciado postulas servilon kun Syncplay {}+, sed la servilo havas nur version {}.", # minVersion, serverVersion +@@ -477,6 +483,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Vi uzas version {} de Syncplay, sed pli nova versio estas disponebla per https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "AVIZO: Ĉi tiu servilo uzas persistajn ĉámbrojn, kio signifas, ke la informoj pri ludlistoj konserviĝas por venontaj kunspektoj. Se vi volas krei ĉambron kie la informoj ne konserviĝas, finu la nomon de la ĉambro per «-temp».", # NOTE: Do not translate the word -temp ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Bonvenu al servilo de Syncplay, versio {0}", # version +@@ -541,6 +549,9 @@ + "openusersstream-menu-label": "Malfermi elsendon de {}", # [username]'s + "openusersfile-menu-label": "Malfermi dosieron de {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Metu dosieron ĉi tien por aldoni ĝin al la komuna ludlisto.", + "sharedplaylistenabled-tooltip": "Ĉambrestroj povas aldoni dosierojn al spegulata ludlisto, por ke ĉiuj povu facile spekti la saman filmon. Agordu vidaŭdaĵajn dosierojn sub «Diversaj».", + +Index: syncplay/server.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/server.py b/syncplay/server.py +--- a/syncplay/server.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/server.py (date 1706900433852) +@@ -97,6 +97,7 @@ + features["maxUsernameLength"] = self.maxUsernameLength + features["maxRoomNameLength"] = constants.MAX_ROOM_NAME_LENGTH + features["maxFilenameLength"] = constants.MAX_FILENAME_LENGTH ++ features["setOthersReadiness"] = True + + return features + +@@ -213,9 +214,22 @@ + messageDict = {"message": message, "username": watcher.getName()} + self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict)) + +- def setReady(self, watcher, isReady, manuallyInitiated=True): +- watcher.setReady(isReady) +- self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), watcher.isReady(), manuallyInitiated)) ++ def setReady(self, watcher, isReady, manuallyInitiated=True, username=None): ++ if username and username != watcher.getName(): ++ room = watcher.getRoom() ++ if room.canControl(watcher): ++ for watcherToSet in room.getWatchers(): ++ if watcherToSet.getName() == username: ++ watcherToSet.setReady(isReady) ++ self._roomManager.broadcastRoom(watcherToSet, lambda w: w.sendSetReady(watcherToSet.getName(), watcherToSet.isReady(), manuallyInitiated, watcher.getName())) ++ if isReady: ++ messageDict = { "message": getMessage("ready-chat-message").format(username, watcherToSet.getName()), "username": watcher.getName()} ++ else: ++ messageDict = {"message": getMessage("not-ready-chat-message").format(username, watcherToSet.getName()), "username": watcher.getName()} ++ self._roomManager.broadcastRoom(watcher, lambda w: w.sendChatMessage(messageDict, "setOthersReadiness")) ++ else: ++ watcher.setReady(isReady) ++ self._roomManager.broadcastRoom(watcher, lambda w: w.sendSetReady(watcher.getName(), watcher.isReady(), manuallyInitiated)) + + def setPlaylist(self, watcher, files): + room = watcher.getRoom() +@@ -777,8 +791,10 @@ + def sendControlledRoomAuthStatus(self, success, username, room): + self._connector.sendControlledRoomAuthStatus(success, username, room) + +- def sendChatMessage(self, message): ++ def sendChatMessage(self, message, skipIfSupportsFeature): + if self._connector.meetsMinVersion(constants.CHAT_MIN_VERSION): ++ if skipIfSupportsFeature and self.supportsFeature(skipIfSupportsFeature): ++ return + self._connector.sendMessage({"Chat": message}) + + def sendList(self, toGUIOnly=False): +@@ -798,8 +814,12 @@ + uiMode = constants.FALLBACK_ASSUMED_UI_MODE + return uiMode == constants.GRAPHICAL_UI_MODE + +- def sendSetReady(self, username, isReady, manuallyInitiated=True): +- self._connector.sendSetReady(username, isReady, manuallyInitiated) ++ def supportsFeature(self, clientFeature): ++ clientFeatures = self._connector.getFeatures() ++ return clientFeatures[clientFeature] if clientFeature in clientFeatures else False ++ ++ def sendSetReady(self, username, isReady, manuallyInitiated=True, setByUsername=None): ++ self._connector.sendSetReady(username, isReady, manuallyInitiated, setByUsername) + + def setPlaylistIndex(self, username, index): + self._connector.setPlaylistIndex(username, index) +Index: syncplay/ui/gui.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py +--- a/syncplay/ui/gui.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/ui/gui.py (date 1706899321000) +@@ -819,6 +819,15 @@ + path = self._syncplayClient.fileSwitch.findFilepath(filename) + if path: + menu.addAction(QtGui.QPixmap(resourcespath + "folder_film.png"), getMessage('open-containing-folder'), lambda: utils.open_system_file_browser(path)) ++ ++ ++ if roomToJoin == self._syncplayClient.getRoom() and self._syncplayClient.userlist.currentUser.canControl() and self._syncplayClient.userlist.isReadinessSupported() and self._syncplayClient.serverFeatures["setOthersReadiness"]: ++ if self._syncplayClient.userlist.isReady(username): ++ addSetUserAsReadyText = getMessage("setasnotready-menu-label").format(shortUsername) ++ menu.addAction(QtGui.QPixmap(resourcespath + "cross.png"), addSetUserAsReadyText, lambda: self._syncplayClient.setOthersReadiness(username, False)) ++ else: ++ addSetUserAsNotReadyText = getMessage("setasnotready-menu-label").format(shortUsername) ++ menu.addAction(QtGui.QPixmap(resourcespath + "tick.png"), addSetUserAsNotReadyText, lambda: self._syncplayClient.setOthersReadiness(username, True)) + else: + return + menu.exec_(self.listTreeView.viewport().mapToGlobal(position)) +Index: syncplay/ui/consoleUI.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/ui/consoleUI.py b/syncplay/ui/consoleUI.py +--- a/syncplay/ui/consoleUI.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/ui/consoleUI.py (date 1706898721841) +@@ -231,6 +231,20 @@ + elif command.group('command') in constants.COMMANDS_NEXT: + self._syncplayClient.playlist.loadNextFileInPlaylist() + ++ elif command.group('command') in constants.COMMANDS_SETREADY: ++ try: ++ username = command.group('parameter') ++ self._syncplayClient.setOthersReadiness(username, True) ++ except: ++ pass ++ ++ elif command.group('command') in constants.COMMANDS_SETNOTREADY: ++ try: ++ username = command.group('parameter') ++ self._syncplayClient.setOthersReadiness(username, False) ++ except: ++ pass ++ + else: + if self._tryAdvancedCommands(data): + return +Index: syncplay/messages_it.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_it.py b/syncplay/messages_it.py +--- a/syncplay/messages_it.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_it.py (date 1706899550280) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} autenticato come gestore della stanza", + "created-controlled-room-notification": "Stanza gestita '{}' creata con password '{}'. Per favore salva queste informazioni per una consultazione futura!\n\nIn managed rooms everyone is kept in sync with the room operator(s) who are the only ones who can pause, unpause, seek, and change the playlist.\n\nYou should ask regular viewers to join the room '{}' but the room operators can join the room '{}' to automatically authenticate themselves.", # RoomName, operatorPassword, roomName, roomName:operatorPassword # TODO: Translate + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "Il file che stai riproducendo sembra essere diverso da quello di {}", # User + "file-differences-notification": "Il tuo file mostra le seguenti differenze: {}", # Differences + "room-file-differences": "Differenze: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - mostra questo help", + "commandlist-notification/toggle": "\tt - attiva o disattiva la funzionalità \"pronto\"", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nome] - crea una stanza gestita usando il nome della stanza attuale", + "commandlist-notification/auth": "\ta [password] - autentica come gestore della stanza, utilizzando la password del gestore", + "commandlist-notification/chat": "\tch [message] - invia un messaggio nella chat della stanza", +@@ -158,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "pronto", # used for not-supported-by-server-error + "feature-managedRooms": "stanze gestite", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "La feature {} non è supportata da questo server..", # feature + "shared-playlists-not-supported-by-server-error": "Le playlist condivise potrebbero non essere supportata dal server. È necessario un server con Syncplay {}+ per assicurarsi che funzionino correttamente, tuttavia il server sta utilizzando Syncplay {}.", # minVersion, serverVersion +@@ -473,6 +479,8 @@ + # Server messages to client + "new-syncplay-available-motd-message": "Stai usando Syncplay {} ma una nuova versione è disponibile presso https://syncplay.pl", # ClientVersion + "persistent-rooms-notice": "NOTICE: This server uses persistent rooms, which means that the playlist information is stored between playback sessions. If you want to create a room where information is not saved then put -temp at the end of the room name.", # TO DO: Translate - NOTE: Do not translate the word -temp to create a room where information is not saved then put -temp at the end of the room name.", # TO DO: Translate ++ "ready-chat-message": "I have set {} as ready.", # User # TODO: Translate ++ "not-ready-chat-message": "I have set {} as not ready.", # User # TODO: Translate + + # Server notifications + "welcome-server-notification": "Benvenuto nel server Syncplay, ver. {0}", # version +@@ -537,6 +545,9 @@ + "openusersstream-menu-label": "Apri l'indirizzo di {}", # [username] + "openusersfile-menu-label": "Apri il file di {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Trascina qui i file per aggiungerli alla playlist condivisa.", + "sharedplaylistenabled-tooltip": "Gli operatori della stanza possono aggiungere i file a una playlist sincronizzata per garantire che tutti i partecipanti stiano guardando la stessa cosa. Configura le cartelle multimediali alla voce 'Miscellanea'.", + +Index: syncplay/client.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/client.py b/syncplay/client.py +--- a/syncplay/client.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/client.py (date 1706900119461) +@@ -657,9 +657,9 @@ + "maxChatMessageLength": constants.FALLBACK_MAX_CHAT_MESSAGE_LENGTH, + "maxUsernameLength": constants.FALLBACK_MAX_USERNAME_LENGTH, + "maxRoomNameLength": constants.FALLBACK_MAX_ROOM_NAME_LENGTH, +- "maxFilenameLength": constants.FALLBACK_MAX_FILENAME_LENGTH ++ "maxFilenameLength": constants.FALLBACK_MAX_FILENAME_LENGTH, ++ "setOthersReadiness": utils.meetsMinVersion(self.serverVersion, constants.SET_OTHERS_READINESS_MIN_VERSION) + } +- + if featureList: + self.serverFeatures.update(featureList) + if not utils.meetsMinVersion(self.serverVersion, constants.SHARED_PLAYLIST_MIN_VERSION): +@@ -730,6 +730,7 @@ + features["readiness"] = True + features["managedRooms"] = True + features["persistentRooms"] = True ++ features["setOthersReadiness"] = True + + return features + +@@ -932,6 +933,10 @@ + message = utils.truncateText(message, constants.MAX_CHAT_MESSAGE_LENGTH) + self._protocol.sendChatMessage(message) + ++ @requireServerFeature("setOthersReadiness") ++ def setOthersReadiness(self, username, newReadyStatus): ++ self._protocol.setReady(newReadyStatus, True, username) ++ + def sendFeaturesUpdate(self, features): + self._protocol.sendFeaturesUpdate(features) + +@@ -1032,7 +1037,7 @@ + if newState != oldState: + self.toggleReady(manuallyInitiated) + +- def setReady(self, username, isReady, manuallyInitiated=True): ++ def setReady(self, username, isReady, manuallyInitiated=True, setBy=None): + oldReadyState = self.userlist.isReady(username) + if oldReadyState is None: + oldReadyState = False +@@ -1040,6 +1045,11 @@ + self.ui.userListChange() + if oldReadyState != isReady: + self._warnings.checkReadyStates() ++ if setBy: ++ if isReady: ++ self.ui.showMessage(getMessage("other-set-as-ready-notification").format(username, setBy)) ++ else: ++ self.ui.showMessage(getMessage("other-set-as-not-ready-notification").format(username, setBy)) + + @requireServerFeature("managedRooms") + def setUserFeatures(self, username, features): +Index: syncplay/messages_es.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/messages_es.py b/syncplay/messages_es.py +--- a/syncplay/messages_es.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/messages_es.py (date 1706899209488) +@@ -62,6 +62,9 @@ + "authenticated-as-controller-notification": "{} autentificado como operador de la sala", + "created-controlled-room-notification": "Sala administrada '{}' creada con contraseña '{}'. Por favor guarda esta información para referencias futuras!\n\nIn managed rooms everyone is kept in sync with the room operator(s) who are the only ones who can pause, unpause, seek, and change the playlist.\n\nYou should ask regular viewers to join the room '{}' but the room operators can join the room '{}' to automatically authenticate themselves.", # RoomName, operatorPassword, roomName, roomName:operatorPassword # TODO: Translate + ++ "other-set-as-ready-notification": "{} was set as ready by {}", # User set as ready, user who set them as ready # TODO: Translate ++ "other-set-as-not-ready-notification": "{} was set as not ready by {}", # User set as not ready, user who set them as not ready # TODO: Translate ++ + "file-different-notification": "El archivo que reproduces parece ser diferente al archivo de {}", # User + "file-differences-notification": "Tu archivo difiere de la(s) siguiente(s) forma(s): {}", # Differences + "room-file-differences": "Diferencias de archivo: {}", # File differences (filename, size, and/or duration) +@@ -98,6 +101,8 @@ + "commandlist-notification/offset": "\to[+-]duration - offset local playback by the given duration (in seconds or min:sec) from the server seek position - this is a deprecated feature", # TODO: Translate + "commandlist-notification/help": "\th - esta ayuda", + "commandlist-notification/toggle": "\tt - activa/inactiva señal que estás listo para ver", ++ "commandlist-notification/setready": "\tsr [name] - sets user as ready", # TODO: Translate ++ "commandlist-notification/setnotready": "\tsn [name] - sets user as not ready", # TODO: Translate + "commandlist-notification/create": "\tc [nombre] - crear sala administrada usando el nombre de la sala actual", + "commandlist-notification/auth": "\ta [contraseña] - autentificar como operador de la sala con la contraseña de operador", + "commandlist-notification/chat": "\tch [mensaje] - enviar un mensaje en la sala", +@@ -158,6 +163,7 @@ + "feature-chat": "chat", # used for not-supported-by-server-error + "feature-readiness": "preparación", # used for not-supported-by-server-error + "feature-managedRooms": "salas administradas", # used for not-supported-by-server-error ++ "feature-setOthersReadiness": "readiness override", # used for not-supported-by-server-error # TODO: Translate + + "not-supported-by-server-error": "La característica {} no está soportada por este servidor..", # feature + "shared-playlists-not-supported-by-server-error": "El servidor no admite la función de listas de reproducción compartidas. Para asegurarse de que funciona correctamente, se requiere un servidor que ejecute Syncplay {}+, pero el servidor está ejecutando Syncplay {}.", # minVersion, serverVersion +@@ -537,6 +543,9 @@ + "openusersstream-menu-label": "Abrir el flujo de {}", # [username]'s + "openusersfile-menu-label": "Abrir el archivo de {}", # [username]'s + ++ "setasready-menu-label": "Set {} as ready", # [Username] # TODO: Translate ++ "setasnotready-menu-label": "Set {} as not ready", # [Username] # TODO: Translate ++ + "playlist-instruction-item-message": "Desplazar aquí el archivo para agregarlo a la lista de reproducción compartida.", + "sharedplaylistenabled-tooltip": "Los operadores de la sala pueden agregar archivos a una lista de reproducción sincronizada, para que visualizar la misma cosa sea más sencillo para todos. Configurar directorios multimedia en 'Misc'.", + +Index: syncplay/protocols.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/syncplay/protocols.py b/syncplay/protocols.py +--- a/syncplay/protocols.py (revision 793804ede224d9b99d929d7da58071157d31caae) ++++ b/syncplay/protocols.py (date 1706899833645) +@@ -201,7 +201,8 @@ + elif command == "ready": + user, isReady = values["username"], values["isReady"] + manuallyInitiated = values["manuallyInitiated"] if "manuallyInitiated" in values else True +- self._client.setReady(user, isReady, manuallyInitiated) ++ setBy = values["setBy"] if "setBy" in values else None ++ self._client.setReady(user, isReady, manuallyInitiated, setBy) + elif command == "playlistIndex": + user = values['user'] + resetPosition = True +@@ -330,13 +331,22 @@ + userMessage = message['message'] + self._client.ui.showChatMessage(username, userMessage) + +- def setReady(self, isReady, manuallyInitiated=True): +- self.sendSet({ +- "ready": { +- "isReady": isReady, +- "manuallyInitiated": manuallyInitiated +- } +- }) ++ def setReady(self, isReady, manuallyInitiated=True, username=None): ++ if username: ++ self.sendSet({ ++ "ready": { ++ "isReady": isReady, ++ "manuallyInitiated": manuallyInitiated, ++ "username": username ++ } ++ }) ++ else: ++ self.sendSet({ ++ "ready": { ++ "isReady": isReady, ++ "manuallyInitiated": manuallyInitiated ++ } ++ }) + + def setPlaylist(self, files): + self.sendSet({ +@@ -566,7 +576,8 @@ + self._factory.authRoomController(self._watcher, password, room) + elif command == "ready": + manuallyInitiated = set_[1]['manuallyInitiated'] if "manuallyInitiated" in set_[1] else False +- self._factory.setReady(self._watcher, set_[1]['isReady'], manuallyInitiated=manuallyInitiated) ++ username = set_[1]['username'] if "username" in set_[1] else None ++ self._factory.setReady(self._watcher, set_[1]['isReady'], manuallyInitiated=manuallyInitiated, username=username) + elif command == "playlistChange": + self._factory.setPlaylist(self._watcher, set_[1]['files']) + elif command == "playlistIndex": +@@ -595,14 +606,24 @@ + } + }) + +- def sendSetReady(self, username, isReady, manuallyInitiated=True): +- self.sendSet({ +- "ready": { +- "username": username, +- "isReady": isReady, +- "manuallyInitiated": manuallyInitiated +- } +- }) ++ def sendSetReady(self, username, isReady, manuallyInitiated=True, setByUsername=None): ++ if setByUsername: ++ self.sendSet({ ++ "ready": { ++ "username": username, ++ "isReady": isReady, ++ "manuallyInitiated": manuallyInitiated, ++ "setBy": setByUsername ++ } ++ }) ++ else: ++ self.sendSet({ ++ "ready": { ++ "username": username, ++ "isReady": isReady, ++ "manuallyInitiated": manuallyInitiated ++ } ++ }) + + def setPlaylist(self, username, files): + self.sendSet({ diff --git a/syncplay/client.py b/syncplay/client.py index 2ede1314..7507cdaa 100755 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -44,8 +44,6 @@ from syncplay.messages import getMissingStrings, getMessage, isNoOSDMessage from syncplay.protocols import SyncClientProtocol from syncplay.utils import isMacOS - - class SyncClientFactory(ClientFactory): def __init__(self, client, retry=constants.RECONNECT_RETRIES): self._client = client @@ -74,6 +72,7 @@ def __init__(self, playerClass, ui, config): constants.FOLDER_SEARCH_FIRST_FILE_TIMEOUT = config['folderSearchFirstFileTimeout'] constants.FOLDER_SEARCH_TIMEOUT = config['folderSearchTimeout'] constants.FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL = config['folderSearchDoubleCheckInterval'] + constants.FOLDER_SEARCH_WARNING_THRESHOLD = config['folderSearchWarningThreshold'] self.controlpasswords = {} self.lastControlPasswordAttempt = None @@ -2197,6 +2196,9 @@ def _updateInfoThread(self): self.currentlyUpdating = True dirsToSearch = self.mediaDirectories + if not self.folderSearchEnabled: + return + if dirsToSearch: # Spin up hard drives to prevent premature timeout randomFilename = "RandomFile"+str(random.randrange(10000, 99999))+".txt" @@ -2216,13 +2218,21 @@ def _updateInfoThread(self): # Actual directory search newMediaFilesCache = {} startTime = time.time() + fileCount = 0 + lastWarningTime = None for directory in dirsToSearch: for root, dirs, files in os.walk(directory): + fileCount += 1 newMediaFilesCache[root] = files - if time.time() - startTime > constants.FOLDER_SEARCH_TIMEOUT: - self.directorySearchError = getMessage("folder-search-timeout-error").format(directory) + timeTakenSoFar = time.time() - startTime + if timeTakenSoFar > constants.FOLDER_SEARCH_TIMEOUT: + reactor.callLater(0.1, self._client.ui.showErrorMessage, getMessage("folder-search-timeout-error").format(directory, fileCount),False) self.folderSearchEnabled = False return + if timeTakenSoFar > constants.FOLDER_SEARCH_WARNING_THRESHOLD: + if not lastWarningTime or timeTakenSoFar - lastWarningTime >= 1: + reactor.callLater(0.1, self._client.ui.showErrorMessage, getMessage("folder-search-timeout-warning").format(int(timeTakenSoFar), fileCount, directory),False) + lastWarningTime = timeTakenSoFar if self.mediaFilesCache != newMediaFilesCache: self.mediaFilesCache = newMediaFilesCache @@ -2250,33 +2260,12 @@ def findFilepath(self, filename, highPriority=False): if os.path.isfile(filepath): return filepath - if highPriority and self.folderSearchEnabled and self.mediaDirectories is not None: + if self.folderSearchEnabled and self.mediaDirectories is not None: directoryList = self.mediaDirectories - # Spin up hard drives to prevent premature timeout - randomFilename = "RandomFile"+str(random.randrange(10000, 99999))+".txt" for directory in directoryList: - startTime = time.time() - if os.path.isfile(os.path.join(directory, randomFilename)): - randomFilename = "RandomFile"+str(random.randrange(10000, 99999))+".txt" - print("Found random file (?)") - if not self.folderSearchEnabled: - return - if time.time() - startTime > constants.FOLDER_SEARCH_FIRST_FILE_TIMEOUT: - self.folderSearchEnabled = False - self.directorySearchError = getMessage("folder-search-first-file-timeout-error").format(directory) - return - - startTime = time.time() - if filename and directoryList: - for directory in directoryList: - for root, dirs, files in os.walk(directory): - if filename in files: - return os.path.join(root, filename) - if time.time() - startTime > constants.FOLDER_SEARCH_TIMEOUT: - self.folderSearchEnabled = False - self.directorySearchError = getMessage("folder-search-timeout-error").format(directory) - return None - return None + filepath = os.path.join(directory, filename) + if os.path.isfile(filepath): + return filepath def areWatchedFilenamesInCache(self): if self.filenameWatchlist is not None: diff --git a/syncplay/constants.py b/syncplay/constants.py index 53ea057a..af64cda6 100755 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -107,6 +107,7 @@ def getValueForOS(constantDict): # Options for the File Switch feature: FOLDER_SEARCH_FIRST_FILE_TIMEOUT = 25.0 # Secs - How long to wait to find the first file in folder search (to take account of HDD spin up) FOLDER_SEARCH_TIMEOUT = 20.0 # Secs - How long to wait until searches in folder to update cache are aborted (after first file is found) +FOLDER_SEARCH_WARNING_THRESHOLD = 2.0 # Secs - how long until a warning saying how many files have been scanned FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL = 30.0 # Secs - Frequency of updating cache # Usually there's no need to adjust these @@ -364,4 +365,4 @@ def getValueForOS(constantDict): CONSOLE_UI_MODE = "CLI" GRAPHICAL_UI_MODE = "GUI" UNKNOWN_UI_MODE = "Unknown" -FALLBACK_ASSUMED_UI_MODE = GRAPHICAL_UI_MODE +FALLBACK_ASSUMED_UI_MODE = GRAPHICAL_UI_MODE \ No newline at end of file diff --git a/syncplay/messages_de.py b/syncplay/messages_de.py index 6ed97711..cf00bc10 100755 --- a/syncplay/messages_de.py +++ b/syncplay/messages_de.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Ungültiger Offset-Wert", "switch-file-not-found-error": "Konnte nicht zur Datei „{0}“ wechseln. Syncplay sucht im Verzeichnis der aktuellen Datei und angegebenen Medienverzeichnissen.", # File not found, folder it was not found in - "folder-search-timeout-error": "Die Suche nach Medien in den Medienverzeichnissen wurde abgebrochen, weil es zu lange gedauert hat, „{}“ zu durchsuchen. Das kann passieren, wenn du in deiner Liste der Medienverzeichnisse ein Verzeichnis mit zu vielen Unterverzeichnissen auswhälst. Damit der automatische Dateiwechsel wieder funktioniert, wähle Datei->Medienverzeichnisse auswählen in der Menüleiste und entferne dieses Verzeichnis oder ersetze es mit einem geeigneten Unterverzeichnis. Wenn das Verzeichnis in Ordnung ist, kannst du es reaktivieren, indem du Datei->Medienverzeichnisse auswählen wählst und „OK“ drückst.", # Folder + "folder-search-timeout-error": "Die Suche nach Medien in den Medienverzeichnissen wurde abgebrochen, weil es zu lange gedauert hat, „{}“ zu durchsuchen (after having processed the first {:,} files). Das kann passieren, wenn du in deiner Liste der Medienverzeichnisse ein Verzeichnis mit zu vielen Unterverzeichnissen auswhälst. Damit der automatische Dateiwechsel wieder funktioniert, wähle Datei->Medienverzeichnisse auswählen in der Menüleiste und entferne dieses Verzeichnis oder ersetze es mit einem geeigneten Unterverzeichnis. Wenn das Verzeichnis in Ordnung ist, kannst du es reaktivieren, indem du Datei->Medienverzeichnisse auswählen wählst und „OK“ drückst.", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "Die Suche nach Medien in den Medienverzeichnissen wurde abgebrochen, weil es zu lange gedauert hat, auf „{}“ zuzugreifen. Das kann passieren, wenn es sich dabei um ein Netzwerkgerät handelt und du eingestellt hast, dass es sich nach Inaktivität ausschaltet. Damit der automatische Dateiwechsel wieder funktioniert, wähle Datei->Medienverzeichnisse auswählen in der Menüleiste und entferne dieses Verzeichnis oder löse das Problem (z.B. indem du die Energiespareinstellungen anpasst).", # Folder "added-file-not-in-media-directory-error": "Du hast eine Datei in im Verzeichnis „{}“ geladeden, welches kein bekanntes Medienverzeichnis ist. Du kannst es als Medienverzeichnis hinzufügen, indem du Datei->Medienverzeichnisse auswählen in der Menüleiste wählst.", # Folder "no-media-directories-error": "Es wurden keine Medienverzeichnisse ausgewählt. Damit geteilte Playlists und Dateiwechsel korrekt funktionieren, wähle Datei->Medienverzeichnisse auswählen in der Menüleiste und gib an, wo Syncplay nach Mediendateien suchen soll.", diff --git a/syncplay/messages_en.py b/syncplay/messages_en.py index a99c776b..f568cbf9 100644 --- a/syncplay/messages_en.py +++ b/syncplay/messages_en.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Invalid offset value", "switch-file-not-found-error": "Could not switch to file '{0}'. Syncplay looks in specified media directories.", # File not found - "folder-search-timeout-error": "The search for media in media directories was aborted as it took too long to search through '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", # Folder + "folder-search-timeout-error": "The search for media in media directories was aborted as it took too long to search through '{}' after having processed the first {:,} files. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process. For automatic file switching to work again please select File->Set Media Directories in the menu bar and remove this directory or replace it with an appropriate sub-folder. If the folder is actually fine then you can re-enable it by selecting File->Set Media Directories and pressing 'OK'.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. "folder-search-first-file-timeout-error": "The search for media in '{}' was aborted as it took too long to access the directory. This could happen if it is a network drive or if you configure your drive to spin down after a period of inactivity. For automatic file switching to work again please go to File->Set Media Directories and either remove the directory or resolve the issue (e.g. by changing power saving settings).", # Folder "added-file-not-in-media-directory-error": "You loaded a file in '{}' which is not a known media directory. You can add this as a media directory by selecting File->Set Media Directories in the menu bar.", # Folder "no-media-directories-error": "No media directories have been set. For shared playlist and file switching features to work properly please select File->Set Media Directories and specify where Syncplay should look to find media files.", diff --git a/syncplay/messages_eo.py b/syncplay/messages_eo.py index fb3e06e9..280d7b53 100644 --- a/syncplay/messages_eo.py +++ b/syncplay/messages_eo.py @@ -176,7 +176,8 @@ "invalid-offset-value": "Nevalida valoro de frueco", "switch-file-not-found-error": "Ne povis ŝalti dosieron «{0}». Syncplay serĉas en donitaj dosierujoj kun vidaŭdaĵoj.", # File not found - "folder-search-timeout-error": "La serĉado de vidaŭdaĵoj en dosierujoj kun vidaŭdaĵoj haltis, ĉar serĉado en «{}» postulis tro da tempo. Ĉi tio okazos, se vi elektos dosierujon kun tro multaj subdosierujoj en via listo de enserĉotaj dosierujoj kun vidaŭdaĵoj. Por refunkciigi memagan ŝaltadon de dosieroj, bonvolu elekti menueron «Dosiero → Agordi dosierujojn kun vidaŭdaĵoj» en la menubreto, kaj forigi ĉi tiun dosierujon, aŭ anstataŭigi ĝin per taŭga sub-dosierujo. Se vi trovos, ke la dosierujo fakte funkcias bone, vi povos reŝalti ĝin per «Dosiero → Agordi dosierujojn kun vidaŭdaĵoj» kaj klako al «Bone».", # Folder + "folder-search-timeout-error": "La serĉado de vidaŭdaĵoj en dosierujoj kun vidaŭdaĵoj haltis, ĉar serĉado en «{}» postulis tro da tempo (after having processed the first {:,} files). Ĉi tio okazos, se vi elektos dosierujon kun tro multaj subdosierujoj en via listo de enserĉotaj dosierujoj kun vidaŭdaĵoj. Por refunkciigi memagan ŝaltadon de dosieroj, bonvolu elekti menueron «Dosiero → Agordi dosierujojn kun vidaŭdaĵoj» en la menubreto, kaj forigi ĉi tiun dosierujon, aŭ anstataŭigi ĝin per taŭga sub-dosierujo. Se vi trovos, ke la dosierujo fakte funkcias bone, vi povos reŝalti ĝin per «Dosiero → Agordi dosierujojn kun vidaŭdaĵoj» kaj klako al «Bone».", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "La serĉo de vidaŭdaĵoj en «{}» haltis, ĉar aliro al la dosierujo postulis tro da tempo. Ĉi tio povas okazi se ĝi estas reta disko aŭ se vi agordis vian diskon malrapidiĝi post neaktivado. Por ke funkciu memaga ŝanĝado de dosieroj, bonvolu iri al «Dosiero → Agordi vidaŭdaĵajn dosierujojn», kaj forigu la dosierujon, aŭ solvu la problemon (ekz. per ŝanĝo de viaj agordoj por konservado de elektro).", # Folder "added-file-not-in-media-directory-error": "Vi enlegis dosieron el «{}», kiu ne estas konata vidaŭdaĵa dosierujo. Vi povas aldoni ĝin al vidaŭdaĵaj dosierujoj per la menuero «Dosiero → Agordi vidaŭdaĵajn dosierujojn» en la menua breto.", # Folder "no-media-directories-error": "Neniuj vidaŭdaĵaj dosierujoj estas agorditaj. Por ke kapabloj de komunaj ludlistoj kaj ŝanĝado de dosieroj funkciu ĝuste, bonvolu elekti menueron «Dosiero → Agordi vidaŭdaĵajn dosierujojn», kaj precizigu, kie Syncplay serĉu vidaŭdaĵojn.", diff --git a/syncplay/messages_es.py b/syncplay/messages_es.py index 7d4d1492..ae3108dd 100644 --- a/syncplay/messages_es.py +++ b/syncplay/messages_es.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Valor de desplazamiento inválido", "switch-file-not-found-error": "No se pudo cambiar el archivo '{0}'. Syncplay busca en los directorios de medios especificados.", # File not found - "folder-search-timeout-error": "Se anuló la búsqueda de medios en el directorio de medios, ya que tardó demasiado buscando en '{}'. Esto ocurrirá si seleccionas una carpeta con demasiadas subcarpetas en tu lista de carpetas de medios para buscar. Para que el cambio automático de archivos vuelva a funcionar, selecciona Archivo->Establecer directorios de medios en la barra de menú y elimina este directorio o reemplázalo con una subcarpeta apropiada. Si la carpeta está bien, puedes volver a reactivarlo seleccionando Archivo->Establecer directorios de medios y presionando 'OK'.", # Folder + "folder-search-timeout-error": "Se anuló la búsqueda de medios en el directorio de medios, ya que tardó demasiado buscando en '{}' (after having processed the first {:,} files). Esto ocurrirá si seleccionas una carpeta con demasiadas subcarpetas en tu lista de carpetas de medios para buscar. Para que el cambio automático de archivos vuelva a funcionar, selecciona Archivo->Establecer directorios de medios en la barra de menú y elimina este directorio o reemplázalo con una subcarpeta apropiada. Si la carpeta está bien, puedes volver a reactivarlo seleccionando Archivo->Establecer directorios de medios y presionando 'OK'.", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "Se anuló la búsqueda de medios en '{}', ya que tardó demasiado buscando en acceder al directorio. Esto podría ocurrir si se trata de una unidad de red, o si tienes configurada la unidad para centrifugar luego de cierto período de inactividad. Para que el cambio automático de archivos vuelva a funcionar, por favor dirígete a Archivo->Establecer directorios de medios y elimina el directorio o resuelve el problema (p.ej. cambiando la configuración de ahorro de energía).", # Folder "added-file-not-in-media-directory-error": "Has cargado un archivo en '{}' el cual no es un directorio de medios conocido. Puedes agregarlo como un directorio de medios seleccionado Archivo->Establecer directorios de medios en la barra de menú.", # Folder "no-media-directories-error": "No se han establecido directorios de medios. Para que las funciones de lista de reproducción compartida y cambio de archivos funcionen correctamente, selecciona Archivo->Establecer directorios de medios y especifica dónde debe buscar Syncplay para encontrar archivos multimedia.", diff --git a/syncplay/messages_fi.py b/syncplay/messages_fi.py index a73c96dd..2696c563 100644 --- a/syncplay/messages_fi.py +++ b/syncplay/messages_fi.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Epäkelpo poikkeama-arvo", "switch-file-not-found-error": "Ei onnistuttu vaihtamaan tiedostoon '{0}'. Syncplay katsoo määritettyjen mediahakemistojen läpi.", # File not found - "folder-search-timeout-error": "Haku median löytämiseksi mediahakemistoista keskeytettiin koska se alkoi viedä liiaksi aikaa käydä läpi '{}'. Tätä ilmenee jos valitset kansion jossa on liikaa alikansioita määritellyn hakemistopolun tiimoilla. Jotta automaattinen tiedostovaihtaminen toimisi jälleen valitse Tiedosto->Aseta mediahakemistot valikkopalkissa ja poista tämä nykyinen hakemisto tai vaihda se sopivaan alikansioon. Mikäli kansio on itseasiassa kelvollinen, täten voit uudelleenvalita sen käyttöön valiten Tiedosto->Aseta mediahakemistot ja kun napsautat 'OK'.", # Folder + "folder-search-timeout-error": "Haku median löytämiseksi mediahakemistoista keskeytettiin koska se alkoi viedä liiaksi aikaa käydä läpi '{}' (after having processed the first {:,} files). Tätä ilmenee jos valitset kansion jossa on liikaa alikansioita määritellyn hakemistopolun tiimoilla. Jotta automaattinen tiedostovaihtaminen toimisi jälleen valitse Tiedosto->Aseta mediahakemistot valikkopalkissa ja poista tämä nykyinen hakemisto tai vaihda se sopivaan alikansioon. Mikäli kansio on itseasiassa kelvollinen, täten voit uudelleenvalita sen käyttöön valiten Tiedosto->Aseta mediahakemistot ja kun napsautat 'OK'.", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "Haku mediaa etsien kohteessa '{}' keskeytettiin koska aikaa kului liian paljon hakemistoon pääsemiseksikään. Tätä voi ilmetä jos kyseessä on verkkoasema tai jos olet määrttänyt aseman sammuttamaan lukutoiminnan tietyn joutilasajan jälkeen. Jotta saat automaattisen tiedostovaihdon jälleen toimimaan mene Tiedosto->Aseta mediakansiotSet Media Directories ja joko poista hakemisto tai ratkaise ongelma (esim. muuttamalla virransäästön asetusta).", # Folder "added-file-not-in-media-directory-error": "Lataus tapahtui ajassa '{}' mutta kyseessä ei ole tunnettu mediakansio. Voit lisätä tämän mediahakemistoksi valiten Tiedosto->Aseta mediahakemistot valikkopalkissa.", # Folder "no-media-directories-error": "Mediahakemistoja ei ole asetettu. Jotta jaetut toistoluettelot ja tiedostovaihdot toimisivat valitse Tiedosto->Aseta mediahakemistot ja määritä mistä Syncplay hakee mediatiedostoja.", diff --git a/syncplay/messages_fr.py b/syncplay/messages_fr.py index 3568f7dd..8cd133a8 100644 --- a/syncplay/messages_fr.py +++ b/syncplay/messages_fr.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Valeur de décalage non valide", "switch-file-not-found-error": "Impossible de passer au fichier ''. Syncplay recherche dans les répertoires multimédias spécifiés.", # File not found - "folder-search-timeout-error": "La recherche de médias dans les répertoires de médias a été abandonnée car la recherche dans '{}' a pris trop de temps. Cela se produira si vous sélectionnez un dossier avec trop de sous-dossiers dans votre liste de dossiers multimédias à parcourir. Pour que le basculement automatique des fichiers fonctionne à nouveau, veuillez sélectionner Fichier->Définir les répertoires multimédias dans la barre de menu et supprimez ce répertoire ou remplacez-le par un sous-dossier approprié. Si le dossier est correct, vous pouvez le réactiver en sélectionnant Fichier->Définir les répertoires multimédias et en appuyant sur «OK».", # Folder + "folder-search-timeout-error": "La recherche de médias dans les répertoires de médias a été abandonnée car la recherche dans '{}' a pris trop de temps (after having processed the first {:,} files). Cela se produira si vous sélectionnez un dossier avec trop de sous-dossiers dans votre liste de dossiers multimédias à parcourir. Pour que le basculement automatique des fichiers fonctionne à nouveau, veuillez sélectionner Fichier->Définir les répertoires multimédias dans la barre de menu et supprimez ce répertoire ou remplacez-le par un sous-dossier approprié. Si le dossier est correct, vous pouvez le réactiver en sélectionnant Fichier->Définir les répertoires multimédias et en appuyant sur «OK».", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "La recherche de média dans '{}' a été abandonnée car elle a pris trop de temps pour accéder au répertoire. Cela peut arriver s'il s'agit d'un lecteur réseau ou si vous configurez votre lecteur pour qu'il ralentisse après une période d'inactivité. Pour que le basculement automatique des fichiers fonctionne à nouveau, accédez à Fichier-> Définir les répertoires multimédias et supprimez le répertoire ou résolvez le problème (par exemple en modifiant les paramètres d'économie d'énergie).", # Folder "added-file-not-in-media-directory-error": "Vous avez chargé un fichier dans '{}' qui n'est pas un répertoire média connu. Vous pouvez l'ajouter en tant que répertoire multimédia en sélectionnant Fichier->Définir les répertoires multimédias dans la barre de menus.", # Folder "no-media-directories-error": "Aucun répertoire multimédia n'a été défini. Pour que les fonctionnalités de liste de lecture partagée et de changement de fichier fonctionnent correctement, sélectionnez Fichier-> Définir les répertoires multimédias et spécifiez où Syncplay doit rechercher les fichiers multimédias.", diff --git a/syncplay/messages_it.py b/syncplay/messages_it.py index 1b4a87e7..c941472a 100755 --- a/syncplay/messages_it.py +++ b/syncplay/messages_it.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Valore di offset non valido", "switch-file-not-found-error": "Impossibile selezionare il file '{0}'. Syncplay osserva solo le cartelle multimediali specificate.", # File not found - "folder-search-timeout-error": "La ricerca nelle cartelle multimediali è stata interrotta perché l'analisi di '{}' sta impiegando troppo tempo. Ciò accade se si aggiunge nella lista di ricerca una cartella con troppe sottocartelle. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali nella barra dei menù e rimuovi questa cartella, o sostituiscila con una sottocartella appropriata. Se la cartella è idonea, è possibile riabilitarla selezionando File->Imposta cartelle multimediali e premendo 'OK'.", # Folder + "folder-search-timeout-error": "La ricerca nelle cartelle multimediali è stata interrotta perché l'analisi di '{}' sta impiegando troppo tempo (after having processed the first {:,} files). Ciò accade se si aggiunge nella lista di ricerca una cartella con troppe sottocartelle. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali nella barra dei menù e rimuovi questa cartella, o sostituiscila con una sottocartella appropriata. Se la cartella è idonea, è possibile riabilitarla selezionando File->Imposta cartelle multimediali e premendo 'OK'.", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "La ricerca dei media in '{}' è stata interrotta perché l'accesso alla cartella sta impiegando troppo tempo. Ciò accade se questa si trova in un disco di rete oppure se hai impostato il blocco della rotazione del disco rigido dopo un certo periodo di inattività. Per riabilitare la selezione automatica dei file seleziona File->Imposta cartelle multimediali, quindi rimuovi la cartella oppure risolvi il problema (es. cambiando le impostazioni di risparmio energetico).", # Folder "added-file-not-in-media-directory-error": "Hai selezionato un file in '{}', che non è impostata come cartella multimediale. Puoi aggiungerla come cartella multimediale selezionando File->Imposta cartelle multimediali nella barra dei menù.", # Folder "no-media-directories-error": "Nessuna cartella multimediale è stata configurata. Per permettere il corretto funzionamento delle playlist condivise e la selezione automatica dei file, naviga in File->Imposta cartelle multimediali e specifica dove Syncplay deve ricercare i file multimediali.", diff --git a/syncplay/messages_ko.py b/syncplay/messages_ko.py index d63c5d9b..6e563ba3 100644 --- a/syncplay/messages_ko.py +++ b/syncplay/messages_ko.py @@ -173,7 +173,8 @@ "invalid-offset-value": "잘못된 오프셋 값", "switch-file-not-found-error": "'{0}' 파일로 전환할 수 없습니다. Syncplay는 지정된 미디어 디렉터리를 찾습니다.", # File not found - "folder-search-timeout-error": "'{}'을(를) 검색하는 데 너무 오래 걸리기 때문에 미디어 디렉터리에서 미디어 검색이 중단되었습니다. 미디어 폴더 목록에서 검색할 하위 폴더가 너무 많은 폴더를 선택하면 이 문제가 발생합니다. 자동 파일 전환이 다시 작동하도록 하려면 메뉴 표시줄에서 파일->미디어 디렉터리 설정을 선택하고 이 디렉터리를 제거하거나 적절한 하위 폴더로 바꾸세요. 폴더가 실제로 괜찮다면 파일->미디어 디렉터리 설정을 선택하고 '확인'을 눌러 폴더를 다시 활성화할 수 있습니다.", # Folder + "folder-search-timeout-error": "'{}'을(를) 검색하는 데 너무 오래 걸리기 때문에 미디어 디렉터리에서 미디어 검색이 중단되었습니다 (after having processed the first {:,} files). 미디어 폴더 목록에서 검색할 하위 폴더가 너무 많은 폴더를 선택하면 이 문제가 발생합니다. 자동 파일 전환이 다시 작동하도록 하려면 메뉴 표시줄에서 파일->미디어 디렉터리 설정을 선택하고 이 디렉터리를 제거하거나 적절한 하위 폴더로 바꾸세요. 폴더가 실제로 괜찮다면 파일->미디어 디렉터리 설정을 선택하고 '확인'을 눌러 폴더를 다시 활성화할 수 있습니다.", # Folder, Files processed - Note: {:,} is {} but with added commas seprators - TODO: Translate + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "디렉터리에 액세스하는 데 시간이 너무 오래 걸려 '{}'의 미디어 검색이 중단되었습니다. 이는 네트워크 드라이브이거나 일정 시간 동안 사용하지 않으면 스핀다운하도록 드라이브를 구성한 경우에 발생할 수 있습니다. 자동 파일 전환이 다시 작동하려면 파일->미디어 디렉터리 설정으로 이동하여 디렉터리를 제거하거나 이슈를 해결하세요(예: 절전 설정 변경).", # Folder "added-file-not-in-media-directory-error": "알려진 미디어 디렉터리가 아닌 '{}'에 파일을 로드했습니다. 메뉴 표시줄에서 파일->미디어 디렉터리 설정을 선택하여 이 파일을 미디어 디렉터리로 추가할 수 있습니다.", # Folder "no-media-directories-error": "미디어 디렉터리가 설정되지 않았습니다. 공유 재생목록 및 파일 전환 기능이 제대로 작동하려면 파일->미디어 디렉터리 설정을 선택하고 Syncplay가 미디어 파일을 찾을 위치를 지정하세요.", diff --git a/syncplay/messages_pt_BR.py b/syncplay/messages_pt_BR.py index d6dbe64b..682720e6 100644 --- a/syncplay/messages_pt_BR.py +++ b/syncplay/messages_pt_BR.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Valor de deslocamento inválido", "switch-file-not-found-error": "Não foi possível mudar para o arquivo '{0}'. O Syncplay procura nos diretórios de mídia especificados.", # File not found - "folder-search-timeout-error": "A busca por mídias no diretório de mídias foi cancelada pois demorou muito tempo para procurar em '{}'. Isso ocorre quando você seleciona uma pasta com muitas subpastas em sua lista de pastas de mídias a serem pesquisadas. Para que a troca automática de arquivos funcione novamente, selecione 'Arquivo -> Definir diretórios de mídias' na barra de menus e remova esse diretório ou substitua-o por uma subpasta apropriada. Se a pasta não tiver problemas, é possível reativá-la selecionando 'Arquivo -> Definir diretórios de mídias' e pressionando 'OK'.", # Folder + "folder-search-timeout-error": "A busca por mídias no diretório de mídias foi cancelada pois demorou muito tempo para procurar em '{}' (after having processed the first {} files). Isso ocorre quando você seleciona uma pasta com muitas subpastas em sua lista de pastas de mídias a serem pesquisadas. Para que a troca automática de arquivos funcione novamente, selecione 'Arquivo -> Definir diretórios de mídias' na barra de menus e remova esse diretório ou substitua-o por uma subpasta apropriada. Se a pasta não tiver problemas, é possível reativá-la selecionando 'Arquivo -> Definir diretórios de mídias' e pressionando 'OK'.", # Folder, Files processed - TODO: Update translation (refer back to original English text) + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "A busca por mídias em '{}' foi interrompida, pois demorou muito para acessar o diretório. Isso pode acontecer se for uma unidade de rede ou se você configurar sua unidade para hibernar depois de um período de inatividade. Para que a troca automática de arquivos funcione novamente, vá para 'Arquivo -> Definir diretórios de mídias' e remova o diretório ou resolva o problema (por exemplo, alterando as configurações de economia de energia da unidade).", # Folder "added-file-not-in-media-directory-error": "Você carregou um arquivo em '{}', que não é um diretório de mídias conhecido. Você pode adicioná-lo isso como um diretório de mídia selecionando 'Arquivo -> Definir diretórios de mídias' na barra de menus.", # Folder "no-media-directories-error": "Nenhum diretório de mídias foi definido. Para que os recursos de playlists compartilhadas e troca automática de arquivos funcionem corretamente, selecione 'Arquivo -> Definir diretórios de mídias' e especifique onde o Syncplay deve procurar para encontrar arquivos de mídia.", diff --git a/syncplay/messages_pt_PT.py b/syncplay/messages_pt_PT.py index b11425b2..3b8bf552 100644 --- a/syncplay/messages_pt_PT.py +++ b/syncplay/messages_pt_PT.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Valor de deslocamento inválido", "switch-file-not-found-error": "Não foi possível mudar para o ficheiro '{0}'. O Syncplay procura nos pastas de mídia especificados.", # File not found - "folder-search-timeout-error": "A busca por mídias no pasta de mídias foi cancelada pois demorou muito tempo para procurar em '{}'. Isso ocorre quando você seleciona uma pasta com muitas subpastas em sua lista de pastas de mídias a serem pesquisadas. Para que a troca automática de ficheiros funcione novamente, selecione 'Ficheiro -> Definir pastas de mídias' na barra de menus e remova esse pasta ou substitua-o por uma subpasta apropriada. Se a pasta não tiver problemas, é possível reativá-la selecionando 'Ficheiro -> Definir pastas de mídias' e pressionando 'OK'.", # Folder + "folder-search-timeout-error": "A busca por mídias no pasta de mídias foi cancelada pois demorou muito tempo para procurar em '{}' (after having processed the first {} files). Isso ocorre quando você seleciona uma pasta com muitas subpastas em sua lista de pastas de mídias a serem pesquisadas. Para que a troca automática de ficheiros funcione novamente, selecione 'Ficheiro -> Definir pastas de mídias' na barra de menus e remova esse pasta ou substitua-o por uma subpasta apropriada. Se a pasta não tiver problemas, é possível reativá-la selecionando 'Ficheiro -> Definir pastas de mídias' e pressionando 'OK'.", # Folder, Files processed - TODO: Update translation (refer back to original English text) + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "A busca por mídias em '{}' foi interrompida, pois demorou muito para acessar o pasta. Isso pode acontecer se for uma unidade de rede ou se você configurar o seu dispositivo para hibernar depois de um período de inatividade. Para que a troca automática de ficheiros funcione novamente, vá para 'Ficheiro -> Definir pastas de mídias' e remova o pasta ou resolva o problema (por exemplo, alterando as configurações de economia de energia da unidade).", # Folder "added-file-not-in-media-directory-error": "Você carregou um ficheiro em '{}', que não é um pasta de mídias conhecido. Você pode adicioná-lo isso como um pasta de mídia selecionando 'Ficheiro -> Definir pastas de mídias' na barra de menus.", # Folder "no-media-directories-error": "Nenhum pasta de mídias foi definido. Para que os recursos de playlists compartilhadas e troca automática de ficheiros funcionem corretamente, selecione 'Ficheiro -> Definir pastas de mídias' e especifique onde o Syncplay deve procurar para encontrar ficheiros de mídia.", diff --git a/syncplay/messages_ru.py b/syncplay/messages_ru.py index 5250a50d..0562482a 100755 --- a/syncplay/messages_ru.py +++ b/syncplay/messages_ru.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Некорректное смещение", "switch-file-not-found-error": "Невозможно найти файл '{0}'. Проверьте папки воспроизведения.", # File not found - "folder-search-timeout-error": "Поиск файла был прерван в папке '{}'. Это может произойти из-за большого количества подпапок. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку из списка или замените её на нужную подпапку. Если на самом деле с папкой всё в порядке, вы можете cнова её включить через выпадающее меню Файл->Папки воспроизведения.", # Folder + "folder-search-timeout-error": "Поиск файла был прерван в папке '{}'. Это может произойти из-за большого количества подпапок (after having processed the first {} files). Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку из списка или замените её на нужную подпапку. Если на самом деле с папкой всё в порядке, вы можете cнова её включить через выпадающее меню Файл->Папки воспроизведения.", # Folder, Files processed - TODO: Update translation (refer back to original English text) + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "Поиск файла в '{}' был прерван, так как невозможно открыть каталог. Это может произойти, если это сетевой диск или диск перешёл в режим экономии энергии. Для корректной работы поиска файлов зайдите через выпадающее меню в Файл->Папки воспроизведения и удалите данную папку, или решите проблему изменив параметры энергосбережения.", # Folder "added-file-not-in-media-directory-error": "Вы загрузили файл из '{}', который не числится в папках воспроизведения. Вы можете добавить его через выпадающее меню Файл->Папки воспроизведения.", # Folder "no-media-directories-error": "Вы не указали папки воспроизведения. Для корректной работы зайдите через выпадающее меню в Файл->Папки воспроизведения и укажите нужные каталоги.", diff --git a/syncplay/messages_tr.py b/syncplay/messages_tr.py index 8bd46f1a..021fb9b0 100644 --- a/syncplay/messages_tr.py +++ b/syncplay/messages_tr.py @@ -173,7 +173,8 @@ "invalid-offset-value": "Geçersiz zaman konumu değeri", "switch-file-not-found-error": "'{0}' dosyasına geçilemedi. Syncplay, belirtilen medya dizinlerine bakar.", # File not found - "folder-search-timeout-error": "'{}' üzerinden arama yapmak çok uzun sürdüğü için medya dizinlerinde medya araması durduruldu. Ortam klasörleri listenizde arama yapmak için çok fazla alt klasörün bulunduğu bir klasör seçerseniz bu meydana gelir. Otomatik dosya değiştirmenin tekrar çalışması için lütfen menü çubuğunda Dosya-> Medya Dizinlerini Ayarla'yı seçin ve bu dizini kaldırın veya uygun bir alt klasörle değiştirin. Klasör gerçekten iyi durumdaysa, Dosya-> Medya Dizinlerini Ayarla'yı seçip 'Tamam'a basarak yeniden etkinleştirebilirsiniz.", # Folder + "folder-search-timeout-error": "'{}' üzerinden arama yapmak çok uzun sürdüğü için medya dizinlerinde medya araması durduruldu (after having processed the first {} files). Ortam klasörleri listenizde arama yapmak için çok fazla alt klasörün bulunduğu bir klasör seçerseniz bu meydana gelir. Otomatik dosya değiştirmenin tekrar çalışması için lütfen menü çubuğunda Dosya-> Medya Dizinlerini Ayarla'yı seçin ve bu dizini kaldırın veya uygun bir alt klasörle değiştirin. Klasör gerçekten iyi durumdaysa, Dosya-> Medya Dizinlerini Ayarla'yı seçip 'Tamam'a basarak yeniden etkinleştirebilirsiniz.", # Folder, Files processed - TODO: Update translation (refer back to original English text) + "folder-search-timeout-warning": "Warning: It has taken {} second(s) to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "Dizine erişim çok uzun sürdüğü için '{}' içindeki medya araması durduruldu. Bu, bir ağ sürücüsü ise veya sürücünüzü bir süre kullanılmadığında dönecek şekilde yapılandırırsanız olabilir. Otomatik dosya değiştirmenin tekrar çalışması için lütfen Dosya-> Medya Dizinlerini Ayarla'ya gidin ve dizini kaldırın veya sorunu çözün (örn. Güç tasarrufu ayarlarını değiştirerek).", # Folder "added-file-not-in-media-directory-error": "Bilinen bir medya dizini olmayan '{}' içine bir dosya yüklediniz. Menü çubuğunda Dosya-> Medya Dizinlerini Ayarla'yı seçerek bunu bir medya dizini olarak ekleyebilirsiniz.", # Folder "no-media-directories-error": "Hiçbir medya dizini ayarlanmadı. Paylaşılan çalma listesi ve dosya değiştirme özelliklerinin düzgün çalışması için lütfen Dosya-> Ortam Dizinlerini Ayarla'yı seçin ve Syncplay'in medya dosyalarını bulmak için nereye bakması gerektiğini belirtin.", diff --git a/syncplay/messages_zh_CN.py b/syncplay/messages_zh_CN.py index 9b5464d9..07510f55 100644 --- a/syncplay/messages_zh_CN.py +++ b/syncplay/messages_zh_CN.py @@ -173,7 +173,8 @@ "invalid-offset-value": "无效的偏移值", "switch-file-not-found-error": "无法切换到视频文件'{0}'。Syncplay只在指定的媒体目录中查找文件。", # File not found - "folder-search-timeout-error": "在媒体目录中搜索媒体文件时,由于在'{}'中搜索时间过长而中止。如果你在要搜索的媒体文件夹列表中选择了一个子文件夹过多的文件夹,就会出现这种情况。为了使自动文件切换再次工作,请在菜单栏中选择\"文件->设置媒体目录\",并删除这个目录或用一个适当的子文件夹替换它。如果这个文件夹实际上是适当的,那么你可以通过选择\"文件->设置媒体目录\"并按\"确定\"来重新启用它。", # Folder + "folder-search-timeout-error": "在媒体目录中搜索媒体文件时,由于在'{}'中搜索时间过长而中止 (after having processed the first {} files)。如果你在要搜索的媒体文件夹列表中选择了一个子文件夹过多的文件夹,就会出现这种情况。为了使自动文件切换再次工作,请在菜单栏中选择\"文件->设置媒体目录\",并删除这个目录或用一个适当的子文件夹替换它。如果这个文件夹实际上是适当的,那么你可以通过选择\"文件->设置媒体目录\"并按\"确定\"来重新启用它。", # Folder, Files processed - TODO: Update translation (refer back to original English text) + "folder-search-timeout-warning": "Warning: It has taken {} seconds to scan {:,} files in the folder '{}'. This will occur if you select a folder with too many sub-folders in your list of media folders to search through or if there are too many files to process.", # Folder, Files processed. Note: {:,} is {} but with added commas seprators. TODO: Translate "folder-search-first-file-timeout-error": "搜索'{}'中的媒体文件时,由于访问该目录的时间太长而被中止。如果该目录位于网络驱动器,或者如果你配置了你的驱动器在一段时间不活动后停止工作,就会发生这种情况。为了能够自动切换播放文件,请进入\"文件->设置媒体目录\",并删除该目录或解决这个问题(还可尝试其他解决方式,例如,改变省电设置)。", # Folder "added-file-not-in-media-directory-error": "你在'{}'中加载了一个文件,该媒体目录尚未保存。你可以通过选择菜单栏中的\"文件->设置媒体目录\"将其保存为指定媒体目录。", # Folder "no-media-directories-error": "没有设置媒体目录。为了使共享播放列表和文件切换功能正常工作,请选择\"文件->设置媒体目录\",并指定Syncplay应该在哪里寻找媒体文件。", diff --git a/syncplay/ui/ConfigurationGetter.py b/syncplay/ui/ConfigurationGetter.py index b5cf6d96..0df41867 100755 --- a/syncplay/ui/ConfigurationGetter.py +++ b/syncplay/ui/ConfigurationGetter.py @@ -53,6 +53,7 @@ def __init__(self): "folderSearchFirstFileTimeout": constants.FOLDER_SEARCH_FIRST_FILE_TIMEOUT, "folderSearchTimeout": constants.FOLDER_SEARCH_TIMEOUT, "folderSearchDoubleCheckInterval": constants.FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL, + "folderSearchWarningThreshold": constants.FOLDER_SEARCH_WARNING_THRESHOLD, "filenamePrivacyMode": constants.PRIVACY_SENDRAW_MODE, "filesizePrivacyMode": constants.PRIVACY_SENDRAW_MODE, "pauseOnLeave": False, @@ -169,6 +170,7 @@ def __init__(self): "folderSearchFirstFileTimeout", "folderSearchTimeout", "folderSearchDoubleCheckInterval", + "folderSearchWarningThreshold", "autoplayMinUsers", "chatInputRelativeFontSize", "chatInputFontWeight", @@ -194,7 +196,7 @@ def __init__(self): "name", "room", "roomList", "playerPath", "perPlayerArguments", "slowdownThreshold", "rewindThreshold", "fastforwardThreshold", - "folderSearchFirstFileTimeout", "folderSearchTimeout", "folderSearchDoubleCheckInterval", + "folderSearchFirstFileTimeout", "folderSearchTimeout", "folderSearchDoubleCheckInterval", "folderSearchWarningThreshold", "slowOnDesync", "rewindOnDesync", "fastforwardOnDesync", "dontSlowDownWithMe", "forceGuiPrompt", "filenamePrivacyMode", diff --git a/vlc-help.txt b/vlc-help.txt new file mode 100644 index 00000000..2035cf94 --- /dev/null +++ b/vlc-help.txt @@ -0,0 +1,349 @@ +Usage: vlc [options] [stream] ... +You can specify multiple streams on the commandline. +They will be enqueued in the playlist. +The first item specified will be played first. + +Options-styles: + --option A global option that is set for the duration of the program. + -option A single letter version of a global --option. + :option An option that only applies to the stream directly before it + and that overrides previous settings. + +Stream MRL syntax: + [[access][/demux]://]URL[#[title][:chapter][-[title][:chapter]]] + [:option=value ...] + + Many of the global --options can also be used as MRL specific :options. + Multiple :option=value pairs can be specified. + +URL syntax: + file:///path/file Plain media file + http://host[:port]/file HTTP URL + ftp://host[:port]/file FTP URL + mms://host[:port]/file MMS URL + screen:// Screen capture + dvd://[device] DVD device + vcd://[device] VCD device + cdda://[device] Audio CD device + udp://[[]@[][:]] + UDP stream sent by a streaming server + vlc://pause: Pause the playlist for a certain time + vlc://quit Special item to quit VLC + + + core program (core) + + Audio + --audio, --no-audio Enable audio + (default enabled) + --force-dolby-surround={0 (Auto), 1 (On), 2 (Off)} + Force detection of Dolby Surround + --audio-replay-gain-mode={none,track,album} + Replay gain mode + --audio-replay-gain-preamp= + Replay preamp + --audio-replay-gain-default= + Default replay gain + --audio-time-stretch, --no-audio-time-stretch + Enable time stretching audio + (default enabled) + --audio-filter= Audio filters + --audio-visual={any,goom,projectm,visual,glspectrum,none} + Audio visualisations + + Video + -f, --fullscreen, --no-fullscreen + Fullscreen video output + (default disabled) + --video-on-top, --no-video-on-top + Always on top + (default disabled) + --video-wallpaper, --no-video-wallpaper + Enable wallpaper mode + (default disabled) + --video-title-show, --no-video-title-show + Show media title on video + (default enabled) + --video-title-timeout= + Show video title for x milliseconds + --video-title-position={0 (Centre), 1 (Left), 2 (Right), 4 (Top), 8 (Bottom), 5 (Top-Left), 6 (Top-Right), 9 (Bottom-Left), 10 (Bottom-Right)} + Position of video title + --mouse-hide-timeout= + Hide cursor and fullscreen controller after x + milliseconds + Snapshot: + --snapshot-path= Video snapshot directory (or filename) + --snapshot-prefix= Video snapshot file prefix + --snapshot-format={png,jpg,tiff} + Video snapshot format + --snapshot-preview, --no-snapshot-preview + Display video snapshot preview + (default enabled) + --snapshot-sequential, --no-snapshot-sequential + Use sequential numbers instead of timestamps + (default disabled) + Window properties: + --crop= Video cropping + --custom-crop-ratios= + Custom crop ratios list + --aspect-ratio= Source aspect ratio + --autoscale, --no-autoscale + Video Auto Scaling + (default enabled) + --custom-aspect-ratios= + Custom aspect ratios list + --deinterlace={0 (Off), -1 (Automatic), 1 (On)} + Deinterlace + --deinterlace-mode={auto,discard,blend,mean,bob,linear,x,yadif,yadif2x,phosphor,ivtc} + Deinterlace mode + --video-filter= Video filter module + --video-splitter= Video splitter module + + Subpictures + On Screen Display: + --spu, --no-spu Enable sub-pictures + (default enabled) + --osd, --no-osd On Screen Display + (default enabled) + Subtitles: + --sub-file= Use subtitle file + --sub-autodetect-file, --no-sub-autodetect-file + Autodetect subtitle files + (default enabled) + --sub-text-scale= + Subtitles text scaling factor + Overlays: + --sub-source= Subpictures source module + --sub-filter= Subpictures filter module + Track settings: + --audio-language= Audio language + --sub-language= Subtitle language + --menu-language= Menu language + --preferred-resolution={-1 (Best available), 1080 (Full HD (1080p)), 720 (HD (720p)), 576 (Standard Definition (576 or 480 lines)), 360 (Low Definition (360 lines)), 240 (Very Low Definition (240 lines))} + Preferred video resolution + Playback control: + --input-repeat= + Input repetitions + --input-fast-seek, --no-input-fast-seek + Fast seek + (default disabled) + --rate= Playback speed + Default devices: + --dvd= DVD device + --vcd= VCD device + Network settings: + --http-proxy= HTTP proxy + --http-proxy-pwd= HTTP proxy password + Advanced: + --input-title-format= + Change title according to current media + + Input + --stream-filter= Stream filter module + Performance options: + --high-priority, --no-high-priority + Increase the priority of the process + (default disabled) + + Playlist + -Z, --random, --no-random Play files randomly forever + (default disabled) + -L, --loop, --no-loop Repeat all + (default disabled) + -R, --repeat, --no-repeat Repeat current item + (default disabled) + --play-and-exit, --no-play-and-exit + Play and exit + (default disabled) + --play-and-stop, --no-play-and-stop + Play and stop + (default disabled) + --start-paused, --no-start-paused + Start paused + (default disabled) + --playlist-autostart, --no-playlist-autostart + Auto start + (default enabled) + --playlist-cork, --no-playlist-cork + Pause on audio communication + (default enabled) + --media-library, --no-media-library + Use media library + (default disabled) + --playlist-tree, --no-playlist-tree + Display playlist tree + (default disabled) + --open= Default stream + --auto-preparse, --no-auto-preparse + Automatically preparse items + (default enabled) + --preparse-timeout= + Preparsing timeout + --metadata-network-access, --no-metadata-network-access + Allow metadata network access + (default disabled) + --recursive={none,collapse,expand} + Subdirectory behaviour + --ignore-filetypes= + Ignored extensions + --show-hiddenfiles, --no-show-hiddenfiles + Show hidden files + (default disabled) + -v, --verbose= Verbosity (0,1,2) + --advanced, --no-advanced Show advanced options + (default disabled) + --interact, --no-interact Interface interaction + (default enabled) + -I, --intf= Interface module + --extraintf= Extra interface modules + --control= Control interfaces + + Hot keys + --hotkeys-y-wheel-mode={-1 (Ignore), 0 (Volume control), 2 (Position control), 3 (Position control reversed)} + Mouse wheel vertical axis control + --hotkeys-x-wheel-mode={-1 (Ignore), 0 (Volume control), 2 (Position control), 3 (Position control reversed)} + Mouse wheel horizontal axis control + --global-key-toggle-fullscreen= + Fullscreen + --key-toggle-fullscreen= + Fullscreen + --global-key-leave-fullscreen= + Exit fullscreen + --key-leave-fullscreen= + Exit fullscreen + --global-key-play-pause= + Play/Pause + --key-play-pause= Play/Pause + --global-key-faster= + Faster + --key-faster= Faster + --global-key-slower= + Slower + --key-slower= Slower + --global-key-rate-normal= + Normal rate + --key-rate-normal= Normal rate + --global-key-rate-faster-fine= + Faster (fine) + --key-rate-faster-fine= + Faster (fine) + --global-key-rate-slower-fine= + Slower (fine) + --key-rate-slower-fine= + Slower (fine) + --global-key-next= Next + --key-next= Next + --global-key-prev= Previous + --key-prev= Previous + --global-key-stop= Stop + --key-stop= Stop + --global-key-jump-extrashort= + Very short backwards jump + --key-jump-extrashort= + Very short backwards jump + --global-key-jump+extrashort= + Very short forward jump + --key-jump+extrashort= + Very short forward jump + --global-key-jump-short= + Short backwards jump + --key-jump-short= Short backwards jump + --global-key-jump+short= + Short forward jump + --key-jump+short= Short forward jump + --global-key-jump-medium= + Medium backwards jump + --key-jump-medium= Medium backwards jump + --global-key-jump+medium= + Medium forward jump + --key-jump+medium= Medium forward jump + --global-key-jump-long= + Long backwards jump + --key-jump-long= Long backwards jump + --global-key-jump+long= + Long forward jump + --key-jump+long= Long forward jump + --global-key-frame-next= + Next frame + --key-frame-next= Next frame + --global-key-quit= Quit + --key-quit= Quit + --global-key-vol-up= + Volume up + --key-vol-up= Volume up + --global-key-vol-down= + Volume down + --key-vol-down= Volume down + --global-key-vol-mute= + Mute + --key-vol-mute= Mute + --global-key-audio-track= + Cycle audio track + --key-audio-track= Cycle audio track + --global-key-audiodevice-cycle= + Cycle through audio devices + --key-audiodevice-cycle= + Cycle through audio devices + --global-key-subtitle-revtrack= + Cycle subtitle track in reverse order + --key-subtitle-revtrack= + Cycle subtitle track in reverse order + --global-key-subtitle-track= + Cycle subtitle track + --key-subtitle-track= + Cycle subtitle track + --global-key-subtitle-toggle= + Toggle subtitles + --key-subtitle-toggle= + Toggle subtitles + --global-key-program-sid-next= + Cycle next program Service ID + --key-program-sid-next= + Cycle next program Service ID + --global-key-program-sid-prev= + Cycle previous program Service ID + --key-program-sid-prev= + Cycle previous program Service ID + --global-key-aspect-ratio= + Cycle source aspect ratio + --key-aspect-ratio= + Cycle source aspect ratio + --global-key-crop= Cycle video crop + --key-crop= Cycle video crop + --global-key-toggle-autoscale= + Toggle autoscaling + --key-toggle-autoscale= + Toggle autoscaling + --global-key-incr-scalefactor= + Increase scale factor + --key-incr-scalefactor= + Increase scale factor + --global-key-decr-scalefactor= + Decrease scale factor + --key-decr-scalefactor= + Decrease scale factor + --global-key-deinterlace= + Toggle deinterlacing + --key-deinterlace= Toggle deinterlacing + --global-key-deinterlace-mode= + Cycle deinterlace modes + --key-deinterlace-mode= + Cycle deinterlace modes + --global-key-intf-show= + Show controller in fullscreen + --key-intf-show= Show controller in fullscreen + --global-key-wallpaper= + Toggle wallpaper mode in video output + --key-wallpaper= Toggle wallpaper mode in video output + --global-key-random= + Random + --key-random= Random + --global-key-loop= Normal/Loop/Repeat + --key-loop= Normal/Loop/Repeat + --global-key-zoom-quarter= + 1:4 Quarter + --key-zoom-quarter= + 1:4 Quarter + --global-key-zoom-half= + 1:2 Half + \ No newline at end of file