From adcc8604749abde44c5cd509b1b4d2f3a1515aa1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 26 Nov 2012 16:11:24 +0530 Subject: [PATCH] Comic metadata: Support reading metadata from cbr files. Also read the comments and published date info from the metadata. Fixes #1082340 (Metadata in cbz and cbr files) --- src/calibre/customize/builtins.py | 6 ++-- src/calibre/ebooks/metadata/archive.py | 43 ++++++++++++++++++++------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 86172067bf..4eab9108cf 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -8,7 +8,7 @@ from calibre import guess_type from calibre.customize import (FileTypePlugin, MetadataReaderPlugin, MetadataWriterPlugin, PreferencesPlugin, InterfaceActionBase, StoreBase) from calibre.constants import numeric_version -from calibre.ebooks.metadata.archive import ArchiveExtract, get_cbz_metadata +from calibre.ebooks.metadata.archive import ArchiveExtract, get_comic_metadata from calibre.ebooks.html.to_zip import HTML2ZIP plugins = [] @@ -150,9 +150,9 @@ class ComicMetadataReader(MetadataReaderPlugin): ret = extract_first(stream) mi = MetaInformation(None, None) stream.seek(0) - if ftype == 'cbz': + if ftype in {'cbr', 'cbz'}: try: - mi.smart_update(get_cbz_metadata(stream)) + mi.smart_update(get_comic_metadata(stream, ftype)) except: pass if ret is not None: diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py index 82ba934945..531a725c4b 100644 --- a/src/calibre/ebooks/metadata/archive.py +++ b/src/calibre/ebooks/metadata/archive.py @@ -110,21 +110,44 @@ def get_comic_book_info(d, mi): authors.append(x) if authors: mi.authors = authors + comments = d.get('comments', '') + if comments and comments.strip(): + mi.comments = comments.strip() + pubm, puby = d.get('publicationMonth', None), d.get('publicationYear', None) + if puby is not None: + from calibre.utils.date import parse_only_date + from datetime import date + try: + dt = date(puby, 6 if pubm is None else pubm, 15) + dt = parse_only_date(str(dt)) + mi.pubdate = dt + except: + pass - - -def get_cbz_metadata(stream): +def get_comic_metadata(stream, stream_type): # See http://code.google.com/p/comicbookinfo/wiki/Example - from calibre.utils.zipfile import ZipFile from calibre.ebooks.metadata import MetaInformation - import json - zf = ZipFile(stream) + comment = None + mi = MetaInformation(None, None) - if zf.comment: - m = json.loads(zf.comment) - if hasattr(m, 'keys'): - for cat in m.keys(): + + if stream_type == 'cbz': + from calibre.utils.zipfile import ZipFile + zf = ZipFile(stream) + comment = zf.comment + elif stream_type == 'cbr': + from calibre.utils.unrar import RARFile + f = RARFile(stream, get_comment=True) + comment = f.comment + + if comment: + import json + m = json.loads(comment) + if hasattr(m, 'iterkeys'): + for cat in m.iterkeys(): if cat.startswith('ComicBookInfo'): get_comic_book_info(m[cat], mi) + break return mi +