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.series_index = None
|
||||||
self.rating = None
|
self.rating = None
|
||||||
self.isbn = None
|
self.isbn = None
|
||||||
self.tags = []
|
self.tags = []
|
||||||
|
self.cover_data = (None, None) #(extension, data)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
ans = u''
|
ans = u''
|
||||||
|
@ -100,9 +100,12 @@ class DirectoryEntry(object):
|
|||||||
self.offset = offset
|
self.offset = offset
|
||||||
self.size = size
|
self.size = size
|
||||||
|
|
||||||
def __str__(self):
|
def __repr__(self):
|
||||||
return '%s\n\tSection: %d\n\tOffset: %d\n\tSize: %d'%(self.name,
|
return '%s\n\tSection: %d\n\tOffset: %d\n\tSize: %d\n'%(self.name,
|
||||||
self.section, self.offset, self.size)
|
self.section, self.offset, self.size)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return repr(self)
|
||||||
|
|
||||||
class LitReadError(Exception):
|
class LitReadError(Exception):
|
||||||
pass
|
pass
|
||||||
@ -693,7 +696,7 @@ class LitFile(object):
|
|||||||
self.manifest.append(ManifestItem(original, internal, mime_type, offset, root, state))
|
self.manifest.append(ManifestItem(original, internal, mime_type, offset, root, state))
|
||||||
i += 1
|
i += 1
|
||||||
finally:
|
finally:
|
||||||
self._stream.seek(opos)
|
self._stream.seek(opos)
|
||||||
|
|
||||||
def read_meta(self, entry):
|
def read_meta(self, entry):
|
||||||
opos = self._stream.tell()
|
opos = self._stream.tell()
|
||||||
@ -711,12 +714,39 @@ class LitFile(object):
|
|||||||
self.meta = xml
|
self.meta = xml
|
||||||
finally:
|
finally:
|
||||||
self._stream.seek(opos)
|
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):
|
def get_metadata(stream):
|
||||||
try:
|
try:
|
||||||
litfile = LitFile(stream)
|
litfile = LitFile(stream)
|
||||||
src = litfile.meta.encode('utf-8')
|
src = litfile.meta.encode('utf-8')
|
||||||
mi = OPFReader(cStringIO.StringIO(src))
|
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:
|
except:
|
||||||
title = stream.name if hasattr(stream, 'name') and stream.name else 'Unknown'
|
title = stream.name if hasattr(stream, 'name') and stream.name else 'Unknown'
|
||||||
mi = MetaInformation(title, ['Unknown'])
|
mi = MetaInformation(title, ['Unknown'])
|
||||||
@ -730,6 +760,10 @@ def main(args=sys.argv):
|
|||||||
return 1
|
return 1
|
||||||
mi = get_metadata(open(args[1], 'rb'))
|
mi = get_metadata(open(args[1], 'rb'))
|
||||||
print unicode(mi)
|
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
|
return 0
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -353,7 +353,7 @@ class OPF(MetaInformation):
|
|||||||
type = reference.get('type')
|
type = reference.get('type')
|
||||||
if not type:
|
if not type:
|
||||||
continue
|
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 reference.get('href')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -1135,6 +1135,8 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE;
|
|||||||
self.set_rating(id, mi.rating)
|
self.set_rating(id, mi.rating)
|
||||||
if mi.series:
|
if mi.series:
|
||||||
self.set_series(id, 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 = open(path, 'rb')
|
||||||
stream.seek(0, 2)
|
stream.seek(0, 2)
|
||||||
usize = stream.tell()
|
usize = stream.tell()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user