diff --git a/src/calibre/srv/content.py b/src/calibre/srv/content.py index ad25c2c3e3..d638203a44 100644 --- a/src/calibre/srv/content.py +++ b/src/calibre/srv/content.py @@ -166,7 +166,10 @@ def book_fmt(ctx, rd, library_id, db, book_id, fmt): au = authors_to_string(mi.authors or [_('Unknown')]) title = mi.title or _('Unknown') - fname = '%s - %s_%s.%s' % (title[:30], au[:30], book_id, fmt) + ext = fmt + if ext == 'kepub' and 'Kobo Touch' in rd.inheaders.get('User-Agent', ''): + ext = 'kepub.epub' + fname = '%s - %s_%s.%s' % (title[:30], au[:30], book_id, ext) fname = ascii_filename(fname).replace('"', '_') rd.outheaders['Content-Disposition'] = 'attachment; filename="%s"' % fname diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py index 7605c67674..259701e3ab 100644 --- a/src/calibre/srv/opds.py +++ b/src/calibre/srv/opds.py @@ -15,10 +15,10 @@ from lxml import etree, html from lxml.builder import ElementMaker from calibre.constants import __appname__ +from calibre.db.view import sanitize_sort_field_name from calibre.ebooks.metadata import fmt_sidx, authors_to_string from calibre.library.comments import comments_to_html from calibre import guess_type, prepare_string_for_xml as xml -from calibre.utils.config import tweaks from calibre.utils.icu import sort_key from calibre.utils.date import as_utc, timestampfromdt @@ -45,17 +45,13 @@ def atom(ctx, rd, endpoint, output): ans = etree.tostring(output, encoding='utf-8', xml_declaration=True, pretty_print=True) return ans -def format_tag_string(tags, sep, no_tag_count=False, joinval=', '): +def format_tag_string(tags, sep, joinval=', '): if tags: tlist = tags if sep is None else [t.strip() for t in tags.split(sep)] else: tlist = [] tlist.sort(key=sort_key) - if no_tag_count: - return joinval.join(tlist) if tlist else '' - else: - return u'%s:&:%s'%(tweaks['max_content_server_tags_shown'], - joinval.join(tlist)) if tlist else '' + return joinval.join(tlist) if tlist else '' # Vocabulary for building OPDS feeds {{{ E = ElementMaker(namespace='http://www.w3.org/2005/Atom', @@ -176,7 +172,7 @@ def ACQUISITION_ENTRY(book_id, updated, request_context): rating = u''.join(repeat(u'\u2605', int(mi.rating/2.))) extra.append(_('RATING: %s
')%rating) if mi.tags: - extra.append(_('TAGS: %s
')%xml(format_tag_string(mi.tags, None, no_tag_count=True))) + extra.append(_('TAGS: %s
')%xml(format_tag_string(mi.tags, None))) if mi.series: extra.append(_('SERIES: %(series)s [%(sidx)s]
')% dict(series=xml(mi.series), @@ -191,7 +187,6 @@ def ACQUISITION_ENTRY(book_id, updated, request_context): (xml(name), xml(format_tag_string(val, fm['is_multiple']['ui_to_list'], - no_tag_count=True, joinval=fm['is_multiple']['list_to_ui'])))) elif datatype == 'comments' or (fm['datatype'] == 'composite' and fm['display'].get('contains_html', False)): @@ -363,6 +358,7 @@ def get_acquisition_feed(rc, ids, offset, page_url, up_url, id_, if not ids: raise HTTPNotFound('No books found') with rc.db.safe_read_lock: + sort_by = sanitize_sort_field_name(rc.db.field_metadata, sort_by) items = rc.db.multisort([(sort_by, ascending)], ids) max_items = rc.opts.max_opds_items offsets = Offsets(offset, max_items, len(items))