From c7cd76bdc7cded72b75a49324535e3866c48ad96 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 22 Feb 2008 20:46:12 +0000 Subject: [PATCH] Implement recursive import assuming multiple ebooks per directory --- src/libprs500/ebooks/metadata/meta.py | 39 ++++++++++++++-------- src/libprs500/gui2/main.py | 28 ++++++++++++---- src/libprs500/library/database.py | 48 ++++++++++++++++++++++++--- 3 files changed, 90 insertions(+), 25 deletions(-) diff --git a/src/libprs500/ebooks/metadata/meta.py b/src/libprs500/ebooks/metadata/meta.py index 05c043bd2f..48e24690ec 100644 --- a/src/libprs500/ebooks/metadata/meta.py +++ b/src/libprs500/ebooks/metadata/meta.py @@ -49,6 +49,12 @@ def get_metadata(stream, stream_type='lrf', use_libprs_metadata=False): if not base.authors: base.authors = ['Unknown'] base.smart_update(mi) + if hasattr(stream, 'name'): + opfpath = os.path.abspath(os.path.splitext(stream.name)[0]+'.opf') + if os.access(opfpath, os.R_OK): + mi = opf_metadata(opfpath) + if mi is not None: + base.smart_update(mi) return base def set_metadata(stream, mi, stream_type='lrf'): @@ -103,23 +109,28 @@ def metadata_from_filename(name, pat=None): if not mi.title: mi.title = name return mi + +def opf_metadata(opfpath): + f = open(opfpath, 'rb') + opf = OPFReader(f, os.path.dirname(opfpath)) + try: + if opf.libprs_id is not None: + mi = MetaInformation(opf, None) + if hasattr(opf, 'cover') and opf.cover: + cpath = os.path.join(os.path.dirname(opfpath), opf.cover) + if os.access(cpath, os.R_OK): + fmt = cpath.rpartition('.')[-1] + data = open(cpath, 'rb').read() + mi.cover_data = (fmt, data) + return mi + except: + pass + def libprs_metadata(name): if os.path.basename(name) != 'metadata.opf': name = os.path.join(os.path.dirname(name), 'metadata.opf') name = os.path.abspath(name) if os.access(name, os.R_OK): - f = open(name, 'rb') - opf = OPFReader(f, os.path.dirname(name)) - try: - if opf.libprs_id is not None: - mi = MetaInformation(opf, None) - if hasattr(opf, 'cover') and opf.cover: - cpath = os.path.join(os.path.dirname(name), opf.cover) - if os.access(cpath, os.R_OK): - fmt = cpath.rpartition('.')[-1] - data = open(cpath, 'rb').read() - mi.cover_data = (fmt, data) - return mi - except: - pass \ No newline at end of file + return opf_metadata(name) + \ No newline at end of file diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py index dee195c27a..02865c7be8 100644 --- a/src/libprs500/gui2/main.py +++ b/src/libprs500/gui2/main.py @@ -120,11 +120,13 @@ class Main(MainWindow, Ui_MainWindow): self.metadata_menu = md self.add_menu = QMenu() self.add_menu.addAction(_('Add books from a single directory')) - self.add_menu.addAction(_('Add books recursively (One book per directory)')) + self.add_menu.addAction(_('Add books recursively (One book per directory, assumes every ebook file is the same book in a different format)')) + self.add_menu.addAction(_('Add books recursively (Multiple books per directory, assumes every ebook file is a different book)')) self.action_add.setMenu(self.add_menu) QObject.connect(self.action_add, SIGNAL("triggered(bool)"), self.add_books) QObject.connect(self.add_menu.actions()[0], SIGNAL("triggered(bool)"), self.add_books) QObject.connect(self.add_menu.actions()[1], SIGNAL("triggered(bool)"), self.add_recursive_single) + QObject.connect(self.add_menu.actions()[2], SIGNAL("triggered(bool)"), self.add_recursive_multiple) QObject.connect(self.action_del, SIGNAL("triggered(bool)"), self.delete_books) QObject.connect(self.action_edit, SIGNAL("triggered(bool)"), self.edit_metadata) QObject.connect(md.actions()[0], SIGNAL('triggered(bool)'), self.edit_metadata) @@ -294,15 +296,11 @@ class Main(MainWindow, Ui_MainWindow): ################################# Add books ################################ - def add_recursive_single(self, checked): - ''' - Add books from the local filesystem to either the library or the device - recursively assuming one book per folder. - ''' + def add_recursive(self, single): root = choose_dir(self, 'recursive book import root dir dialog', 'Select root folder') if not root: return - duplicates = self.library_view.model().db.recursive_import(root) + duplicates = self.library_view.model().db.recursive_import(root, single) if duplicates: files = _('

Books with the same title as the following already exist in the database. Add them anyway?