mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Support for reading metadata and adding .rb and .imp books to the ebook library (thanks to ashkulz)
This commit is contained in:
commit
ce3391ff9a
@ -16,6 +16,7 @@ class UnknownFormatError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm',
|
BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm',
|
||||||
'html', 'xhtml', 'epub', 'pdf', 'prc', 'mobi', 'azw',
|
'html', 'xhtml', 'epub', 'pdf', 'prc', 'mobi', 'azw',
|
||||||
'epub', 'fb2', 'djvu', 'lrx', 'cbr', 'cbz', 'oebzip']
|
'epub', 'fb2', 'djvu', 'lrx', 'cbr', 'cbz', 'oebzip',
|
||||||
|
'rb', 'imp']
|
||||||
|
62
src/calibre/ebooks/metadata/imp.py
Normal file
62
src/calibre/ebooks/metadata/imp.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2008, Ashish Kulkarni <kulkarni.ashish@gmail.com>'
|
||||||
|
'''Read meta information from IMP files'''
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
|
|
||||||
|
MAGIC = ['\x00\x01BOOKDOUG', '\x00\x02BOOKDOUG']
|
||||||
|
|
||||||
|
def get_metadata(stream):
|
||||||
|
""" Return metadata as a L{MetaInfo} object """
|
||||||
|
title = 'Unknown'
|
||||||
|
mi = MetaInformation(title, ['Unknown'])
|
||||||
|
stream.seek(0)
|
||||||
|
try:
|
||||||
|
if stream.read(10) not in MAGIC:
|
||||||
|
print >>sys.stderr, u'Couldn\'t read IMP header from file'
|
||||||
|
return mi
|
||||||
|
|
||||||
|
def cString(skip=0):
|
||||||
|
result = ''
|
||||||
|
while 1:
|
||||||
|
data = stream.read(1)
|
||||||
|
if data == '\x00':
|
||||||
|
if not skip: return result
|
||||||
|
skip -= 1
|
||||||
|
result, data = '', ''
|
||||||
|
result += data
|
||||||
|
|
||||||
|
stream.read(38) # skip past some uninteresting headers
|
||||||
|
_, category, title, author = cString(), cString(), cString(1), cString(2)
|
||||||
|
|
||||||
|
if title:
|
||||||
|
mi.title = title
|
||||||
|
if author:
|
||||||
|
src = author.split('&')
|
||||||
|
authors = []
|
||||||
|
for au in src:
|
||||||
|
authors += au.split(',')
|
||||||
|
mi.authors = authors
|
||||||
|
mi.author = author
|
||||||
|
if category:
|
||||||
|
mi.category = category
|
||||||
|
except Exception, err:
|
||||||
|
msg = u'Couldn\'t read metadata from imp: %s with error %s'%(mi.title, unicode(err))
|
||||||
|
print >>sys.stderr, msg.encode('utf8')
|
||||||
|
return mi
|
||||||
|
|
||||||
|
|
||||||
|
def main(args=sys.argv):
|
||||||
|
if len(args) != 2:
|
||||||
|
print >>sys.stderr, _('Usage: imp-meta file.imp')
|
||||||
|
print >>sys.stderr, _('No filename specified.')
|
||||||
|
return 1
|
||||||
|
|
||||||
|
path = os.path.abspath(os.path.expanduser(args[1]))
|
||||||
|
print get_metadata(open(path, 'rb'))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
@ -9,6 +9,8 @@ from calibre.ebooks.metadata.fb2 import get_metadata as fb2_metadata
|
|||||||
from calibre.ebooks.lrf.meta import get_metadata as lrf_metadata
|
from calibre.ebooks.lrf.meta import get_metadata as lrf_metadata
|
||||||
from calibre.ebooks.metadata.pdf import get_metadata as pdf_metadata
|
from calibre.ebooks.metadata.pdf import get_metadata as pdf_metadata
|
||||||
from calibre.ebooks.metadata.lit import get_metadata as lit_metadata
|
from calibre.ebooks.metadata.lit import get_metadata as lit_metadata
|
||||||
|
from calibre.ebooks.metadata.imp import get_metadata as imp_metadata
|
||||||
|
from calibre.ebooks.metadata.rb import get_metadata as rb_metadata
|
||||||
from calibre.ebooks.metadata.epub import get_metadata as epub_metadata
|
from calibre.ebooks.metadata.epub import get_metadata as epub_metadata
|
||||||
from calibre.ebooks.metadata.html import get_metadata as html_metadata
|
from calibre.ebooks.metadata.html import get_metadata as html_metadata
|
||||||
from calibre.ebooks.mobi.reader import get_metadata as mobi_metadata
|
from calibre.ebooks.mobi.reader import get_metadata as mobi_metadata
|
||||||
@ -22,7 +24,7 @@ from calibre.ebooks.metadata import MetaInformation
|
|||||||
_METADATA_PRIORITIES = [
|
_METADATA_PRIORITIES = [
|
||||||
'html', 'htm', 'xhtml', 'xhtm',
|
'html', 'htm', 'xhtml', 'xhtm',
|
||||||
'rtf', 'fb2', 'pdf', 'prc',
|
'rtf', 'fb2', 'pdf', 'prc',
|
||||||
'epub', 'lit', 'lrf', 'mobi',
|
'epub', 'lit', 'lrf', 'mobi', 'rb', 'imp'
|
||||||
]
|
]
|
||||||
|
|
||||||
# The priorities for loading metadata from different file types
|
# The priorities for loading metadata from different file types
|
||||||
|
68
src/calibre/ebooks/metadata/rb.py
Normal file
68
src/calibre/ebooks/metadata/rb.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2008, Ashish Kulkarni <kulkarni.ashish@gmail.com>'
|
||||||
|
'''Read meta information from RB files'''
|
||||||
|
|
||||||
|
import sys, os, struct
|
||||||
|
|
||||||
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
|
|
||||||
|
MAGIC = '\xb0\x0c\xb0\x0c\x02\x00NUVO\x00\x00\x00\x00'
|
||||||
|
|
||||||
|
def get_metadata(stream):
|
||||||
|
""" Return metadata as a L{MetaInfo} object """
|
||||||
|
title = 'Unknown'
|
||||||
|
mi = MetaInformation(title, ['Unknown'])
|
||||||
|
stream.seek(0)
|
||||||
|
try:
|
||||||
|
if not stream.read(14) == MAGIC:
|
||||||
|
print >>sys.stderr, u'Couldn\'t read RB header from file'
|
||||||
|
return mi
|
||||||
|
stream.read(10)
|
||||||
|
|
||||||
|
read_i32 = lambda: struct.unpack('<I', stream.read(4))[0]
|
||||||
|
|
||||||
|
stream.seek(read_i32())
|
||||||
|
toc_count = read_i32()
|
||||||
|
|
||||||
|
for i in range(toc_count):
|
||||||
|
stream.read(32)
|
||||||
|
length, offset, flag = read_i32(), read_i32(), read_i32()
|
||||||
|
if flag == 2: break
|
||||||
|
else:
|
||||||
|
print >>sys.stderr, u'Couldn\'t find INFO from RB file'
|
||||||
|
return mi
|
||||||
|
|
||||||
|
stream.seek(offset)
|
||||||
|
info = stream.read(length).splitlines()
|
||||||
|
for line in info:
|
||||||
|
if not '=' in line:
|
||||||
|
continue
|
||||||
|
key, value = line.split('=')
|
||||||
|
if key.strip() == 'TITLE':
|
||||||
|
mi.title = value.strip()
|
||||||
|
elif key.strip() == 'AUTHOR':
|
||||||
|
src = value.split('&')
|
||||||
|
authors = []
|
||||||
|
for au in src:
|
||||||
|
authors += au.split(',')
|
||||||
|
mi.authors = authors
|
||||||
|
mi.author = value
|
||||||
|
except Exception, err:
|
||||||
|
msg = u'Couldn\'t read metadata from rb: %s with error %s'%(mi.title, unicode(err))
|
||||||
|
print >>sys.stderr, msg.encode('utf8')
|
||||||
|
raise
|
||||||
|
return mi
|
||||||
|
|
||||||
|
|
||||||
|
def main(args=sys.argv):
|
||||||
|
if len(args) != 2:
|
||||||
|
print >>sys.stderr, _('Usage: rb-meta file.rb')
|
||||||
|
print >>sys.stderr, _('No filename specified.')
|
||||||
|
return 1
|
||||||
|
|
||||||
|
path = os.path.abspath(os.path.expanduser(args[1]))
|
||||||
|
print get_metadata(open(path, 'rb'))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
@ -21,6 +21,8 @@ entry_points = {
|
|||||||
'rtf-meta = calibre.ebooks.metadata.rtf:main',
|
'rtf-meta = calibre.ebooks.metadata.rtf:main',
|
||||||
'pdf-meta = calibre.ebooks.metadata.pdf:main',
|
'pdf-meta = calibre.ebooks.metadata.pdf:main',
|
||||||
'lit-meta = calibre.ebooks.metadata.lit:main',
|
'lit-meta = calibre.ebooks.metadata.lit:main',
|
||||||
|
'imp-meta = calibre.ebooks.metadata.imp:main',
|
||||||
|
'rb-meta = calibre.ebooks.metadata.rb:main',
|
||||||
'opf-meta = calibre.ebooks.metadata.opf:main',
|
'opf-meta = calibre.ebooks.metadata.opf:main',
|
||||||
'epub-meta = calibre.ebooks.metadata.epub:main',
|
'epub-meta = calibre.ebooks.metadata.epub:main',
|
||||||
'txt2lrf = calibre.ebooks.lrf.txt.convert_from:main',
|
'txt2lrf = calibre.ebooks.lrf.txt.convert_from:main',
|
||||||
@ -197,6 +199,8 @@ def setup_completion(fatal_errors):
|
|||||||
f.write(opts_and_exts('rtf-meta', metaop, ['rtf']))
|
f.write(opts_and_exts('rtf-meta', metaop, ['rtf']))
|
||||||
f.write(opts_and_exts('pdf-meta', metaop, ['pdf']))
|
f.write(opts_and_exts('pdf-meta', metaop, ['pdf']))
|
||||||
f.write(opts_and_exts('lit-meta', metaop, ['lit']))
|
f.write(opts_and_exts('lit-meta', metaop, ['lit']))
|
||||||
|
f.write(opts_and_exts('imp-meta', metaop, ['imp']))
|
||||||
|
f.write(opts_and_exts('rb-meta', metaop, ['rb']))
|
||||||
f.write(opts_and_exts('opf-meta', metaop, ['opf']))
|
f.write(opts_and_exts('opf-meta', metaop, ['opf']))
|
||||||
f.write(opts_and_exts('epub-meta', epub_meta, ['epub']))
|
f.write(opts_and_exts('epub-meta', epub_meta, ['epub']))
|
||||||
f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf']))
|
f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf']))
|
||||||
@ -377,7 +381,8 @@ def install_man_pages(fatal_errors):
|
|||||||
prog = src[:src.index('=')].strip()
|
prog = src[:src.index('=')].strip()
|
||||||
if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta',
|
if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta',
|
||||||
'markdown-calibre', 'calibre-debug', 'fb2-meta',
|
'markdown-calibre', 'calibre-debug', 'fb2-meta',
|
||||||
'calibre-fontconfig', 'calibre-parallel'):
|
'calibre-fontconfig', 'calibre-parallel',
|
||||||
|
'rb-meta', 'imp-meta'):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
help2man = ('help2man', prog, '--name', 'part of %s'%__appname__,
|
help2man = ('help2man', prog, '--name', 'part of %s'%__appname__,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user