diff --git a/ChangeLog b/ChangeLog index ef8becf4a..38f284c78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,8 @@ ==== GtkUI ==== * Fix high cpu usage when displaying speeds in titlebar + * Fix showing non-utf8 encoded torrents in add torrent dialog -- this adds + an additional dependency on chardet. ==== WebUI ==== * Fix starting when -l option is used diff --git a/README b/README index d3f5b2da1..a73b276aa 100644 --- a/README +++ b/README @@ -41,7 +41,8 @@ sudo apt-get install g++ make python-all-dev python-all python-dbus \ python-gtk2 python-notify librsvg2-common python-xdg python-support \ subversion libboost-dev libboost-python-dev libboost-iostreams-dev \ libboost-thread-dev libboost-date-time-dev libboost-filesystem-dev \ - libboost-serialization-dev libssl-dev zlib1g-dev python-setuptools + libboost-serialization-dev libssl-dev zlib1g-dev python-setuptools \ + python-chardet The names of the packages may vary depending on your OS / distro. diff --git a/deluge/ui/common.py b/deluge/ui/common.py index 8ba6cfa8b..ebd5d9460 100644 --- a/deluge/ui/common.py +++ b/deluge/ui/common.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- # # deluge/ui/common.py # # Copyright (C) Damien Churchill 2008 +# Copyright (C) Andrew Resch 2009 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -32,9 +32,6 @@ # statement from all source files in the program, then also delete it here. # -# - - import os try: from hashlib import sha1 as sha @@ -46,6 +43,28 @@ from deluge import bencode from deluge.log import LOG as log import deluge.configmanager +def decode_string(s, encoding="utf8"): + """ + Decodes a string and re-encodes it in utf8. If it cannot decode using + `:param:encoding` then it will try to detect the string encoding and + decode it. + + :param s: str to decode + :param encoding: str, the encoding to use in the decoding + + """ + + try: + s = s.decode(encoding).encode("utf8") + except UnicodeDecodeError: + try: + import chardet + except ImportError: + s = s.decode(encoding, "replace").encode("utf8") + else: + s = s.decode(chardet.detect(s)["encoding"]).encode("utf8") + return s + class TorrentInfo(object): def __init__(self, filename): # Get the torrent data from the torrent file @@ -65,29 +84,31 @@ class TorrentInfo(object): elif "codepage" in self.__m_metadata: self.encoding = str(self.__m_metadata["codepage"]) + self.__m_name = decode_string(self.__m_metadata["info"]["name"]) + # Get list of files from torrent info 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"].decode(self.encoding, "replace").encode("utf8") + prefix = self.__m_name for f in self.__m_metadata["info"]["files"]: self.__m_files.append({ - 'path': os.path.join(prefix, *f["path"]).decode(self.encoding, "replace").encode("utf8"), + 'path': decode_string(os.path.join(prefix, *f["path"])), 'size': f["length"], 'download': True }) else: self.__m_files.append({ - "path": self.__m_metadata["info"]["name"].decode(self.encoding, "replace").encode("utf8"), + "path": self.__m_name, "size": self.__m_metadata["info"]["length"], "download": True }) @property def name(self): - return self.__m_metadata["info"]["name"].decode(self.encoding, "replace").encode("utf8") + return self.__m_name @property def info_hash(self):