diff --git a/src/calibre/ebooks/html/input.py b/src/calibre/ebooks/html/input.py
index 603adadb53..fa1de39410 100644
--- a/src/calibre/ebooks/html/input.py
+++ b/src/calibre/ebooks/html/input.py
@@ -282,15 +282,22 @@ class HTMLInput(InputFormatPlugin):
basedir = os.getcwd()
self.opts = opts
+ fname = None
if hasattr(stream, 'name'):
basedir = os.path.dirname(stream.name)
+ fname = os.path.basename(stream.name)
if file_ext != 'opf':
if opts.dont_package:
raise ValueError('The --dont-package option is not supported for an HTML input file')
from calibre.ebooks.metadata.html import get_metadata
- oeb = self.create_oebbook(stream.name, basedir, opts, log,
- get_metadata(stream))
+ mi = get_metadata(stream)
+ if fname:
+ from calibre.ebooks.metadata.meta import metadata_from_filename
+ fmi = metadata_from_filename(fname)
+ fmi.smart_update(mi)
+ mi = fmi
+ oeb = self.create_oebbook(stream.name, basedir, opts, log, mi)
return oeb
from calibre.ebooks.conversion.plumber import create_oebbook
diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py
index d2616c2444..247050856d 100644
--- a/src/calibre/ebooks/metadata/worker.py
+++ b/src/calibre/ebooks/metadata/worker.py
@@ -12,7 +12,7 @@ import os, time, sys, shutil
from calibre.utils.ipc.job import ParallelJob
from calibre.utils.ipc.server import Server
-from calibre.ptempfile import PersistentTemporaryDirectory
+from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory
from calibre import prints
from calibre.constants import filesystem_encoding
@@ -39,6 +39,10 @@ def serialize_metadata_for(formats, tdir, id_):
f.write(cdata)
def read_metadata_(task, tdir, notification=lambda x,y:x):
+ with TemporaryDirectory() as mdir:
+ do_read_metadata(task, tdir, mdir, notification)
+
+def do_read_metadata(task, tdir, mdir, notification):
from calibre.customize.ui import run_plugins_on_import
for x in task:
try:
@@ -48,17 +52,28 @@ def read_metadata_(task, tdir, notification=lambda x,y:x):
try:
if isinstance(formats, basestring): formats = [formats]
import_map = {}
- fmts = []
+ fmts, metadata_fmts = [], []
for format in formats:
+ mfmt = format
+ name, ext = os.path.splitext(os.path.basename(format))
nfp = run_plugins_on_import(format)
- if not nfp or not os.access(nfp, os.R_OK):
- nfp = format
- nfp = os.path.abspath(nfp)
+ if not nfp or nfp == format or not os.access(nfp, os.R_OK):
+ nfp = None
+ else:
+ # Ensure that the filename is preserved so that
+ # reading metadata from filename is not broken
+ nfp = os.path.abspath(nfp)
+ nfext = os.path.splitext(nfp)[1]
+ mfmt = os.path.join(mdir, name + nfext)
+ shutil.copyfile(nfp, mfmt)
+ metadata_fmts.append(mfmt)
fmts.append(nfp)
- serialize_metadata_for(fmts, tdir, id_)
+ serialize_metadata_for(metadata_fmts, tdir, id_)
for format, nfp in zip(formats, fmts):
+ if not nfp:
+ continue
if isinstance(nfp, unicode):
nfp.encode(filesystem_encoding)
x = lambda j : os.path.abspath(os.path.normpath(os.path.normcase(j)))
@@ -68,7 +83,6 @@ def read_metadata_(task, tdir, notification=lambda x,y:x):
dest = os.path.join(tdir, '%s.%s'%(id_, nfmt))
shutil.copyfile(nfp, dest)
import_map[fmt] = dest
- os.remove(nfp)
if import_map:
with open(os.path.join(tdir, str(id_)+'.import'), 'wb') as f:
for fmt, nfp in import_map.items():