diff --git a/recipes/le_monde.recipe b/recipes/le_monde.recipe index 3c47d81ee1..cf1f858dfe 100644 --- a/recipes/le_monde.recipe +++ b/recipes/le_monde.recipe @@ -48,7 +48,7 @@ class LeMonde(BasicNewsRecipe): if alink.string is not None: tstr = alink.string alink.replaceWith(tstr) - return soup + return self.adeify_images(soup) preprocess_regexps = [ (re.compile(r'([0-9])%'), lambda m: m.group(1) + ' %'), diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 08017b5c98..e91b4a62d5 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -118,6 +118,7 @@ sort_columns_at_startup = None # timestamp default if not set: dd MMM yyyy gui_pubdate_display_format = 'MMM yyyy' gui_timestamp_display_format = 'dd MMM yyyy' +gui_last_modified_display_format = 'dd MMM yyyy' #: Control sorting of titles and series in the library display # Control title and series sorting in the library view. If set to diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index d7811f0a22..b11a3f298c 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -460,7 +460,7 @@ class ITUNES(DriverBase): cached_books[this_book.path] = { 'title':book.Name, - 'author':book.artist().split(' & '), + 'author':book.Artist.split(' & '), 'lib_book':library_books[this_book.path] if this_book.path in library_books else None, 'uuid': book.Composer, 'format': 'pdf' if book.KindAsString.startswith('PDF') else 'epub' diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index 15fdceff15..74db3b3a58 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -400,7 +400,8 @@ class MetadataUpdater(object): if getattr(self, 'exth', None) is None: raise MobiError('No existing EXTH record. Cannot update metadata.') - self.record0[92:96] = iana2mobi(mi.language) + if not mi.is_null('language'): + self.record0[92:96] = iana2mobi(mi.language) self.create_exth(exth=exth, new_title=mi.title) # Fetch updated timestamp, cover_record, thumbnail_record diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index d059d7e34c..c335cc4c13 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -222,7 +222,7 @@ class SaveWorker(Thread): if isbytestring(fpath): fpath = fpath.decode(filesystem_encoding) formats[fmt.lower()] = fpath - data[i] = [opf, cpath, formats] + data[i] = [opf, cpath, formats, mi.last_modified.isoformat()] return data def run(self): diff --git a/src/calibre/ebooks/pdb/plucker/reader.py b/src/calibre/ebooks/pdb/plucker/reader.py index 39ceb33b13..d782e4e97c 100644 --- a/src/calibre/ebooks/pdb/plucker/reader.py +++ b/src/calibre/ebooks/pdb/plucker/reader.py @@ -16,6 +16,7 @@ from calibre import CurrentDir from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ptempfile import TemporaryFile from calibre.utils.magick import Image, create_canvas +from calibre.ebooks.compression.palmdoc import decompress_doc DATATYPE_PHTML = 0 DATATYPE_PHTML_COMPRESSED = 1 diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 80d3c1636e..f94e179166 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -118,8 +118,9 @@ def render_data(mi, use_roman_numbers=True, all_fields=False): links = [u'%s' % (url, id_typ, id_val, name) for name, id_typ, id_val, url in urls] links = u', '.join(links) - ans.append((field, u'
'+_('Quick create:') for col, name in [('isbn', _('ISBN')), ('formats', _('Formats')), - ('last_modified', _('Modified Date')), ('yesno', _('Yes/No')), + ('yesno', _('Yes/No')), ('tags', _('Tags')), ('series', _('Series')), ('rating', _('Rating')), ('people', _("People's names"))]: text += ' %s,'%(col, name) @@ -150,7 +150,6 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'tags': _('My Tags'), 'series': _('My Series'), 'rating': _('My Rating'), - 'last_modified':_('Modified Date'), 'people': _('People')}[which]) self.is_names.setChecked(which == 'people') if self.composite_box.isVisible(): @@ -158,9 +157,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): { 'isbn': '{identifiers:select(isbn)}', 'formats': '{formats}', - 'last_modified':'''{last_modified:'format_date($, "dd MMM yyyy")'}''' }[which]) - self.composite_sort_by.setCurrentIndex(2 if which == 'last_modified' else 0) + self.composite_sort_by.setCurrentIndex(0) def datatype_changed(self, *args): try: diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index 4a6c7cfc06..f487051d07 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -209,8 +209,11 @@ class FieldsModel(QAbstractListModel): # {{{ return ret def commit(self): - val = [k for k, v in self.overrides.iteritems() if v == Qt.Unchecked] - msprefs['ignore_fields'] = val + ignored_fields = set([x for x in msprefs['ignore_fields'] if x not in + self.overrides]) + changed = set([k for k, v in self.overrides.iteritems() if v == + Qt.Unchecked]) + msprefs['ignore_fields'] = list(ignored_fields.union(changed)) # }}} diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index ca256e0350..543c6eab96 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -406,11 +406,9 @@ class ResultCache(SearchQueryParser): # {{{ if val_func is None: loc = self.field_metadata[location]['rec_index'] val_func = lambda item, loc=loc: item[loc] - dt = self.field_metadata[location]['datatype'] - q = '' - val_func = lambda item, loc=loc: item[loc] cast = adjust = lambda x: x + dt = self.field_metadata[location]['datatype'] if query == 'false': if dt == 'rating' or location == 'cover': diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 0ae4d74242..979e98a819 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -368,7 +368,8 @@ class FieldMetadata(dict): 'date_format': tweaks['gui_timestamp_display_format']} self._tb_cats['pubdate']['display'] = { 'date_format': tweaks['gui_pubdate_display_format']} - self._tb_cats['last_modified']['display'] = {'date_format': 'iso'} + self._tb_cats['last_modified']['display'] = { + 'date_format': tweaks['gui_last_modified_display_format']} self.custom_field_prefix = '#' self.get = self._tb_cats.get diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index f7f5559412..709e3645a6 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -17,6 +17,7 @@ from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.constants import preferred_encoding from calibre.ebooks.metadata import fmt_sidx from calibre.ebooks.metadata import title_sort +from calibre.utils.date import parse_date from calibre import strftime, prints, sanitize_file_name_unicode plugboard_any_device_value = 'any device' @@ -42,6 +43,8 @@ FORMAT_ARG_DESCS = dict( publisher=_('The publisher'), timestamp=_('The date'), pubdate=_('The published date'), + last_modified=_('The date when the metadata for this book record' + ' was last modified'), id=_('The calibre internal id') ) @@ -191,6 +194,9 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, format_args['timestamp'] = strftime(timefmt, mi.timestamp.timetuple()) if hasattr(mi.pubdate, 'timetuple'): format_args['pubdate'] = strftime(timefmt, mi.pubdate.timetuple()) + if hasattr(mi, 'last_modified') and hasattr(mi.last_modified, 'timetuple'): + format_args['last_modified'] = strftime(timefmt, mi.last_modified.timetuple()) + format_args['id'] = str(id) # Now format the custom fields custom_metadata = mi.get_all_user_metadata(make_copy=False) @@ -373,10 +379,14 @@ def save_serialized_to_disk(ids, data, plugboards, root, opts, callback): root, opts, length = _sanitize_args(root, opts) failures = [] for x in ids: - opf, cover, format_map = data[x] + opf, cover, format_map, last_modified = data[x] if isinstance(opf, unicode): opf = opf.encode('utf-8') mi = OPF(cStringIO.StringIO(opf)).to_book_metadata() + try: + mi.last_modified = parse_date(last_modified) + except: + pass tb = '' try: failed, id, title = do_save_book_to_disk(x, mi, cover, plugboards, diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index 7b6e60c93a..a4e18c2e07 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -365,6 +365,8 @@ Dates and numeric fields support the relational operators ``=`` (equals), ``>`` Rating fields are considered to be numeric. For example, the search ``rating:>=3`` will find all books rated 3 or higher. +You can search for the number of items in multiple-valued fields such as tags). These searches begin with the character ``#``, then use the same syntax as numeric fields. For example, to find all books with more than 4 tags, use ``tags:#>4``. To find all books with exactly 10 tags, use ``tags:#=10``. + Series indices are searchable. For the standard series, the search name is 'series_index'. For custom series columns, use the column search name followed by _index. For example, to search the indices for a custom series column named ``#my_series``, you would use the search name ``#my_series_index``.