Add support for writing metadata to epub-meta

This commit is contained in:
Kovid Goyal 2008-07-28 15:03:28 -07:00
parent 7eec1f5ba7
commit d42c3031ae
4 changed files with 747 additions and 228 deletions

View File

@ -7,13 +7,13 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import sys, os
from zipfile import ZipFile, BadZipfile
from calibre.utils.zipfile import ZipFile, BadZipfile
from cStringIO import StringIO
from contextlib import closing
from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
from calibre.ebooks.metadata.opf import OPF, OPFReader
from calibre.ebooks.metadata.opf import OPF, OPFReader, OPFCreator
from calibre.ebooks.metadata import get_parser, MetaInformation
class EPubException(Exception):
pass
@ -71,9 +71,9 @@ class OCFReader(OCF):
raise EPubException("missing OPF package file")
class OCFZipReader(OCFReader):
def __init__(self, stream):
def __init__(self, stream, mode='r'):
try:
self.archive = ZipFile(stream, 'r')
self.archive = ZipFile(stream, mode)
except BadZipfile:
raise EPubException("not a ZIP .epub OCF container")
self.root = getattr(stream, 'name', os.getcwd())
@ -81,6 +81,19 @@ class OCFZipReader(OCFReader):
def open(self, name, mode='r'):
return StringIO(self.archive.read(name))
class OCFZipWriter(OCFZipReader):
def __init__(self, stream):
OCFZipReader.__init__(self, stream, mode='a')
def set_metadata(self, mi):
name = self.container[OPF.MIMETYPE]
stream = StringIO()
opf = OPFCreator(self.root, mi)
opf.render(stream)
self.archive.delete(name)
self.archive.writestr(name, stream.getvalue())
class OCFDirReader(OCFReader):
def __init__(self, path):
@ -95,13 +108,35 @@ def get_metadata(stream):
""" Return metadata as a L{MetaInfo} object """
return OCFZipReader(stream).opf
def set_metadata(stream, mi):
OCFZipWriter(stream).set_metadata(mi)
def option_parser():
parser = get_parser('epub')
parser.remove_option('--category')
parser.add_option('--tags', default=None, help=_('A comma separated list of tags to set'))
return parser
def main(args=sys.argv):
if len(args) != 2 or '--help' in args or '-h' in args:
print >>sys.stderr, _('Usage:'), args[0], _('mybook.epub')
parser = option_parser()
opts, args = parser.parse_args(args)
if len(args) != 2:
parser.print_help()
return 1
path = os.path.abspath(os.path.expanduser(args[1]))
print unicode(get_metadata(open(path, 'rb')))
stream = open(args[1], 'r+b')
mi = MetaInformation(OCFZipReader(stream).opf)
if opts.title:
mi.title = opts.title
if opts.authors:
mi.authors = opts.authors.split(',')
if opts.tags:
mi.tags = opts.tags.split(',')
if opts.comment:
mi.comments = opts.comment
set_metadata(stream, mi)
print unicode(mi)
return 0
if __name__ == '__main__':

View File

@ -14,6 +14,7 @@ from calibre.ebooks.mobi.reader import get_metadata as mobi_metadata
from calibre.ebooks.metadata.opf import OPFReader
from calibre.ebooks.metadata.rtf import set_metadata as set_rtf_metadata
from calibre.ebooks.lrf.meta import set_metadata as set_lrf_metadata
from calibre.ebooks.metadata.epub import set_metadata as set_epub_metadata
from calibre.ebooks.metadata import MetaInformation
@ -88,6 +89,8 @@ def set_metadata(stream, mi, stream_type='lrf'):
if stream_type: stream_type = stream_type.lower()
if stream_type == 'lrf':
set_lrf_metadata(stream, mi)
elif stream_type == 'epub':
set_epub_metadata(stream, mi)
elif stream_type == 'rtf':
set_rtf_metadata(stream, mi)

View File

@ -165,6 +165,7 @@ def setup_completion(fatal_errors):
from calibre.web.feeds.main import option_parser as feeds2disk
from calibre.web.feeds.recipes import titles as feed_titles
from calibre.ebooks.lrf.feeds.convert_from import option_parser as feeds2lrf
from calibre.ebooks.metadata.epub import option_parser as epub_meta
f = open_file('/etc/bash_completion.d/libprs500')
f.close()
@ -192,7 +193,7 @@ def setup_completion(fatal_errors):
f.write(opts_and_exts('pdf-meta', metaop, ['pdf']))
f.write(opts_and_exts('lit-meta', metaop, ['lit']))
f.write(opts_and_exts('opf-meta', metaop, ['opf']))
f.write(opts_and_exts('epub-meta', metaop, ['epub']))
f.write(opts_and_exts('epub-meta', epub_meta, ['epub']))
f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf']))
f.write(opts_and_exts('pdfrelow', pdfhtmlop, ['pdf']))
f.write(opts_and_exts('mobi2oeb', mobioeb, ['mobi', 'prc']))

File diff suppressed because it is too large Load Diff