mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
EPUB input plugin now move OPF to top of tree as required by the rest of the pipeline
This commit is contained in:
parent
5c5a4d8676
commit
1424632286
@ -19,24 +19,6 @@ from calibre.utils.zipfile import ZipFile
|
|||||||
from calibre.customize.ui import run_plugins_on_preprocess
|
from calibre.customize.ui import run_plugins_on_preprocess
|
||||||
|
|
||||||
|
|
||||||
def epub2opf(path, tdir, opts):
|
|
||||||
zf = ZipFile(path)
|
|
||||||
zf.extractall(tdir)
|
|
||||||
opts.chapter_mark = 'none'
|
|
||||||
encfile = os.path.join(tdir, 'META-INF', 'encryption.xml')
|
|
||||||
opf = None
|
|
||||||
for f in walk(tdir):
|
|
||||||
if f.lower().endswith('.opf'):
|
|
||||||
opf = f
|
|
||||||
break
|
|
||||||
if opf and os.path.exists(encfile):
|
|
||||||
if not process_encryption(encfile, opf):
|
|
||||||
raise DRMError(os.path.basename(path))
|
|
||||||
|
|
||||||
if opf is None:
|
|
||||||
raise ValueError('%s is not a valid EPUB file'%path)
|
|
||||||
return opf
|
|
||||||
|
|
||||||
SOURCE_FORMATS = ['lit', 'mobi', 'prc', 'azw', 'fb2', 'odt', 'rtf',
|
SOURCE_FORMATS = ['lit', 'mobi', 'prc', 'azw', 'fb2', 'odt', 'rtf',
|
||||||
'txt', 'pdf', 'rar', 'zip', 'oebzip', 'htm', 'html', 'epub']
|
'txt', 'pdf', 'rar', 'zip', 'oebzip', 'htm', 'html', 'epub']
|
||||||
|
|
||||||
|
@ -11,12 +11,12 @@ from lxml import etree
|
|||||||
from calibre.customize.conversion import InputFormatPlugin
|
from calibre.customize.conversion import InputFormatPlugin
|
||||||
|
|
||||||
class EPUBInput(InputFormatPlugin):
|
class EPUBInput(InputFormatPlugin):
|
||||||
|
|
||||||
name = 'EPUB Input'
|
name = 'EPUB Input'
|
||||||
author = 'Kovid Goyal'
|
author = 'Kovid Goyal'
|
||||||
description = 'Convert EPUB files (.epub) to HTML'
|
description = 'Convert EPUB files (.epub) to HTML'
|
||||||
file_types = set(['epub'])
|
file_types = set(['epub'])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def decrypt_font(cls, key, path):
|
def decrypt_font(cls, key, path):
|
||||||
raw = open(path, 'rb').read()
|
raw = open(path, 'rb').read()
|
||||||
@ -26,7 +26,7 @@ class EPUBInput(InputFormatPlugin):
|
|||||||
with open(path, 'wb') as f:
|
with open(path, 'wb') as f:
|
||||||
f.write(decrypt)
|
f.write(decrypt)
|
||||||
f.write(raw[1024:])
|
f.write(raw[1024:])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def process_ecryption(cls, encfile, opf, log):
|
def process_ecryption(cls, encfile, opf, log):
|
||||||
key = None
|
key = None
|
||||||
@ -55,21 +55,35 @@ class EPUBInput(InputFormatPlugin):
|
|||||||
from calibre.utils.zipfile import ZipFile
|
from calibre.utils.zipfile import ZipFile
|
||||||
from calibre import walk
|
from calibre import walk
|
||||||
from calibre.ebooks import DRMError
|
from calibre.ebooks import DRMError
|
||||||
|
from calibre.ebooks.metadata.opf2 import OPF
|
||||||
zf = ZipFile(stream)
|
zf = ZipFile(stream)
|
||||||
zf.extractall(os.getcwd())
|
zf.extractall(os.getcwd())
|
||||||
encfile = os.path.abspath(os.path.join('META-INF', 'encryption.xml'))
|
encfile = os.path.abspath(os.path.join('META-INF', 'encryption.xml'))
|
||||||
opf = None
|
opf = None
|
||||||
for f in walk('.'):
|
for f in walk(u'.'):
|
||||||
if f.lower().endswith('.opf'):
|
if f.lower().endswith('.opf'):
|
||||||
opf = f
|
opf = os.path.abspath(f)
|
||||||
break
|
break
|
||||||
path = getattr(stream, 'name', 'stream')
|
path = getattr(stream, 'name', 'stream')
|
||||||
|
|
||||||
if opf is None:
|
if opf is None:
|
||||||
raise ValueError('%s is not a valid EPUB file'%path)
|
raise ValueError('%s is not a valid EPUB file'%path)
|
||||||
|
|
||||||
if os.path.exists(encfile):
|
if os.path.exists(encfile):
|
||||||
if not self.process_encryption(encfile, opf, log):
|
if not self.process_encryption(encfile, opf, log):
|
||||||
raise DRMError(os.path.basename(path))
|
raise DRMError(os.path.basename(path))
|
||||||
|
|
||||||
return os.path.join(os.getcwd(), opf)
|
opf = os.path.relpath(opf, os.getcwdu())
|
||||||
|
parts = os.path.split(opf)
|
||||||
|
if len(parts) > 1:
|
||||||
|
delta = '/'.join(parts[:-1])+'/'
|
||||||
|
opf = OPF(opf, os.path.dirname(os.path.abspath(opf)))
|
||||||
|
for elem in opf.itermanifest():
|
||||||
|
elem.set('href', delta+elem.get('href'))
|
||||||
|
for elem in opf.iterguide():
|
||||||
|
elem.set('href', delta+elem.get('href'))
|
||||||
|
|
||||||
|
with open('content.opf', 'wb') as nopf:
|
||||||
|
nopf.write(opf.render())
|
||||||
|
|
||||||
|
return os.path.abspath('content.opf')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user