Allow adding arbitrary files to a book record stored as auxiliary data by right clicking the add books button and choosing "Add data files"

This commit is contained in:
Kovid Goyal 2023-04-18 22:31:58 +05:30
parent 80c997b13e
commit dc9da6b2e8
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 33 additions and 1 deletions

View File

@ -57,7 +57,9 @@ Add books
6. **Add files to selected book records**: Allows you to add or update the files associated with an existing book in your library. 6. **Add files to selected book records**: Allows you to add or update the files associated with an existing book in your library.
7. **Add an empty file to selected book records**: Allows you to add an empty file of the specified format to the selected book records. 7. **Add data files to selected book records**: Allows you to add any number of extra files that will be stored in a :file:`data` sub-directory in the book directory
8. **Add an empty file to selected book records**: Allows you to add an empty file of the specified format to the selected book records.
The :guilabel:`Add books` action can read metadata from a wide variety of e-book formats. In addition, it tries to guess metadata from the filename. The :guilabel:`Add books` action can read metadata from a wide variety of e-book formats. In addition, it tries to guess metadata from the filename.
See the :ref:`config_filename_metadata` section, to learn how to configure this. See the :ref:`config_filename_metadata` section, to learn how to configure this.
@ -70,6 +72,16 @@ To add an additional format for an existing book you can do any of three things:
3. Click the :guilabel:`Add books` button in the top right area of the :guilabel:`Edit metadata` dialog, accessed by the :ref:`edit_meta_information` action. 3. Click the :guilabel:`Add books` button in the top right area of the :guilabel:`Edit metadata` dialog, accessed by the :ref:`edit_meta_information` action.
.. note::
The extra data files added to a book will be managed by calibre, as part of
the book. However, they cannot be viewed directly or used as conversion
sources. Nor are they indexed by the Full text search engine in calibre. To
view them select the book and press the :kbd:`O` key which will open up the
book folder in your file manager, from where the extra files can be viewed
using any program you like. They are most useful to store any ancilliary
data associated with a book such as supplementary reading material, digital
resources, etc.
.. _edit_meta_information: .. _edit_meta_information:
Edit metadata Edit metadata

View File

@ -3049,6 +3049,12 @@ class Cache:
def reindex_annotations(self): def reindex_annotations(self):
self.backend.reindex_annotations() self.backend.reindex_annotations()
@write_api
def add_extra_files(self, book_id, map_of_relpath_to_stream_or_path):
path = self._field_for('path', book_id).replace('/', os.sep)
for relpath, stream_or_path in map_of_relpath_to_stream_or_path.items():
self.backend.add_extra_file(relpath, stream_or_path, path)
def import_library(library_key, importer, library_path, progress=None, abort=None): def import_library(library_key, importer, library_path, progress=None, abort=None):
from calibre.db.backend import DB from calibre.db.backend import DB

View File

@ -71,6 +71,8 @@ class AddAction(InterfaceAction):
triggered=self.add_formats, shortcut='Shift+A') triggered=self.add_formats, shortcut='Shift+A')
ma('add-formats-clipboard', _('Add files to selected book records from clipboard'), ma('add-formats-clipboard', _('Add files to selected book records from clipboard'),
triggered=self.add_formats_from_clipboard, shortcut='Shift+Alt+A', icon='edit-paste.png') triggered=self.add_formats_from_clipboard, shortcut='Shift+Alt+A', icon='edit-paste.png')
ma('add-extra-files-to-books', _(
'Add data files to selected book records')).triggered.connect(self.add_extra_files)
ma('add-empty-format-to-books', _( ma('add-empty-format-to-books', _(
'Add an empty file to selected book records')).triggered.connect(self.add_empty_format_choose) 'Add an empty file to selected book records')).triggered.connect(self.add_empty_format_choose)
self.add_menu.addSeparator() self.add_menu.addSeparator()
@ -145,6 +147,18 @@ class AddAction(InterfaceAction):
if books: if books:
self._add_formats(books, ids) self._add_formats(books, ids)
def add_extra_files(self):
ids = self._check_add_formats_ok()
if not ids:
return
books = choose_files_and_remember_all_files(self.gui, 'add extra data files dialog dir',
_('Select extra data files'), filters=get_filters())
if books:
rmap = {'data/' + os.path.basename(x): x for x in books}
db = self.gui.current_db.new_api
for book_id in ids:
db.add_extra_files(book_id, rmap)
def _add_formats(self, paths, ids): def _add_formats(self, paths, ids):
if len(ids) > 1 and not question_dialog( if len(ids) > 1 and not question_dialog(
self.gui, self.gui,