diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index deec0fcedf..82a02cf196 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -181,6 +181,10 @@ class MetadataReaderPlugin(Plugin): type = _('Metadata reader') + def __init__(self, *args, **kwargs): + Plugin.__init__(self, *args, **kwargs) + self.quick = False + def get_metadata(self, stream, type): ''' Return metadata for the file represented by stream (a file like object diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 54fa0e862e..e26813a77a 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -182,7 +182,9 @@ class PDFMetadataReader(MetadataReaderPlugin): description = _('Read metadata from %s files')%'PDF' def get_metadata(self, stream, ftype): - from calibre.ebooks.metadata.pdf import get_metadata + from calibre.ebooks.metadata.pdf import get_metadata, get_quick_metadata + if self.quick: + return get_quick_metadata(stream) return get_metadata(stream) class RARMetadataReader(MetadataReaderPlugin): diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 2227f6d6f5..78afa3be15 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -145,6 +145,20 @@ def metadata_writers(): ans.add(plugin) return ans +class QuickMetadata(object): + + def __init__(self): + self.quick = False + + def __enter__(self): + self.quick = True + + def __exit__(self, *args): + self.quick = False + +quick_metadata = QuickMetadata() + + def get_file_type_metadata(stream, ftype): mi = MetaInformation(None, None) ftype = ftype.lower().strip() @@ -153,6 +167,7 @@ def get_file_type_metadata(stream, ftype): if not is_disabled(plugin): with plugin: try: + plugin.quick = quick_metadata.quick mi = plugin.get_metadata(stream, ftype.lower().strip()) break except: diff --git a/src/calibre/devices/jetbook/driver.py b/src/calibre/devices/jetbook/driver.py index 199566357b..0d815640b1 100644 --- a/src/calibre/devices/jetbook/driver.py +++ b/src/calibre/devices/jetbook/driver.py @@ -110,8 +110,7 @@ class JETBOOK(USBMS): return txt - from calibre.devices.usbms.driver import metadata_from_formats - mi = metadata_from_formats([path]) + mi = cls.metadata_from_formats([path]) if (mi.title==_('Unknown') or mi.authors==[_('Unknown')]) \ and '#' in mi.title: diff --git a/src/calibre/ebooks/metadata/pdf.py b/src/calibre/ebooks/metadata/pdf.py index 1fca98fc4c..0f7c1e4a89 100644 --- a/src/calibre/ebooks/metadata/pdf.py +++ b/src/calibre/ebooks/metadata/pdf.py @@ -18,7 +18,16 @@ except: from calibre.ebooks.metadata import MetaInformation, authors_to_string from calibre.utils.pdftk import set_metadata as pdftk_set_metadata from calibre.utils.podofo import get_metadata as podofo_get_metadata, \ - set_metadata as podofo_set_metadata, Unavailable, write_first_page + set_metadata as podofo_set_metadata, Unavailable, write_first_page, \ + get_metadata_quick + +def get_quick_metadata(stream): + raw = stream.read() + mi = get_metadata_quick(raw) + if mi.title == '_': + mi.title = getattr(stream, 'name', _('Unknown')) + mi.title = mi.title.rpartition('.')[0] + return mi def get_metadata(stream, extract_cover=True): diff --git a/src/calibre/utils/podofo/__init__.py b/src/calibre/utils/podofo/__init__.py index 7a5cd9bf87..d52e1b5658 100644 --- a/src/calibre/utils/podofo/__init__.py +++ b/src/calibre/utils/podofo/__init__.py @@ -80,6 +80,21 @@ def get_metadata(stream): if os.path.exists(pt.name): os.remove(pt.name) return mi +def get_metadata_quick(raw): + p = podofo.PDFDoc() + p.load(raw) + title = p.title + if not title: + title = '_' + author = p.author + authors = string_to_authors(author) if author else [_('Unknown')] + creator = p.creator + mi = MetaInformation(title, authors) + if creator: + mi.book_producer = creator + return mi + + def get_metadata_(path): p = podofo.PDFDoc() p.open(path)