diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index cc90ceb1f2..75e381f89d 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -60,6 +60,7 @@ COVER_FILE_NAME = 'cover.jpg' METADATA_FILE_NAME = 'metadata.opf' DEFAULT_TRASH_EXPIRY_TIME_SECONDS = 14 * 86400 TRASH_DIR_NAME = '.caltrash' +DATA_DIR_NAME = 'data' BOOK_ID_PATH_TEMPLATE = ' ({})' CUSTOM_DATA_TYPES = frozenset(('rating', 'text', 'comments', 'datetime', 'int', 'float', 'bool', 'series', 'composite', 'enumeration')) diff --git a/src/calibre/ebooks/metadata/book/render.py b/src/calibre/ebooks/metadata/book/render.py index 7c16fdab53..f5400ce73f 100644 --- a/src/calibre/ebooks/metadata/book/render.py +++ b/src/calibre/ebooks/metadata/book/render.py @@ -5,18 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import os -from functools import partial from contextlib import suppress +from functools import partial -from calibre import prepare_string_for_xml, force_unicode -from calibre.ebooks.metadata import fmt_sidx, rating_to_stars -from calibre.ebooks.metadata.search_internet import name_for, url_for_author_search, url_for_book_search, qquote, DEFAULT_AUTHOR_SOURCE -from calibre.ebooks.metadata.sources.identify import urls_from_identifiers +from calibre import force_unicode, prepare_string_for_xml from calibre.constants import filesystem_encoding +from calibre.db.backend import DATA_DIR_NAME +from calibre.ebooks.metadata import fmt_sidx, rating_to_stars +from calibre.ebooks.metadata.search_internet import ( + DEFAULT_AUTHOR_SOURCE, name_for, qquote, url_for_author_search, url_for_book_search, +) +from calibre.ebooks.metadata.sources.identify import urls_from_identifiers from calibre.library.comments import comments_to_html, markdown -from calibre.utils.icu import sort_key +from calibre.utils.date import format_date, is_date_undefined from calibre.utils.formatter import EvalFormatter -from calibre.utils.date import is_date_undefined, format_date +from calibre.utils.icu import sort_key from calibre.utils.localization import calibre_langcode_to_name from calibre.utils.serialize import json_dumps from polyglot.binary import as_hex_unicode @@ -213,7 +216,7 @@ def mi_to_html( link = '{}{}'.format(action(scheme, book_id=book_id, loc=loc), prepare_string_for_xml(path, True), _('Click to open'), extra) if not isdevice: - data_path = os.path.join(path, 'data') + data_path = os.path.join(path, DATA_DIR_NAME) with suppress(OSError): if os.listdir(data_path): link += ' \xa0 {}'.format( diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index f949547dd0..738e6770e5 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -9,12 +9,13 @@ import json import os import time from functools import partial -from qt.core import QAction, QIcon, pyqtSignal, QDialog +from qt.core import QAction, QDialog, QIcon, pyqtSignal from calibre.constants import ismacos, iswindows +from calibre.db.backend import DATA_DIR_NAME from calibre.gui2 import ( Dispatcher, config, elided_text, error_dialog, info_dialog, open_local_file, - question_dialog + question_dialog, ) from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.choose_format import ChooseFormatDialog @@ -283,7 +284,7 @@ class ViewAction(InterfaceAction): def view_data_folder_for_id(self, id_): path = self.gui.library_view.model().db.abspath(id_, index_is_id=True) - open_local_file(os.path.join(path, 'data')) + open_local_file(os.path.join(path, DATA_DIR_NAME)) def view_book(self, triggered): rows = self.gui.current_view().selectionModel().selectedRows() diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index fc369d437c..0eade46865 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -15,6 +15,7 @@ from qt.core import ( from calibre import fit_image, sanitize_file_name from calibre.constants import config_dir, iswindows +from calibre.db.backend import DATA_DIR_NAME from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.book.base import Metadata, field_metadata from calibre.ebooks.metadata.book.render import mi_to_html @@ -476,7 +477,7 @@ def create_copy_links(menu, data=None): link(_('Link to show book in calibre'), f'calibre://show-book/{library_id}/{book_id}') link(_('Link to show book details in a popup window'), f'calibre://book-details/{library_id}/{book_id}') mi = db.new_api.get_proxy_metadata(book_id) - data_path = os.path.join(db.backend.library_path, mi.path, 'data') + data_path = os.path.join(db.backend.library_path, mi.path, DATA_DIR_NAME) with suppress(OSError): if os.listdir(data_path): if iswindows: diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 5fbd0dd042..2761e89f30 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -19,6 +19,7 @@ from qt.core import ( ) from calibre import xml_replace_entities +from calibre.db.backend import DATA_DIR_NAME from calibre.ebooks.chardet import xml_to_unicode from calibre.gui2 import ( NO_URL_FORMATTING, choose_dir, choose_files, error_dialog, gprefs, is_dark_theme, @@ -707,7 +708,7 @@ class EditorWidget(QTextEdit, LineEditECM): # {{{ d.bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok|QDialogButtonBox.StandardButton.Cancel) d.br = b = QPushButton(_('&File')) base = os.path.dirname(self.base_url.toLocalFile()) if self.base_url else os.getcwd() - data_path = os.path.join(base, 'data') + data_path = os.path.join(base, DATA_DIR_NAME) if self.base_url: os.makedirs(data_path, exist_ok=True) diff --git a/src/calibre/library/check_library.py b/src/calibre/library/check_library.py index eb5778a819..655e5599e8 100644 --- a/src/calibre/library/check_library.py +++ b/src/calibre/library/check_library.py @@ -12,13 +12,15 @@ import traceback from calibre import isbytestring from calibre.constants import filesystem_encoding -from calibre.db.backend import COVER_FILE_NAME, METADATA_FILE_NAME, TRASH_DIR_NAME +from calibre.db.backend import ( + COVER_FILE_NAME, DATA_DIR_NAME, METADATA_FILE_NAME, TRASH_DIR_NAME, +) from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.localization import _ from polyglot.builtins import iteritems EBOOK_EXTENSIONS = frozenset(BOOK_EXTENSIONS) -NORMALS = frozenset({METADATA_FILE_NAME, COVER_FILE_NAME, 'data'}) +NORMALS = frozenset({METADATA_FILE_NAME, COVER_FILE_NAME, DATA_DIR_NAME}) IGNORE_AT_TOP_LEVEL = frozenset({'metadata.db', 'metadata_db_prefs_backup.json', 'metadata_pre_restore.db', 'full-text-search.db', TRASH_DIR_NAME}) '''