mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add support for writing metadata to epub-meta
This commit is contained in:
parent
7eec1f5ba7
commit
d42c3031ae
@ -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__':
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user