From 1c9a56e9d57eba12d538b75de3111968dacad768 Mon Sep 17 00:00:00 2001 From: Et0h Date: Thu, 2 Jun 2016 17:35:19 +0100 Subject: [PATCH] Fix thread crash with directory search error messages + Add error/notification when adding file(s) not in a known media directory --- syncplay/client.py | 40 +++++++++++++++++++++++++++++++--------- syncplay/messages_de.py | 1 + syncplay/messages_en.py | 1 + syncplay/messages_ru.py | 1 + syncplay/ui/gui.py | 1 + 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index a187e42..23c21e8 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -434,6 +434,7 @@ class SyncplayClient(object): return self._globalPaused def updateFile(self, filename, duration, path): + newPath = u"" if utils.isURL(path): filename = path @@ -447,6 +448,8 @@ class SyncplayClient(object): size = os.path.getsize(path) except: size = 0 + if not utils.isURL(path) and os.path.exists(path): + self.fileSwitch.notifyUserIfFileNotInMediaDirectory(filename, path) filename, size = self.__executePrivacySettings(filename, size) self.userlist.currentUser.setFile(filename, duration, size, path) self.sendFile() @@ -1403,6 +1406,7 @@ class SyncplayPlaylist(): try: filename = self._playlist[index] + # TODO: Handle isse with index being None if utils.isURL(filename): if self._client.isURITrusted(filename): self._client.openFile(filename, resetPosition=resetPosition) @@ -1578,12 +1582,13 @@ class FileSwitchManager(object): self.mediaDirectories = None self.lock = threading.Lock() self.folderSearchEnabled = True - self.disabledDir = None + self.directorySearchError = None self.newInfo = False self.currentlyUpdating = False self.newWatchlist = [] self.fileSwitchTimer = task.LoopingCall(self.updateInfo) self.fileSwitchTimer.start(constants.FOLDER_SEARCH_DOUBLE_CHECK_INTERVAL, True) + self.mediaDirectoriesNotFound = [] def setClient(self, newClient): self.client = newClient @@ -1597,6 +1602,7 @@ class FileSwitchManager(object): ConfigurationGetter().setConfigOption("mediaSearchDirectories", mediaDirs) self._client._config["mediaSearchDirectories"] = mediaDirs self._client.ui.showMessage(getMessage("media-directory-list-updated-notification")) + self.mediaDirectoriesNotFound = [] self.folderSearchEnabled = True self.setMediaDirectories(mediaDirs) @@ -1608,6 +1614,9 @@ class FileSwitchManager(object): if self.newInfo: self.newInfo = False self.infoUpdated() + if self.directorySearchError: + self._client.ui.showErrorMessage(self.directorySearchError) + self.directorySearchError = None def updateInfo(self): if not self.currentlyUpdating and self.mediaDirectories: @@ -1631,7 +1640,7 @@ class FileSwitchManager(object): randomFilename = u"RandomFile"+unicode(random.randrange(10000, 99999))+".txt" if time.time() - startTime > constants.FOLDER_SEARCH_FIRST_FILE_TIMEOUT: self.folderSearchEnabled = False - self._client.ui.showErrorMessage(getMessage("folder-search-first-file-timeout-error").format(directory)) + self.directorySearchError = getMessage("folder-search-first-file-timeout-error").format(directory) return # Actual directory search @@ -1641,12 +1650,8 @@ class FileSwitchManager(object): for root, dirs, files in os.walk(directory): newMediaFilesCache[root] = files if time.time() - startTime > constants.FOLDER_SEARCH_TIMEOUT: - self.disabledDir = directory + self.directorySearchError = getMessage("folder-search-timeout-error").format(directory) self.folderSearchEnabled = False - if not self.folderSearchEnabled: - if self.disabledDir is not None: - self._client.ui.showErrorMessage(getMessage("folder-search-timeout-error").format(self.disabledDir)) - self.disabledDir = None return if self.mediaFilesCache <> newMediaFilesCache: @@ -1690,8 +1695,8 @@ class FileSwitchManager(object): if filename in files: return os.path.join(root,filename) if time.time() - startTime > constants.FOLDER_SEARCH_TIMEOUT: - self.disabledDir = directory self.folderSearchEnabled = False + self.directorySearchError = getMessage("folder-search-timeout-error").format(directory) return None return None @@ -1714,4 +1719,21 @@ class FileSwitchManager(object): files = self.mediaFilesCache[directory] if filename in files: return directory - return None \ No newline at end of file + return None + + def notifyUserIfFileNotInMediaDirectory(self, filenameToFind, path): + directoryToFind = os.path.dirname(path) + if directoryToFind in self.mediaDirectoriesNotFound: + return + if self.mediaDirectories and self.mediaFilesCache is not None: + if self.mediaFilesCache: + if directoryToFind in self.mediaFilesCache: + return + for directory in self.mediaFilesCache: + files = self.mediaFilesCache[directory] + if filenameToFind in files: + return + if directoryToFind in self.mediaFilesCache: + return + self._client.ui.showErrorMessage(getMessage("added-file-not-in-media-directory-error").format(directoryToFind)) + self.mediaDirectoriesNotFound.append(directoryToFind) \ No newline at end of file diff --git a/syncplay/messages_de.py b/syncplay/messages_de.py index f92f17f..89a824f 100644 --- a/syncplay/messages_de.py +++ b/syncplay/messages_de.py @@ -141,6 +141,7 @@ de = { "switch-file-not-found-error" : u"Konnte nicht zur Datei '{0}' wechseln. Syncplay looks in the specified media directories.", # File not found, folder it was not found in # TODO: Re-translate "Syncplay sucht im Ordner der aktuellen Datei und angegebenen Medien-Verzeichnissen." to reference to checking in "current media directory" "folder-search-timeout-error" : u"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.", #Folder # TODO: Translate "folder-search-first-file-timeout-error" : u"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 # TODO: Translate + "added-file-not-in-media-directory-error" : u"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 # TODO: Translate "failed-to-load-server-list-error" : u"Konnte die Liste der öffentlichen Server nicht laden. Bitte besuche http://www.syncplay.pl/ [Englisch] mit deinem Browser.", diff --git a/syncplay/messages_en.py b/syncplay/messages_en.py index 2519be0..ba99bec 100644 --- a/syncplay/messages_en.py +++ b/syncplay/messages_en.py @@ -141,6 +141,7 @@ en = { "switch-file-not-found-error" : u"Could not switch to file '{0}'. Syncplay looks in specified media directories.", # File not found "folder-search-timeout-error" : u"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.", #Folder "folder-search-first-file-timeout-error" : u"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" : u"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 "failed-to-load-server-list-error" : u"Failed to load public server list. Please visit http://www.syncplay.pl/ in your browser.", diff --git a/syncplay/messages_ru.py b/syncplay/messages_ru.py index 6179e8a..5efbc89 100644 --- a/syncplay/messages_ru.py +++ b/syncplay/messages_ru.py @@ -141,6 +141,7 @@ ru = { "switch-file-not-found-error" : u"Невозможно переключиться на файл '{0}'. Syncplay looks in the folder specified media directories.", # File not found # TODO: Translate last part into Russian "folder-search-timeout-error" : u"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.", #Folder # TODO: Translate "folder-search-first-file-timeout-error" : u"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 # TODO: Translate + "added-file-not-in-media-directory-error" : u"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 #TODO: Translate "failed-to-load-server-list-error" : u"Failed to load public server list. Please visit http://www.syncplay.pl/ in your browser.", # TODO: Translate into Russian diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py index c35943b..40b5ddc 100644 --- a/syncplay/ui/gui.py +++ b/syncplay/ui/gui.py @@ -1348,6 +1348,7 @@ class MainWindow(QtGui.QMainWindow): self.playlist.addItem(filename) else: self.playlist.insertItem(index, filename) + self._syncplayClient.fileSwitch.notifyUserIfFileNotInMediaDirectory(filename, filePath) elif isURL(filePath): self.removePlaylistNote() if self.noPlaylistDuplicates(filePath):