Speed up reading of metadata from PDF files on the device

This commit is contained in:
Kovid Goyal 2009-06-03 22:46:34 -07:00
parent 58bf0140a7
commit ae475bddb0
6 changed files with 48 additions and 4 deletions

View File

@ -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

View File

@ -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):

View File

@ -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:

View File

@ -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:

View File

@ -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):

View File

@ -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)