diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py
index 09b273e935..479b513ea5 100644
--- a/src/calibre/ebooks/metadata/meta.py
+++ b/src/calibre/ebooks/metadata/meta.py
@@ -132,6 +132,15 @@ def metadata_from_filename(name, pat=None):
au = match.group('author')
aus = string_to_authors(au)
mi.authors = aus
+ if prefs['swap_author_names'] and mi.authors:
+ def swap(a):
+ parts = a.split()
+ if len(parts) > 1:
+ t = parts[-1]
+ parts = parts[:-1]
+ parts.insert(0, t)
+ return ' '.join(parts)
+ mi.authors = [swap(x) for x in mi.authors]
except (IndexError, ValueError):
pass
try:
diff --git a/src/calibre/gui2/dialogs/config/add_save.py b/src/calibre/gui2/dialogs/config/add_save.py
index 377007831f..54d948044b 100644
--- a/src/calibre/gui2/dialogs/config/add_save.py
+++ b/src/calibre/gui2/dialogs/config/add_save.py
@@ -56,6 +56,7 @@ class AddSave(QTabWidget, Ui_TabWidget):
self.opt_read_metadata_from_filename.setChecked(not prefs['read_file_metadata'])
self.filename_pattern = FilenamePattern(self)
self.metadata_box.layout().insertWidget(0, self.filename_pattern)
+ self.opt_swap_author_names.setChecked(prefs['swap_author_names'])
def validate(self):
tmpl = preprocess_template(self.opt_template.text())
@@ -87,6 +88,7 @@ class AddSave(QTabWidget, Ui_TabWidget):
prefs['read_file_metadata'] = not bool(self.opt_read_metadata_from_filename.isChecked())
pattern = self.filename_pattern.commit()
prefs['filename_pattern'] = pattern
+ prefs['swap_author_names'] = bool(self.opt_swap_author_names.isChecked())
return True
diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui
index 513be73e54..806f77dade 100644
--- a/src/calibre/gui2/dialogs/config/add_save.ui
+++ b/src/calibre/gui2/dialogs/config/add_save.ui
@@ -20,8 +20,8 @@
&Adding books
-
- -
+
+
-
Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename.
@@ -31,14 +31,24 @@
- -
+
-
Read metadata only from &file name
- -
+
-
+
+
+ Swap the firstname and lastname of the author. This affects only metadata read from file names.
+
+
+ &Swap author firstname and lastname
+
+
+
+ -
&Configure metadata from file name
diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py
index 9281165d5f..697cfbe388 100644
--- a/src/calibre/utils/config.py
+++ b/src/calibre/utils/config.py
@@ -649,6 +649,8 @@ def _prefs():
help=_('Read metadata from files'))
c.add_opt('worker_process_priority', default='normal',
help=_('The priority of worker processes'))
+ c.add_opt('swap_author_names', default=False,
+ help=_('Swap author first and last names when reading metadata'))
c.add_opt('migrated', default=False, help='For Internal use. Don\'t modify.')
return c