From 3c4b511e6ba42ad60fd0368e67c3cc437f693895 Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Sun, 5 Apr 2009 18:31:43 +0000 Subject: [PATCH] Fix displaying torrents with non-utf8 encodings in add torrent dialog --- deluge/core/rpcserver.py | 22 ++++++++++++++-------- deluge/ui/common.py | 29 +++++++++++++++++------------ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/deluge/core/rpcserver.py b/deluge/core/rpcserver.py index 410cd09ab..07e9d538a 100644 --- a/deluge/core/rpcserver.py +++ b/deluge/core/rpcserver.py @@ -134,16 +134,22 @@ class DelugeRPCProtocol(Protocol): continue # Format the RPCRequest message for debug printing - s = call[1] + "(" - if call[2]: - s += ", ".join([str(x) for x in call[2]]) - if call[3]: + try: + s = call[1] + "(" if call[2]: - s += ", " - s += ", ".join([key + "=" + str(value) for key, value in call[3].items()]) - s += ")" + s += ", ".join([str(x) for x in call[2]]) + if call[3]: + if call[2]: + s += ", " + s += ", ".join([key + "=" + str(value) for key, value in call[3].items()]) + s += ")" + except UnicodeEncodeError: + pass + #log.debug("RPCRequest had some non-ascii text..") + else: + pass + #log.debug("RPCRequest: %s", s) - #log.debug("RPCRequest: %s", s) reactor.callLater(0, self._dispatch, *call) def sendData(self, data): diff --git a/deluge/ui/common.py b/deluge/ui/common.py index 27cfa463b..0690a76ad 100644 --- a/deluge/ui/common.py +++ b/deluge/ui/common.py @@ -48,15 +48,20 @@ class TorrentInfo(object): self.__m_info_hash = sha(bencode.bencode(self.__m_metadata["info"])).hexdigest() + # Get encoding from torrent file if available + self.encoding = "UTF-8" + if "encoding" in self.__m_metadata: + self.encoding = self.__m_metadata["encoding"] + # Get list of files from torrent info paths = {} if self.__m_metadata["info"].has_key("files"): prefix = "" if len(self.__m_metadata["info"]["files"]) > 1: - prefix = self.__m_metadata["info"]["name"] + prefix = self.__m_metadata["info"]["name"].decode(self.encoding).encode("utf8") for index, f in enumerate(self.__m_metadata["info"]["files"]): - path = os.path.join(prefix, *f["path"]) + path = os.path.join(prefix, *f["path"]).decode(self.encoding).encode("utf8") f["index"] = index paths[path] = f @@ -70,40 +75,40 @@ class TorrentInfo(object): self.__m_files_tree = file_tree.get_tree() else: self.__m_files_tree = { - self.__m_metadata["info"]["name"]: (self.__m_metadata["info"]["length"], True) + self.__m_metadata["info"]["name"].decode(self.encoding).encode("utf8"): (self.__m_metadata["info"]["length"], True) } self.__m_files = [] if self.__m_metadata["info"].has_key("files"): prefix = "" if len(self.__m_metadata["info"]["files"]) > 1: - prefix = self.__m_metadata["info"]["name"] + prefix = self.__m_metadata["info"]["name"].decode(self.encoding).encode("utf8") for f in self.__m_metadata["info"]["files"]: self.__m_files.append({ - 'path': os.path.join(prefix, *f["path"]), + 'path': os.path.join(prefix, *f["path"]).decode(self.encoding).encode("utf8"), 'size': f["length"], 'download': True }) else: self.__m_files.append({ - "path": self.__m_metadata["info"]["name"], + "path": self.__m_metadata["info"]["name"].decode(self.encoding).encode("utf8"), "size": self.__m_metadata["info"]["length"], "download": True }) - + def as_dict(self, *keys): """ Return the torrent info as a dictionary, only including the passed in keys. - + :param *keys: str, a number of key strings """ return dict([(key, getattr(self, key)) for key in keys]) @property def name(self): - return self.__m_metadata["info"]["name"] + return self.__m_metadata["info"]["name"].decode(self.encoding).encode("utf8") @property def info_hash(self): @@ -125,7 +130,7 @@ class FileTree(object): def __init__(self, paths): """ Convert a list of paths in a file tree. - + :param paths: list, The paths to be converted. """ self.tree = {} @@ -152,7 +157,7 @@ class FileTree(object): def get_tree(self): """ Return the tree, after first converting all file lists to a tuple. - + :returns: dict, the file tree. """ def to_tuple(path, item): @@ -166,7 +171,7 @@ class FileTree(object): """ Walk through the file tree calling the callback function on each item contained. - + :param callback: function, The function to be used as a callback, it should have the signature func(item, path) where item is a `tuple` for a file and `dict` for a directory.