From 0c168b03060d0ebf03a5c652fa6407c2e7774059 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 29 Apr 2010 16:37:20 -0600 Subject: [PATCH] Fix #5402 (CBZ meta data not imported) --- src/calibre/customize/builtins.py | 8 ++++- src/calibre/ebooks/metadata/archive.py | 42 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 95d5f2c31a..a3eb4272ba 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -7,7 +7,7 @@ import os import glob from calibre.customize import FileTypePlugin, MetadataReaderPlugin, MetadataWriterPlugin from calibre.constants import numeric_version -from calibre.ebooks.metadata.archive import ArchiveExtract +from calibre.ebooks.metadata.archive import ArchiveExtract, get_cbz_metadata class HTML2ZIP(FileTypePlugin): name = 'HTML to ZIP' @@ -97,6 +97,12 @@ class ComicMetadataReader(MetadataReaderPlugin): from calibre.ebooks.metadata import MetaInformation ret = extract_first(stream) mi = MetaInformation(None, None) + stream.seek(0) + if ftype == 'cbz': + try: + mi.smart_update(get_cbz_metadata(stream)) + except: + pass if ret is not None: path, data = ret ext = os.path.splitext(path)[1][1:] diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py index 0af41c274f..45d549b6ea 100644 --- a/src/calibre/ebooks/metadata/archive.py +++ b/src/calibre/ebooks/metadata/archive.py @@ -64,3 +64,45 @@ class ArchiveExtract(FileTypePlugin): of.write(zf.read(fname)) return of.name +def get_comic_book_info(d, mi): + series = d.get('series', '') + if series.strip(): + mi.series = series + if d.get('volume', -1) > -1: + mi.series_index = float(d['volume']) + if d.get('rating', -1) > -1: + mi.rating = d['rating'] + for x in ('title', 'publisher'): + y = d.get(x, '').strip() + if y: + setattr(mi, x, y) + tags = d.get('tags', []) + if tags: + mi.tags = tags + authors = [] + for credit in d.get('credits', []): + if credit.get('role', '') in ('Writer', 'Artist', 'Cartoonist', + 'Creator'): + x = credit.get('person', '') + if x: + x = ' '.join((reversed(x.split(', ')))) + authors.append(x) + if authors: + mi.authors = authors + + + +def get_cbz_metadata(stream): + from calibre.utils.zipfile import ZipFile + from calibre.ebooks.metadata import MetaInformation + import json + + zf = ZipFile(stream) + mi = MetaInformation(None, None) + if zf.comment: + m = json.loads(zf.comment) + if hasattr(m, 'keys'): + for cat in m.keys(): + if cat.startswith('ComicBookInfo'): + get_comic_book_info(m[cat], mi) + return mi