summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Resch <andrewresch@gmail.com>2009-05-09 17:46:13 +0000
committerAndrew Resch <andrewresch@gmail.com>2009-05-09 17:46:13 +0000
commit2856e948deef3a5270ce3622e6296f456f39c6b1 (patch)
tree5c1b3f50fdcff5472dc72dc5259597e1b74554b3
parent2f955b62f9b237326b687313a1fc1fddcfc24c3f (diff)
downloaddeluge-2856e948deef3a5270ce3622e6296f456f39c6b1.tar.gz
deluge-2856e948deef3a5270ce3622e6296f456f39c6b1.tar.bz2
deluge-2856e948deef3a5270ce3622e6296f456f39c6b1.zip
Fix showing non-utf8 encoded torrents in add torrent dialog -- this adds an additional dependency on chardet.
-rw-r--r--ChangeLog2
-rw-r--r--README3
-rw-r--r--deluge/ui/common.py37
3 files changed, 33 insertions, 9 deletions
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 <damoxc@gmail.com>
+# Copyright (C) Andrew Resch 2009 <andrewresch@gmail.com>
#
# 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):