mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Read cover from lit files when adding to GUI.
This commit is contained in:
parent
9c75ead5d1
commit
3d933bab62
@ -59,7 +59,8 @@ class MetaInformation(object):
|
||||
self.series_index = None
|
||||
self.rating = None
|
||||
self.isbn = None
|
||||
self.tags = []
|
||||
self.tags = []
|
||||
self.cover_data = (None, None) #(extension, data)
|
||||
|
||||
def __str__(self):
|
||||
ans = u''
|
||||
|
@ -100,9 +100,12 @@ class DirectoryEntry(object):
|
||||
self.offset = offset
|
||||
self.size = size
|
||||
|
||||
def __str__(self):
|
||||
return '%s\n\tSection: %d\n\tOffset: %d\n\tSize: %d'%(self.name,
|
||||
def __repr__(self):
|
||||
return '%s\n\tSection: %d\n\tOffset: %d\n\tSize: %d\n'%(self.name,
|
||||
self.section, self.offset, self.size)
|
||||
|
||||
def __str__(self):
|
||||
return repr(self)
|
||||
|
||||
class LitReadError(Exception):
|
||||
pass
|
||||
@ -693,7 +696,7 @@ class LitFile(object):
|
||||
self.manifest.append(ManifestItem(original, internal, mime_type, offset, root, state))
|
||||
i += 1
|
||||
finally:
|
||||
self._stream.seek(opos)
|
||||
self._stream.seek(opos)
|
||||
|
||||
def read_meta(self, entry):
|
||||
opos = self._stream.tell()
|
||||
@ -711,12 +714,39 @@ class LitFile(object):
|
||||
self.meta = xml
|
||||
finally:
|
||||
self._stream.seek(opos)
|
||||
|
||||
def read_cover(self, internal_name):
|
||||
cover_entry = None
|
||||
for entry in self.entries:
|
||||
if internal_name in entry.name:
|
||||
cover_entry = entry
|
||||
break
|
||||
opos = self._stream.tell()
|
||||
try:
|
||||
self._stream.seek(self.content_offset + cover_entry.offset)
|
||||
return self._stream.read(cover_entry.size)
|
||||
finally:
|
||||
self._stream.seek(opos)
|
||||
|
||||
def get_metadata(stream):
|
||||
try:
|
||||
litfile = LitFile(stream)
|
||||
src = litfile.meta.encode('utf-8')
|
||||
mi = OPFReader(cStringIO.StringIO(src))
|
||||
cover_url, cover_item = mi.cover, None
|
||||
if cover_url:
|
||||
for item in litfile.manifest:
|
||||
if item.path == cover_url:
|
||||
cover_item = item.internal
|
||||
if cover_item is not None:
|
||||
ext = cover_url.rpartition('.')[-1]
|
||||
if not ext:
|
||||
ext = 'jpg'
|
||||
else:
|
||||
ext = ext.lower()
|
||||
cd = litfile.read_cover(cover_item)
|
||||
if cd:
|
||||
mi.cover_data = (ext, cd)
|
||||
except:
|
||||
title = stream.name if hasattr(stream, 'name') and stream.name else 'Unknown'
|
||||
mi = MetaInformation(title, ['Unknown'])
|
||||
@ -730,6 +760,10 @@ def main(args=sys.argv):
|
||||
return 1
|
||||
mi = get_metadata(open(args[1], 'rb'))
|
||||
print unicode(mi)
|
||||
if mi.cover_data[1]:
|
||||
cover = os.path.abspath(os.path.splitext(os.path.basename(args[1]))[0] + '.' + mi.cover_data[0])
|
||||
open(cover, 'wb').write(mi.cover_data[1])
|
||||
print 'Cover saved to', cover
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -353,7 +353,7 @@ class OPF(MetaInformation):
|
||||
type = reference.get('type')
|
||||
if not type:
|
||||
continue
|
||||
if type.lower() in ['cover', 'other.ms-coverimage-standard']:
|
||||
if type.lower() in ['cover', 'other.ms-coverimage-standard', "other.ms-coverimage"]:
|
||||
return reference.get('href')
|
||||
return None
|
||||
|
||||
|
@ -1135,6 +1135,8 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE;
|
||||
self.set_rating(id, mi.rating)
|
||||
if mi.series:
|
||||
self.set_series(id, mi.series)
|
||||
if mi.cover_data[1] is not None:
|
||||
self.set_cover(id, mi.cover_data[1])
|
||||
stream = open(path, 'rb')
|
||||
stream.seek(0, 2)
|
||||
usize = stream.tell()
|
||||
|
Loading…
x
Reference in New Issue
Block a user