186 lines
6.3 KiB
Python
186 lines
6.3 KiB
Python
from __future__ import (unicode_literals, division, absolute_import,
|
|
print_function)
|
|
|
|
__license__ = 'GPL v3'
|
|
__copyright__ = '2015, dloraine'
|
|
__docformat__ = 'restructuredtext en'
|
|
|
|
from functools import partial
|
|
from calibre.gui2 import error_dialog, info_dialog
|
|
|
|
from calibre_plugins.EmbedComicMetadata.config import prefs
|
|
from calibre_plugins.EmbedComicMetadata.languages.lang import _L
|
|
from calibre_plugins.EmbedComicMetadata.comicmetadata import ComicMetadata
|
|
|
|
import sys
|
|
|
|
python3 = sys.version_info[0] > 2
|
|
|
|
def import_to_calibre(ia, action):
|
|
def _import_to_calibre(metadata):
|
|
metadata.get_comic_metadata_from_file()
|
|
if action == "both" and metadata.comic_metadata:
|
|
metadata.import_comic_metadata_to_calibre(metadata.comic_metadata)
|
|
elif action == "cix" and metadata.cix_metadata:
|
|
metadata.import_comic_metadata_to_calibre(metadata.cix_metadata)
|
|
elif action == "cbi" and metadata.cbi_metadata:
|
|
metadata.import_comic_metadata_to_calibre(metadata.cbi_metadata)
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
iterate_over_books(ia, _import_to_calibre,
|
|
_L["Updated Calibre Metadata"],
|
|
_L['Updated calibre metadata for {} book(s)'],
|
|
_L['The following books had no metadata: {}'],
|
|
prefs['convert_reading'])
|
|
|
|
|
|
def embed_into_comic(ia, action):
|
|
def _embed_into_comic(metadata):
|
|
if metadata.format != "cbz":
|
|
return False
|
|
metadata.overlay_metadata()
|
|
if action == "both" or action == "cix":
|
|
metadata.embed_cix_metadata()
|
|
if action == "both" or action == "cbi":
|
|
metadata.embed_cbi_metadata()
|
|
metadata.add_updated_comic_to_calibre()
|
|
return True
|
|
|
|
iterate_over_books(ia, _embed_into_comic,
|
|
_L["Updated comics"],
|
|
_L['Updated the metadata in the files of {} comics'],
|
|
_L['The following books were not updated: {}'])
|
|
|
|
|
|
def convert(ia):
|
|
iterate_over_books(ia, partial(convert_to_cbz, ia),
|
|
_L["Converted files"],
|
|
_L['Converted {} book(s) to cbz'],
|
|
_L['The following books were not converted: {}'],
|
|
False)
|
|
|
|
|
|
def embed_cover(ia):
|
|
def _embed_cover(metadata):
|
|
if metadata.format != "cbz":
|
|
return False
|
|
metadata.update_cover()
|
|
metadata.add_updated_comic_to_calibre()
|
|
return True
|
|
|
|
iterate_over_books(ia, _embed_cover,
|
|
_L["Updated Covers"],
|
|
_L['Embeded {} covers'],
|
|
_L['The following covers were not embeded: {}'])
|
|
|
|
|
|
def count_pages(ia):
|
|
def _count_pages(metadata):
|
|
if metadata.format != "cbz":
|
|
return False
|
|
return metadata.action_count_pages()
|
|
|
|
iterate_over_books(ia, _count_pages,
|
|
_L["Counted pages"],
|
|
_L['Counted pages in {} comics'],
|
|
_L['The following comics were not counted: {}'])
|
|
|
|
|
|
def remove_metadata(ia):
|
|
def _remove_metadata(metadata):
|
|
if metadata.format != "cbz":
|
|
return False
|
|
metadata.remove_embedded_metadata()
|
|
metadata.add_updated_comic_to_calibre()
|
|
return True
|
|
|
|
iterate_over_books(ia, _remove_metadata,
|
|
_L["Removed metadata"],
|
|
_L['Removed metadata in {} comics'],
|
|
_L['The following comics did not have metadata removed: {}'])
|
|
|
|
|
|
def get_image_size(ia):
|
|
def _get_image_size(metadata):
|
|
if metadata.format != "cbz":
|
|
return False
|
|
return metadata.action_picture_size()
|
|
|
|
iterate_over_books(ia, _get_image_size,
|
|
_L["Updated Calibre Metadata"],
|
|
_L['Updated calibre metadata for {} book(s)'],
|
|
_L['The following books were not updated: {}'])
|
|
|
|
|
|
def iterate_over_books(ia, func, title, ptext, notptext,
|
|
should_convert=None,
|
|
convtext=_L["The following comics were converted to cbz: {}"]):
|
|
'''
|
|
Iterates over all selected books. For each book, it checks if it should be
|
|
converted to cbz and then applies func to the book.
|
|
After all books are processed, gives a completion message.
|
|
'''
|
|
processed = []
|
|
not_processed = []
|
|
converted = []
|
|
|
|
if should_convert is None:
|
|
should_convert = prefs["convert_cbr"]
|
|
|
|
# iterate through the books
|
|
for book_id in get_selected_books(ia):
|
|
metadata = ComicMetadata(book_id, ia)
|
|
|
|
# sanity check
|
|
if metadata.format is None:
|
|
not_processed.append(metadata.info)
|
|
continue
|
|
|
|
if should_convert and convert_to_cbz(ia, metadata):
|
|
converted.append(metadata.info)
|
|
|
|
if func(metadata):
|
|
processed.append(metadata.info)
|
|
else:
|
|
not_processed.append(metadata.info)
|
|
|
|
# show a completion message
|
|
msg = ptext.format(len(processed))
|
|
if should_convert and len(converted) > 0:
|
|
msg += '\n' + convtext.format(lst2string(converted))
|
|
if len(not_processed) > 0:
|
|
msg += '\n' + notptext.format(lst2string(not_processed))
|
|
info_dialog(ia.gui, title, msg, show=True)
|
|
|
|
|
|
def get_selected_books(ia):
|
|
# Get currently selected books
|
|
rows = ia.gui.library_view.selectionModel().selectedRows()
|
|
if not rows or len(rows) == 0:
|
|
return error_dialog(ia.gui, _L['Cannot update metadata'],
|
|
_L['No books selected'], show=True)
|
|
# Map the rows to book ids
|
|
return map(ia.gui.library_view.model().id, rows)
|
|
|
|
|
|
def lst2string(lst):
|
|
if python3:
|
|
return "\n " + "\n ".join(lst)
|
|
return "\n " + "\n ".join(item.encode('utf-8') for item in lst)
|
|
|
|
|
|
def convert_to_cbz(ia, metadata):
|
|
if metadata.format == "cbr" or (metadata.format == "rar" and prefs['convert_archives']):
|
|
metadata.convert_cbr_to_cbz()
|
|
if prefs['delete_cbr']:
|
|
ia.gui.current_db.new_api.remove_formats({metadata.book_id: {"cbr", "rar"}})
|
|
return True
|
|
elif metadata.format == "zip" and prefs['convert_archives']:
|
|
metadata.convert_zip_to_cbz()
|
|
if prefs['delete_cbr']:
|
|
ia.gui.current_db.new_api.remove_formats({metadata.book_id: {"zip"}})
|
|
return True
|
|
return False
|