|
|
@ -1,7 +1,7 @@
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
|
|
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
|
|
|
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
|
|
|
# Copyright (C) 2018 OzzieIsaacs
|
|
|
|
# Copyright (C) 2018-2022 OzzieIsaacs
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
@ -18,19 +18,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
from . import logger, isoLanguages
|
|
|
|
from . import logger, isoLanguages, cover
|
|
|
|
from .constants import BookMeta
|
|
|
|
from .constants import BookMeta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log = logger.create()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
from wand.image import Image
|
|
|
|
from wand.image import Image
|
|
|
|
use_IM = True
|
|
|
|
use_IM = True
|
|
|
|
except (ImportError, RuntimeError) as e:
|
|
|
|
except (ImportError, RuntimeError) as e:
|
|
|
|
use_IM = False
|
|
|
|
use_IM = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log = logger.create()
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
from comicapi.comicarchive import ComicArchive, MetaDataStyle
|
|
|
|
from comicapi.comicarchive import ComicArchive, MetaDataStyle
|
|
|
@ -51,29 +48,8 @@ except (ImportError, LookupError) as e:
|
|
|
|
use_rarfile = False
|
|
|
|
use_rarfile = False
|
|
|
|
use_comic_meta = False
|
|
|
|
use_comic_meta = False
|
|
|
|
|
|
|
|
|
|
|
|
NO_JPEG_EXTENSIONS = ['.png', '.webp', '.bmp']
|
|
|
|
|
|
|
|
COVER_EXTENSIONS = ['.png', '.webp', '.bmp', '.jpg', '.jpeg']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _cover_processing(tmp_file_name, img, extension):
|
|
|
|
|
|
|
|
tmp_cover_name = os.path.join(os.path.dirname(tmp_file_name), 'cover.jpg')
|
|
|
|
|
|
|
|
if extension in NO_JPEG_EXTENSIONS:
|
|
|
|
|
|
|
|
if use_IM:
|
|
|
|
|
|
|
|
with Image(blob=img) as imgc:
|
|
|
|
|
|
|
|
imgc.format = 'jpeg'
|
|
|
|
|
|
|
|
imgc.transform_colorspace('rgb')
|
|
|
|
|
|
|
|
imgc.save(filename=tmp_cover_name)
|
|
|
|
|
|
|
|
return tmp_cover_name
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
if img:
|
|
|
|
|
|
|
|
with open(tmp_cover_name, 'wb') as f:
|
|
|
|
|
|
|
|
f.write(img)
|
|
|
|
|
|
|
|
return tmp_cover_name
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecutable):
|
|
|
|
def _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_executable):
|
|
|
|
cover_data = extension = None
|
|
|
|
cover_data = extension = None
|
|
|
|
if original_file_extension.upper() == '.CBZ':
|
|
|
|
if original_file_extension.upper() == '.CBZ':
|
|
|
|
cf = zipfile.ZipFile(tmp_file_name)
|
|
|
|
cf = zipfile.ZipFile(tmp_file_name)
|
|
|
@ -81,7 +57,7 @@ def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecu
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
if len(ext) > 1:
|
|
|
|
if len(ext) > 1:
|
|
|
|
extension = ext[1].lower()
|
|
|
|
extension = ext[1].lower()
|
|
|
|
if extension in COVER_EXTENSIONS:
|
|
|
|
if extension in cover.COVER_EXTENSIONS:
|
|
|
|
cover_data = cf.read(name)
|
|
|
|
cover_data = cf.read(name)
|
|
|
|
break
|
|
|
|
break
|
|
|
|
elif original_file_extension.upper() == '.CBT':
|
|
|
|
elif original_file_extension.upper() == '.CBT':
|
|
|
@ -90,44 +66,44 @@ def _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecu
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
if len(ext) > 1:
|
|
|
|
if len(ext) > 1:
|
|
|
|
extension = ext[1].lower()
|
|
|
|
extension = ext[1].lower()
|
|
|
|
if extension in COVER_EXTENSIONS:
|
|
|
|
if extension in cover.COVER_EXTENSIONS:
|
|
|
|
cover_data = cf.extractfile(name).read()
|
|
|
|
cover_data = cf.extractfile(name).read()
|
|
|
|
break
|
|
|
|
break
|
|
|
|
elif original_file_extension.upper() == '.CBR' and use_rarfile:
|
|
|
|
elif original_file_extension.upper() == '.CBR' and use_rarfile:
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
rarfile.UNRAR_TOOL = rarExecutable
|
|
|
|
rarfile.UNRAR_TOOL = rar_executable
|
|
|
|
cf = rarfile.RarFile(tmp_file_name)
|
|
|
|
cf = rarfile.RarFile(tmp_file_name)
|
|
|
|
for name in cf.namelist():
|
|
|
|
for name in cf.namelist():
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
if len(ext) > 1:
|
|
|
|
if len(ext) > 1:
|
|
|
|
extension = ext[1].lower()
|
|
|
|
extension = ext[1].lower()
|
|
|
|
if extension in COVER_EXTENSIONS:
|
|
|
|
if extension in cover.COVER_EXTENSIONS:
|
|
|
|
cover_data = cf.read(name)
|
|
|
|
cover_data = cf.read(name)
|
|
|
|
break
|
|
|
|
break
|
|
|
|
except Exception as ex:
|
|
|
|
except Exception as ex:
|
|
|
|
log.debug('Rarfile failed with error: %s', ex)
|
|
|
|
log.debug('Rarfile failed with error: {}'.format(ex))
|
|
|
|
return cover_data, extension
|
|
|
|
return cover_data, extension
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _extractCover(tmp_file_name, original_file_extension, rarExecutable):
|
|
|
|
def _extract_cover(tmp_file_name, original_file_extension, rar_executable):
|
|
|
|
cover_data = extension = None
|
|
|
|
cover_data = extension = None
|
|
|
|
if use_comic_meta:
|
|
|
|
if use_comic_meta:
|
|
|
|
archive = ComicArchive(tmp_file_name, rar_exe_path=rarExecutable)
|
|
|
|
archive = ComicArchive(tmp_file_name, rar_exe_path=rar_executable)
|
|
|
|
for index, name in enumerate(archive.getPageNameList()):
|
|
|
|
for index, name in enumerate(archive.getPageNameList()):
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
ext = os.path.splitext(name)
|
|
|
|
if len(ext) > 1:
|
|
|
|
if len(ext) > 1:
|
|
|
|
extension = ext[1].lower()
|
|
|
|
extension = ext[1].lower()
|
|
|
|
if extension in COVER_EXTENSIONS:
|
|
|
|
if extension in cover.COVER_EXTENSIONS:
|
|
|
|
cover_data = archive.getPage(index)
|
|
|
|
cover_data = archive.getPage(index)
|
|
|
|
break
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
cover_data, extension = _extract_Cover_from_archive(original_file_extension, tmp_file_name, rarExecutable)
|
|
|
|
cover_data, extension = _extract_cover_from_archive(original_file_extension, tmp_file_name, rar_executable)
|
|
|
|
return _cover_processing(tmp_file_name, cover_data, extension)
|
|
|
|
return cover.cover_processing(tmp_file_name, cover_data, extension)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_comic_info(tmp_file_path, original_file_name, original_file_extension, rarExecutable):
|
|
|
|
def get_comic_info(tmp_file_path, original_file_name, original_file_extension, rar_executable):
|
|
|
|
if use_comic_meta:
|
|
|
|
if use_comic_meta:
|
|
|
|
archive = ComicArchive(tmp_file_path, rar_exe_path=rarExecutable)
|
|
|
|
archive = ComicArchive(tmp_file_path, rar_exe_path=rar_executable)
|
|
|
|
if archive.seemsToBeAComicArchive():
|
|
|
|
if archive.seemsToBeAComicArchive():
|
|
|
|
if archive.hasMetadata(MetaDataStyle.CIX):
|
|
|
|
if archive.hasMetadata(MetaDataStyle.CIX):
|
|
|
|
style = MetaDataStyle.CIX
|
|
|
|
style = MetaDataStyle.CIX
|
|
|
@ -137,23 +113,23 @@ def get_comic_info(tmp_file_path, original_file_name, original_file_extension, r
|
|
|
|
style = None
|
|
|
|
style = None
|
|
|
|
|
|
|
|
|
|
|
|
# if style is not None:
|
|
|
|
# if style is not None:
|
|
|
|
loadedMetadata = archive.readMetadata(style)
|
|
|
|
loaded_metadata = archive.readMetadata(style)
|
|
|
|
|
|
|
|
|
|
|
|
lang = loadedMetadata.language or ""
|
|
|
|
lang = loaded_metadata.language or ""
|
|
|
|
loadedMetadata.language = isoLanguages.get_lang3(lang)
|
|
|
|
loaded_metadata.language = isoLanguages.get_lang3(lang)
|
|
|
|
|
|
|
|
|
|
|
|
return BookMeta(
|
|
|
|
return BookMeta(
|
|
|
|
file_path=tmp_file_path,
|
|
|
|
file_path=tmp_file_path,
|
|
|
|
extension=original_file_extension,
|
|
|
|
extension=original_file_extension,
|
|
|
|
title=loadedMetadata.title or original_file_name,
|
|
|
|
title=loaded_metadata.title or original_file_name,
|
|
|
|
author=" & ".join([credit["person"]
|
|
|
|
author=" & ".join([credit["person"]
|
|
|
|
for credit in loadedMetadata.credits if credit["role"] == "Writer"]) or u'Unknown',
|
|
|
|
for credit in loaded_metadata.credits if credit["role"] == "Writer"]) or 'Unknown',
|
|
|
|
cover=_extractCover(tmp_file_path, original_file_extension, rarExecutable),
|
|
|
|
cover=_extract_cover(tmp_file_path, original_file_extension, rar_executable),
|
|
|
|
description=loadedMetadata.comments or "",
|
|
|
|
description=loaded_metadata.comments or "",
|
|
|
|
tags="",
|
|
|
|
tags="",
|
|
|
|
series=loadedMetadata.series or "",
|
|
|
|
series=loaded_metadata.series or "",
|
|
|
|
series_id=loadedMetadata.issue or "",
|
|
|
|
series_id=loaded_metadata.issue or "",
|
|
|
|
languages=loadedMetadata.language,
|
|
|
|
languages=loaded_metadata.language,
|
|
|
|
publisher="")
|
|
|
|
publisher="")
|
|
|
|
|
|
|
|
|
|
|
|
return BookMeta(
|
|
|
|
return BookMeta(
|
|
|
@ -161,7 +137,7 @@ def get_comic_info(tmp_file_path, original_file_name, original_file_extension, r
|
|
|
|
extension=original_file_extension,
|
|
|
|
extension=original_file_extension,
|
|
|
|
title=original_file_name,
|
|
|
|
title=original_file_name,
|
|
|
|
author=u'Unknown',
|
|
|
|
author=u'Unknown',
|
|
|
|
cover=_extractCover(tmp_file_path, original_file_extension, rarExecutable),
|
|
|
|
cover=_extract_cover(tmp_file_path, original_file_extension, rar_executable),
|
|
|
|
description="",
|
|
|
|
description="",
|
|
|
|
tags="",
|
|
|
|
tags="",
|
|
|
|
series="",
|
|
|
|
series="",
|
|
|
|