diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 23f59e4737..6652d581d4 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -58,9 +58,16 @@ class PRS505(USBMS): SUPPORTS_USE_AUTHOR_SORT = True EBOOK_DIR_MAIN = 'database/media/books' + ALL_BY_TITLE = _('All by title') + ALL_BY_AUTHOR = _('All by author') + EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of metadata fields ' 'to turn into collections on the device. Possibilities include: ')+\ - 'series, tags, authors' + 'series, tags, authors' +\ + _('. Two special collections are available: %s:%s and %s:%s. Add ' + 'these values to the list to enable them. The collections will be ' + 'given the name provided after the ":" character.')%( + 'abt', ALL_BY_TITLE, 'aba', ALL_BY_AUTHOR) EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(['series', 'tags']) plugboard = None @@ -151,7 +158,7 @@ class PRS505(USBMS): blists[i] = booklists[i] opts = self.settings() if opts.extra_customization: - collections = [x.lower().strip() for x in + collections = [x.strip() for x in opts.extra_customization.split(',')] else: collections = [] diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index f271329fc8..841f6bc346 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -410,6 +410,9 @@ class XMLCache(object): newmi = book.deepcopy_metadata() newmi.template_to_attribute(book, plugboard) newmi.set('_new_book', getattr(book, '_new_book', False)) + book.set('_pb_title_sort', + newmi.get('title_sort', newmi.get('title', None))) + book.set('_pb_author_sort', newmi.get('author_sort', '')) else: newmi = book (gtz_count, ltz_count, use_tz_var) = \ diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 3372f5c8a5..a9c980c31b 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -132,9 +132,24 @@ class CollectionsBookList(BookList): use_renaming_rules = prefs['manage_device_metadata'] == 'on_connect' collections = {} - # This map of sets is used to avoid linear searches when testing for - # book equality + + # get the special collection names + all_by_author = '' + all_by_title = '' + ca = [] + for c in collection_attributes: + if c.startswith('aba:') and c[4:]: + all_by_author = c[4:] + elif c.startswith('abt:') and c[4:]: + all_by_title = c[4:] + else: + ca.append(c.lower()) + collection_attributes = ca + for book in self: + tsval = book.get('_pb_title_sort', + book.get('title_sort', book.get('title', 'zzzz'))) + asval = book.get('_pb_author_sort', book.get('author_sort', '')) # Make sure we can identify this book via the lpath lpath = getattr(book, 'lpath', None) if lpath is None: @@ -211,22 +226,29 @@ class CollectionsBookList(BookList): collections[cat_name] = {} if use_renaming_rules and sort_attr: sort_val = book.get(sort_attr, None) - collections[cat_name][lpath] = \ - (book, sort_val, book.get('title_sort', 'zzzz')) + collections[cat_name][lpath] = (book, sort_val, tsval) elif is_series: if doing_dc: collections[cat_name][lpath] = \ - (book, book.get('series_index', sys.maxint), - book.get('title_sort', 'zzzz')) + (book, book.get('series_index', sys.maxint), tsval) else: collections[cat_name][lpath] = \ - (book, book.get(attr+'_index', sys.maxint), - book.get('title_sort', 'zzzz')) + (book, book.get(attr+'_index', sys.maxint), tsval) else: if lpath not in collections[cat_name]: - collections[cat_name][lpath] = \ - (book, book.get('title_sort', 'zzzz'), - book.get('title_sort', 'zzzz')) + collections[cat_name][lpath] = (book, tsval, tsval) + + # All books by author + if all_by_author: + if all_by_author not in collections: + collections[all_by_author] = {} + collections[all_by_author][lpath] = (book, asval, tsval) + # All books by title + if all_by_title: + if all_by_title not in collections: + collections[all_by_title] = {} + collections[all_by_title][lpath] = (book, tsval, asval) + # Sort collections result = {}