Fix regression taht caused original files to be deleted when adding books recursively. Also Fix #7342 (Version 0.7.25 not get metadata from file name)

This commit is contained in:
Kovid Goyal 2010-10-30 10:35:28 -06:00
parent 9138e0bae5
commit e9b419521e
2 changed files with 30 additions and 9 deletions

View File

@ -282,15 +282,22 @@ class HTMLInput(InputFormatPlugin):
basedir = os.getcwd() basedir = os.getcwd()
self.opts = opts self.opts = opts
fname = None
if hasattr(stream, 'name'): if hasattr(stream, 'name'):
basedir = os.path.dirname(stream.name) basedir = os.path.dirname(stream.name)
fname = os.path.basename(stream.name)
if file_ext != 'opf': if file_ext != 'opf':
if opts.dont_package: if opts.dont_package:
raise ValueError('The --dont-package option is not supported for an HTML input file') raise ValueError('The --dont-package option is not supported for an HTML input file')
from calibre.ebooks.metadata.html import get_metadata from calibre.ebooks.metadata.html import get_metadata
oeb = self.create_oebbook(stream.name, basedir, opts, log, mi = get_metadata(stream)
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 return oeb
from calibre.ebooks.conversion.plumber import create_oebbook from calibre.ebooks.conversion.plumber import create_oebbook

View File

@ -12,7 +12,7 @@ import os, time, sys, shutil
from calibre.utils.ipc.job import ParallelJob from calibre.utils.ipc.job import ParallelJob
from calibre.utils.ipc.server import Server from calibre.utils.ipc.server import Server
from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory
from calibre import prints from calibre import prints
from calibre.constants import filesystem_encoding from calibre.constants import filesystem_encoding
@ -39,6 +39,10 @@ def serialize_metadata_for(formats, tdir, id_):
f.write(cdata) f.write(cdata)
def read_metadata_(task, tdir, notification=lambda x,y:x): 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 from calibre.customize.ui import run_plugins_on_import
for x in task: for x in task:
try: try:
@ -48,17 +52,28 @@ def read_metadata_(task, tdir, notification=lambda x,y:x):
try: try:
if isinstance(formats, basestring): formats = [formats] if isinstance(formats, basestring): formats = [formats]
import_map = {} import_map = {}
fmts = [] fmts, metadata_fmts = [], []
for format in formats: for format in formats:
mfmt = format
name, ext = os.path.splitext(os.path.basename(format))
nfp = run_plugins_on_import(format) nfp = run_plugins_on_import(format)
if not nfp or not os.access(nfp, os.R_OK): if not nfp or nfp == format or not os.access(nfp, os.R_OK):
nfp = format nfp = None
else:
# Ensure that the filename is preserved so that
# reading metadata from filename is not broken
nfp = os.path.abspath(nfp) 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) fmts.append(nfp)
serialize_metadata_for(fmts, tdir, id_) serialize_metadata_for(metadata_fmts, tdir, id_)
for format, nfp in zip(formats, fmts): for format, nfp in zip(formats, fmts):
if not nfp:
continue
if isinstance(nfp, unicode): if isinstance(nfp, unicode):
nfp.encode(filesystem_encoding) nfp.encode(filesystem_encoding)
x = lambda j : os.path.abspath(os.path.normpath(os.path.normcase(j))) 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)) dest = os.path.join(tdir, '%s.%s'%(id_, nfmt))
shutil.copyfile(nfp, dest) shutil.copyfile(nfp, dest)
import_map[fmt] = dest import_map[fmt] = dest
os.remove(nfp)
if import_map: if import_map:
with open(os.path.join(tdir, str(id_)+'.import'), 'wb') as f: with open(os.path.join(tdir, str(id_)+'.import'), 'wb') as f:
for fmt, nfp in import_map.items(): for fmt, nfp in import_map.items():