diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py
index ecb681056c..9c3a79cc70 100644
--- a/src/calibre/ebooks/metadata/meta.py
+++ b/src/calibre/ebooks/metadata/meta.py
@@ -100,27 +100,17 @@ def _get_metadata(stream, stream_type, use_libprs_metadata,
if use_libprs_metadata and getattr(opf, 'application_id', None) is not None:
return opf
- mi = MetaInformation(None, None)
name = os.path.basename(getattr(stream, 'name', ''))
- base = metadata_from_filename(name, pat=pattern)
- if force_read_metadata or prefs['read_file_metadata']:
- mi = get_file_type_metadata(stream, stream_type)
- if base.title == os.path.splitext(name)[0] and \
- base.is_null('authors') and base.is_null('isbn'):
- # Assume that there was no metadata in the file and the user set pattern
- # to match meta info from the file name did not match.
- # The regex is meant to match the standard format filenames are written
- # in the library title - author.extension
- base.smart_update(metadata_from_filename(name, re.compile(
- r'^(?P
.+)[ _]-[ _](?P[^-]+)$')))
- if base.title:
- base.title = base.title.replace('_', ' ')
- if base.authors:
- base.authors = [a.replace('_', ' ').strip() for a in base.authors]
+ # The fallback pattern matches the default filename format produced by calibre
+ base = metadata_from_filename(name, pat=pattern, fallback_pat=re.compile(
+ r'^(?P.+) - (?P[^-]+)$'))
if not base.authors:
base.authors = [_('Unknown')]
if not base.title:
base.title = _('Unknown')
+ mi = MetaInformation(None, None)
+ if force_read_metadata or prefs['read_file_metadata']:
+ mi = get_file_type_metadata(stream, stream_type)
base.smart_update(mi)
if opf is not None:
base.smart_update(opf)
@@ -133,7 +123,7 @@ def set_metadata(stream, mi, stream_type='lrf'):
set_file_type_metadata(stream, mi, stream_type)
-def metadata_from_filename(name, pat=None):
+def metadata_from_filename(name, pat=None, fallback_pat=None):
if isbytestring(name):
name = name.decode(filesystem_encoding, 'replace')
name = name.rpartition('.')[0]
@@ -142,6 +132,8 @@ def metadata_from_filename(name, pat=None):
pat = re.compile(prefs.get('filename_pattern'))
name = name.replace('_', ' ')
match = pat.search(name)
+ if match is None and fallback_pat is not None:
+ match = fallback_pat.search(name)
if match is not None:
try:
mi.title = match.group('title')