diff --git a/cps/comic.py b/cps/comic.py old mode 100644 new mode 100755 index 91cb325d..0b7d4f1f --- a/cps/comic.py +++ b/cps/comic.py @@ -17,33 +17,52 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import zipfile -import tarfile import os import uploader +import logging +from iso639 import languages as isoLanguages -def extractCover(tmp_file_name, original_file_extension): - cover_data = None - if original_file_extension.upper() == '.CBZ': - cf = zipfile.ZipFile(tmp_file_name) - for name in cf.namelist(): - ext = os.path.splitext(name) - if len(ext) > 1: - extension = ext[1].lower() - if extension == '.jpg': - cover_data = cf.read(name) - break - elif original_file_extension.upper() == '.CBT': - cf = tarfile.TarFile(tmp_file_name) - for name in cf.getnames(): - ext = os.path.splitext(name) - if len(ext) > 1: - extension = ext[1].lower() - if extension == '.jpg': - cover_data = cf.extractfile(name).read() - break +logger = logging.getLogger("book_formats") + +try: + from comicapi.comicarchive import ComicArchive, MetaDataStyle + use_comic_meta = True +except ImportError as e: + logger.warning('cannot import comicapi, extracting comic metadata will not work: %s', e) + import zipfile + import tarfile + use_comic_meta = False + +def extractCover(tmp_file_name, original_file_extension): + if use_comic_meta: + archive = ComicArchive(tmp_file_name) + cover_data = None + ext = os.path.splitext(archive.getPageName(0)) + if len(ext) > 1: + extension = ext[1].lower() + if extension == '.jpg' or extension == '.jpeg': + cover_data = archive.getPage(0) + else: + if original_file_extension.upper() == '.CBZ': + cf = zipfile.ZipFile(tmp_file_name) + for name in cf.namelist(): + ext = os.path.splitext(name) + if len(ext) > 1: + extension = ext[1].lower() + if extension == '.jpg': + cover_data = cf.read(name) + break + elif original_file_extension.upper() == '.CBT': + cf = tarfile.TarFile(tmp_file_name) + for name in cf.getnames(): + ext = os.path.splitext(name) + if len(ext) > 1: + extension = ext[1].lower() + if extension == '.jpg': + cover_data = cf.extractfile(name).read() + break prefix = os.path.dirname(tmp_file_name) if cover_data: tmp_cover_name = prefix + '/cover' + extension @@ -56,15 +75,46 @@ def extractCover(tmp_file_name, original_file_extension): def get_comic_info(tmp_file_path, original_file_name, original_file_extension): + if use_comic_meta: + archive = ComicArchive(tmp_file_path) + if archive.seemsToBeAComicArchive(): + if archive.hasMetadata(MetaDataStyle.CIX): + style = MetaDataStyle.CIX + elif archive.hasMetadata(MetaDataStyle.CBI): + style = MetaDataStyle.CBI + else: + style = None + + if style is not None: + loadedMetadata = archive.readMetadata(style) - coverfile = extractCover(tmp_file_path, original_file_extension) + lang = loadedMetadata.language + if len(lang) == 2: + loadedMetadata.language = isoLanguages.get(part1=lang).name + elif len(lang) == 3: + loadedMetadata.language = isoLanguages.get(part3=lang).name + else: + loadedMetadata.language = "" + + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=loadedMetadata.title or original_file_name, + author=" & ".join([credit["person"] for credit in loadedMetadata.credits if credit["role"] == "Writer"]) or u"Unknown", + cover=extractCover(tmp_file_path, original_file_extension), + description=loadedMetadata.comments or "", + tags="", + series=loadedMetadata.series or "", + series_id=loadedMetadata.issue or "", + languages=loadedMetadata.language) + else: - return uploader.BookMeta( + return uploader.BookMeta( file_path=tmp_file_path, extension=original_file_extension, title=original_file_name, author=u"Unknown", - cover=coverfile, + cover=extractCover(tmp_file_path, original_file_extension), description="", tags="", series="", diff --git a/requirements.txt b/requirements.txt index 3fb23ea3..7f2776d7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,4 @@ SQLAlchemy>=1.1.0 tornado>=4.1 Wand>=0.4.4 unidecode>=0.04.19 +git+https://github.com/wildthyme/comicapi.git@cb279168f9c5cec742b5a05ac8326b9c168a8a91#egg=comicapi