mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
calibredb: Add a new 'embed_metadata' command to update metadata in the actual book files in the calibre library from the calibre database.
This commit is contained in:
parent
b1c36e7514
commit
e97135a768
@ -364,7 +364,8 @@ def set_file_type_metadata(stream, mi, ftype, report_error=None):
|
|||||||
break
|
break
|
||||||
except:
|
except:
|
||||||
if report_error is None:
|
if report_error is None:
|
||||||
print 'Failed to set metadata for', repr(getattr(mi, 'title', ''))
|
from calibre import prints
|
||||||
|
prints('Failed to set metadata for the', ftype.upper(), 'format of:', getattr(mi, 'title', ''), file=sys.stderr)
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
else:
|
else:
|
||||||
report_error(mi, ftype, traceback.format_exc())
|
report_error(mi, ftype, traceback.format_exc())
|
||||||
|
@ -1797,7 +1797,7 @@ class Cache(object):
|
|||||||
return {k:tuple(sorted(v, key=sort_key)) for k, v in ans.iteritems()}
|
return {k:tuple(sorted(v, key=sort_key)) for k, v in ans.iteritems()}
|
||||||
|
|
||||||
@write_api
|
@write_api
|
||||||
def embed_metadata(self, book_ids, only_fmts=None, report_error=None):
|
def embed_metadata(self, book_ids, only_fmts=None, report_error=None, report_progress=None):
|
||||||
''' Update metadata in all formats of the specified book_ids to current metadata in the database. '''
|
''' Update metadata in all formats of the specified book_ids to current metadata in the database. '''
|
||||||
field = self.fields['formats']
|
field = self.fields['formats']
|
||||||
from calibre.ebooks.metadata.opf2 import pretty_print
|
from calibre.ebooks.metadata.opf2 import pretty_print
|
||||||
@ -1812,7 +1812,7 @@ class Cache(object):
|
|||||||
stream.seek(0, os.SEEK_END)
|
stream.seek(0, os.SEEK_END)
|
||||||
return stream.tell()
|
return stream.tell()
|
||||||
|
|
||||||
for book_id in book_ids:
|
for i, book_id in enumerate(book_ids):
|
||||||
fmts = field.table.book_col_map.get(book_id, ())
|
fmts = field.table.book_col_map.get(book_id, ())
|
||||||
if not fmts:
|
if not fmts:
|
||||||
continue
|
continue
|
||||||
@ -1834,6 +1834,8 @@ class Cache(object):
|
|||||||
self.format_metadata_cache[book_id].get(fmt, {})['size'] = new_size
|
self.format_metadata_cache[book_id].get(fmt, {})['size'] = new_size
|
||||||
max_size = self.fields['formats'].table.update_fmt(book_id, fmt, name, new_size, self.backend)
|
max_size = self.fields['formats'].table.update_fmt(book_id, fmt, name, new_size, self.backend)
|
||||||
self.fields['size'].table.update_sizes({book_id: max_size})
|
self.fields['size'].table.update_sizes({book_id: max_size})
|
||||||
|
if report_progress is not None:
|
||||||
|
report_progress(i+1, len(book_ids), mi)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
@ -583,6 +583,43 @@ an OPF file.
|
|||||||
' with the --field option'))
|
' with the --field option'))
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
def embed_metadata_option_parser():
|
||||||
|
parser = get_parser(_(
|
||||||
|
'''
|
||||||
|
%prog embed_metadata [options] book_id
|
||||||
|
|
||||||
|
Update the metadata in the actual book files stored in the calibre library from
|
||||||
|
the metadata in the calibre database. Normally, metadata is updated only when
|
||||||
|
exporting files from calibre, this command is useful if you want the files to
|
||||||
|
be updated in place. Note that different file formats support different amounts
|
||||||
|
of metadata. You can use the special value 'all' for book_id to update metadata
|
||||||
|
in all books. You can also specify many book ids separated by spaces and id ranges
|
||||||
|
separated by hyphens. For example: %prog embed_metadata 1 2 10-15 23'''))
|
||||||
|
parser.add_option('-f', '--only-formats', action='append', default=[], help=_(
|
||||||
|
'Only update metadata in files of the specified format. Specify it multiple'
|
||||||
|
' times for multiple formats. Be default, all formats are updated.'))
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def command_embed_metadata(args, dbpath):
|
||||||
|
parser = embed_metadata_option_parser()
|
||||||
|
opts, args = parser.parse_args(sys.argv[0:1]+args)
|
||||||
|
db = get_db(dbpath, opts)
|
||||||
|
ids = set()
|
||||||
|
for x in args[1:]:
|
||||||
|
if x == 'all':
|
||||||
|
ids = db.new_api.all_book_ids()
|
||||||
|
break
|
||||||
|
parts = x.split('-')
|
||||||
|
if len(parts) == 1:
|
||||||
|
ids.add(int(parts[0]))
|
||||||
|
else:
|
||||||
|
ids |= {x for x in xrange(int(parts[0], int(parts[1])))}
|
||||||
|
only_fmts = opts.only_formats or None
|
||||||
|
def progress(i, total, mi):
|
||||||
|
prints(_('Processed {0} ({1} of {2})').format(mi.title, i, total))
|
||||||
|
db.new_api.embed_metadata(ids, only_fmts=only_fmts, report_progress=progress)
|
||||||
|
send_message()
|
||||||
|
|
||||||
def command_set_metadata(args, dbpath):
|
def command_set_metadata(args, dbpath):
|
||||||
parser = set_metadata_option_parser()
|
parser = set_metadata_option_parser()
|
||||||
opts, args = parser.parse_args(sys.argv[0:1]+args)
|
opts, args = parser.parse_args(sys.argv[0:1]+args)
|
||||||
@ -1463,7 +1500,7 @@ COMMANDS = ('list', 'add', 'remove', 'add_format', 'remove_format',
|
|||||||
'saved_searches', 'add_custom_column', 'custom_columns',
|
'saved_searches', 'add_custom_column', 'custom_columns',
|
||||||
'remove_custom_column', 'set_custom', 'restore_database',
|
'remove_custom_column', 'set_custom', 'restore_database',
|
||||||
'check_library', 'list_categories', 'backup_metadata',
|
'check_library', 'list_categories', 'backup_metadata',
|
||||||
'clone')
|
'clone', 'embed_metadata')
|
||||||
|
|
||||||
|
|
||||||
def option_parser():
|
def option_parser():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user