diff --git a/src/calibre/ebooks/docx/writer/container.py b/src/calibre/ebooks/docx/writer/container.py
index 82ae0bd8f7..9dd894db8b 100644
--- a/src/calibre/ebooks/docx/writer/container.py
+++ b/src/calibre/ebooks/docx/writer/container.py
@@ -223,13 +223,13 @@ class DOCX(object):
@property
def containerrels(self):
- return textwrap.dedent(b'''\
+ return textwrap.dedent('''\
- '''.format(**self.namespace.names))
+ '''.format(**self.namespace.names)).encode('utf-8')
@property
def websettings(self):
diff --git a/src/calibre/gui2/preferences/server.py b/src/calibre/gui2/preferences/server.py
index 65caf30461..a8bb1c5dae 100644
--- a/src/calibre/gui2/preferences/server.py
+++ b/src/calibre/gui2/preferences/server.py
@@ -32,7 +32,7 @@ from calibre.srv.users import (
UserManager, create_user_data, validate_password, validate_username
)
from calibre.utils.icu import primary_sort_key
-from polyglot.binary import unicode_type
+from polyglot.builtins import unicode_type, as_bytes
try:
from PyQt5 import sip
@@ -967,7 +967,7 @@ class CustomList(QWidget): # {{{
if path:
raw = self.serialize(self.current_template)
with lopen(path, 'wb') as f:
- f.write(raw)
+ f.write(as_bytes(raw))
def thumbnail_state_changed(self):
is_enabled = bool(self.thumbnail.isChecked())
@@ -1020,7 +1020,7 @@ class CustomList(QWidget): # {{{
else:
raw = self.serialize(template)
with lopen(custom_list_template.path, 'wb') as f:
- f.write(raw)
+ f.write(as_bytes(raw))
return True
# }}}
diff --git a/src/calibre/srv/books.py b/src/calibre/srv/books.py
index 3fd0bed4da..50dbada744 100644
--- a/src/calibre/srv/books.py
+++ b/src/calibre/srv/books.py
@@ -2,21 +2,27 @@
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal
-from __future__ import (unicode_literals, division, absolute_import,
- print_function)
-from hashlib import sha1
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import errno
+import json as jsonlib
+import os
+import shutil
+import tempfile
+import time
from functools import partial
-from threading import RLock, Lock
-import errno, os, tempfile, shutil, time, json as jsonlib
+from hashlib import sha1
+from threading import Lock, RLock
from calibre.constants import cache_dir, iswindows
from calibre.customize.ui import plugin_for_input_format
+from calibre.srv.errors import BookNotFound, HTTPNotFound
from calibre.srv.metadata import book_as_json
from calibre.srv.render_book import RENDER_VERSION
-from calibre.srv.errors import HTTPNotFound, BookNotFound
from calibre.srv.routes import endpoint, json
-from calibre.srv.utils import get_library_data, get_db
+from calibre.srv.utils import get_db, get_library_data
from calibre.utils.serialize import json_dumps
+from polyglot.builtins import as_unicode
cache_lock = RLock()
queued_jobs = {}
@@ -50,7 +56,7 @@ def books_cache_dir():
def book_hash(library_uuid, book_id, fmt, size, mtime):
raw = json_dumps((library_uuid, book_id, fmt.upper(), size, mtime, RENDER_VERSION))
- return sha1(raw).hexdigest().decode('ascii')
+ return as_unicode(sha1(raw).hexdigest())
staging_cleaned = False
diff --git a/src/calibre/srv/render_book.py b/src/calibre/srv/render_book.py
index 407c457889..c269f6d015 100644
--- a/src/calibre/srv/render_book.py
+++ b/src/calibre/srv/render_book.py
@@ -31,7 +31,7 @@ from calibre.ebooks.oeb.polish.utils import extract, guess_type
from calibre.utils.logging import default_log
from calibre.utils.short_uuid import uuid4
from polyglot.binary import as_base64_unicode as encode_component, from_base64_unicode as decode_component
-from polyglot.builtins import iteritems, map, unicode_type
+from polyglot.builtins import iteritems, map, is_py3, unicode_type
from polyglot.urllib import quote, urlparse
RENDER_VERSION = 1
@@ -501,7 +501,10 @@ def html_as_dict(root):
if child.tag.partition('}')[-1] not in ('head', 'body'):
root.remove(child)
root.text = root.tail = None
- nsmap = defaultdict(count().next)
+ if is_py3:
+ nsmap = defaultdict(count().__next__)
+ else:
+ nsmap = defaultdict(count().next)
nsmap[XHTML_NS]
tags = [serialize_elem(root, nsmap)]
tree = [0]
diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py
index 6575787519..1619481536 100644
--- a/src/calibre/srv/utils.py
+++ b/src/calibre/srv/utils.py
@@ -22,7 +22,7 @@ from calibre.utils.shared_file import share_open, raise_winerror
from polyglot.builtins import iteritems, map, range
from polyglot import reprlib
from polyglot.http_cookie import SimpleCookie
-from polyglot.builtins import unicode_type
+from polyglot.builtins import is_py3, unicode_type, as_bytes, as_unicode
from polyglot.urllib import parse_qs, quote as urlquote
from polyglot.binary import as_hex_unicode as encode_name, from_hex_unicode as decode_name
@@ -530,10 +530,10 @@ def get_use_roman():
return _use_roman
-if iswindows:
+if iswindows and not is_py3:
def fast_now_strftime(fmt):
- fmt = fmt.encode('mbcs')
+ fmt = as_bytes(fmt, encoding='mbcs')
return time.strftime(fmt).decode('mbcs', 'replace')
else:
def fast_now_strftime(fmt):
- return time.strftime(fmt).decode('utf-8', 'replace')
+ return as_unicode(time.strftime(fmt), errors='replace')