Apple driver: Handle invalid EPUBs that do not contain an OPF file

This commit is contained in:
Kovid Goyal 2011-04-30 08:24:54 -06:00
commit 309c85a14e

View File

@ -163,6 +163,8 @@ class ITUNES(DriverBase):
settings() settings()
set_progress_reporter() set_progress_reporter()
upload_books() upload_books()
_get_fpath()
_update_epub_metadata()
add_books_to_metadata() add_books_to_metadata()
use_plugboard_ext() use_plugboard_ext()
set_plugboard() set_plugboard()
@ -2621,45 +2623,42 @@ class ITUNES(DriverBase):
# Touch the OPF timestamp # Touch the OPF timestamp
try: try:
zf_opf = ZipFile(fpath,'r') zf_opf = ZipFile(fpath,'r')
fnames = zf_opf.namelist()
opf = [x for x in fnames if '.opf' in x][0]
except: except:
raise UserFeedback("'%s' is not a valid EPUB" % metadata.title, raise UserFeedback("'%s' is not a valid EPUB" % metadata.title,
None, None,
level=UserFeedback.WARN) level=UserFeedback.WARN)
fnames = zf_opf.namelist()
try: opf_tree = etree.fromstring(zf_opf.read(opf))
opf = [x for x in fnames if '.opf' in x][0] md_els = opf_tree.xpath('.//*[local-name()="metadata"]')
except: if md_els:
opf = None ts = md_els[0].find('.//*[@name="calibre:timestamp"]')
if opf: if ts is not None:
opf_tree = etree.fromstring(zf_opf.read(opf)) timestamp = ts.get('content')
md_els = opf_tree.xpath('.//*[local-name()="metadata"]') old_ts = parse_date(timestamp)
if md_els: metadata.timestamp = datetime.datetime(old_ts.year, old_ts.month, old_ts.day, old_ts.hour,
ts = md_els[0].find('.//*[@name="calibre:timestamp"]') old_ts.minute, old_ts.second, old_ts.microsecond+1, old_ts.tzinfo)
if ts is not None: if DEBUG:
timestamp = ts.get('content') self.log.info(" existing timestamp: %s" % metadata.timestamp)
old_ts = parse_date(timestamp)
metadata.timestamp = datetime.datetime(old_ts.year, old_ts.month, old_ts.day, old_ts.hour,
old_ts.minute, old_ts.second, old_ts.microsecond+1, old_ts.tzinfo)
if DEBUG:
self.log.info(" existing timestamp: %s" % metadata.timestamp)
else:
metadata.timestamp = now()
if DEBUG:
self.log.info(" add timestamp: %s" % metadata.timestamp)
else: else:
metadata.timestamp = now() metadata.timestamp = now()
if DEBUG: if DEBUG:
self.log.warning(" missing <metadata> block in OPF file")
self.log.info(" add timestamp: %s" % metadata.timestamp) self.log.info(" add timestamp: %s" % metadata.timestamp)
# Force the language declaration for iBooks 1.1 else:
#metadata.language = get_lang().replace('_', '-') metadata.timestamp = now()
# Updates from metadata plugboard (ignoring publisher)
metadata.language = metadata_x.language
if DEBUG: if DEBUG:
if metadata.language != metadata_x.language: self.log.warning(" missing <metadata> block in OPF file")
self.log.info(" rewriting language: <dc:language>%s</dc:language>" % metadata.language) self.log.info(" add timestamp: %s" % metadata.timestamp)
# Force the language declaration for iBooks 1.1
#metadata.language = get_lang().replace('_', '-')
# Updates from metadata plugboard (ignoring publisher)
metadata.language = metadata_x.language
if DEBUG:
if metadata.language != metadata_x.language:
self.log.info(" rewriting language: <dc:language>%s</dc:language>" % metadata.language)
zf_opf.close() zf_opf.close()