diff --git a/book_tools/format/fb2.py b/book_tools/format/fb2.py index c6351974caaa140921eaa7d98b4e9ee812fa2b6c..045da3ecf393a9650d0de61acd84e82f65ca9c9a 100644 --- a/book_tools/format/fb2.py +++ b/book_tools/format/fb2.py @@ -113,9 +113,9 @@ class FB2Base(BookFile): def add_author_from_node(node): first_name = subnode_text(node, 'first-name') - middle_name = subnode_text(node, 'middle-name') + #middle_name = subnode_text(node, 'middle-name') last_name = subnode_text(node, 'last-name') - self.__add_author__(' '.join([first_name, middle_name, last_name]), last_name) + self.__add_author__(' '.join([first_name, last_name]), last_name) res = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:author', namespaces=self.__namespaces) if len(res) == 0: diff --git a/book_tools/format/fb2sax.py b/book_tools/format/fb2sax.py index bea20f8956ea2312b458e1d21e49129ed1495a2b..1065ea5db2424940a295d1166a277e15450bff62 100644 --- a/book_tools/format/fb2sax.py +++ b/book_tools/format/fb2sax.py @@ -169,7 +169,7 @@ class fb2parser: self.lang.tagopen(name) self.book_title.tagopen(name) self.annotation.tagopen(name) - self.docdate.tagopen(name) + self.docdate.tagopen(name,attrs) self.series.tagopen(name,attrs) if self.rc!=0: if self.cover_name.tagopen(name,attrs): @@ -245,7 +245,6 @@ class fb2parser: except StopIteration: pass except Exception as err: - print(err) self.parse_errormsg=err self.parse_error=1 @@ -262,7 +261,7 @@ class FB2sax(BookFile): self.file.seek(0, 0) self.fb2parser.parse(self.file) if self.fb2parser.parse_error != 0: - raise FB2StructureException('FB2sax parse error') + raise FB2StructureException('FB2sax parse error (%s)'%self.fb2parser.parse_errormsg) self.__detect_title() self.__detect_authors() self.__detect_tags() @@ -293,8 +292,8 @@ class FB2sax(BookFile): return None def __detect_docdate(self): - res = '' - if len(self.fb2parser.docdate.getvalue()) > 0: + res = self.fb2parser.docdate.getattr('value') or '' + if len(res)==0 and len(self.fb2parser.docdate.getvalue()) > 0: res = self.fb2parser.docdate.getvalue()[0].strip(); if len(res) > 0: self.__set_docdate__(res) diff --git a/opds_catalog/sopdscan.py b/opds_catalog/sopdscan.py index f546eab529df64f16c8021f486f8e7be679b5be5..ffcc24846b635f42bcda5250d1f13f9a44371d89 100644 --- a/opds_catalog/sopdscan.py +++ b/opds_catalog/sopdscan.py @@ -229,7 +229,7 @@ class opdsScanner: for a in book_data.authors: author_name = a.get('name','Unknown author').strip(strip_symbols) # Если в имени автора нет запятой, то фамилию переносим из конца в начало - if author_name.find(',')>=0: + if author_name.find(',')<0: author_names = author_name.split() author_name = ' '.join([author_names[-1],' '.join(author_names[:-1])]) author=opdsdb.addauthor(author_name) diff --git a/opds_catalog/tests/data/mirer.epub b/opds_catalog/tests/data/mirer.epub new file mode 100644 index 0000000000000000000000000000000000000000..62b38511a6801a64575349f9ea42f1d05d21186a Binary files /dev/null and b/opds_catalog/tests/data/mirer.epub differ diff --git a/opds_catalog/tests/data/robin_cook.mobi b/opds_catalog/tests/data/robin_cook.mobi new file mode 100644 index 0000000000000000000000000000000000000000..b083474b2d368365535297af5d5c0fd81286e6ae Binary files /dev/null and b/opds_catalog/tests/data/robin_cook.mobi differ diff --git a/opds_catalog/tests/test_scan.py b/opds_catalog/tests/test_scan.py index f6ab19e1155891cb5679fe000d951ad2b88a00bc..8483f8e3b21c956f12bb8b3c9ff1772ba5c1d519 100644 --- a/opds_catalog/tests/test_scan.py +++ b/opds_catalog/tests/test_scan.py @@ -13,13 +13,15 @@ class scanTestCase(TestCase): test_module_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) test_ROOTLIB = os.path.join(test_module_path, 'tests/data') test_fb2 = "262001.fb2" + test_epub = "mirer.epub" + test_mobi = "robin_cook.mobi" test_zip = "books.zip" def setUp(self): config.SOPDS_ROOT_LIB = self.test_ROOTLIB - def test_processfile(self): - """ Тестирование процедуры processfile (извлекает метаданные из книги и помещает в БД) """ + def test_processfile_fb2(self): + """ Тестирование процедуры processfile (извлекает метаданные из книги FB2 и помещает в БД) """ opdsdb.clear_all() scanner = opdsScanner() scanner.processfile(self.test_fb2, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_fb2), None,0,495373) @@ -49,6 +51,64 @@ class scanTestCase(TestCase): self.assertEqual(book.genres.get(genre="antique").section, opdsdb.unknown_genre) self.assertEqual(book.genres.get(genre="antique").subsection, "antique") + def test_processfile_epub(self): + """ Тестирование процедуры processfile (извлекает метаданные из книги EPUB и помещает в БД) """ + opdsdb.clear_all() + scanner = opdsScanner() + scanner.processfile(self.test_epub, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_epub), None,0,491279) + book = Book.objects.get(filename=self.test_epub) + self.assertIsNotNone(book) + self.assertEqual(scanner.books_added,1) + self.assertEqual(book.filename, self.test_epub) + self.assertEqual(book.path, ".") + self.assertEqual(book.format, "epub") + self.assertEqual(book.cat_type, 0) + #self.assertGreaterEqual(book.registerdate, ) + self.assertEqual(book.docdate, "2015") + self.assertEqual(book.lang, "ru") + self.assertEqual(book.title, "У меня девять жизней (шф (продолжатели))") + self.assertEqual(book.search_title, "У меня девять жизней (шф (продолжатели))".upper()) + self.assertEqual(book.annotation, "Собрание произведений. Том 2") + self.assertEqual(book.avail, 2) + self.assertEqual(book.catalog.path, ".") + self.assertEqual(book.catalog.cat_name, ".") + self.assertEqual(book.catalog.cat_type, 0) + self.assertEqual(book.filesize, 491279) + + self.assertEqual(book.authors.count(), 1) + self.assertEqual(book.authors.get(full_name="Мирер Александр").search_full_name, "МИРЕР АЛЕКСАНДР") + + self.assertEqual(book.genres.count(), 1) + self.assertEqual(book.genres.get(genre="sf").section, opdsdb.unknown_genre) + self.assertEqual(book.genres.get(genre="sf").subsection, "sf") + + def test_processfile_mobi(self): + """ Тестирование процедуры processfile (извлекает метаданные из книги EPUB и помещает в БД) """ + opdsdb.clear_all() + scanner = opdsScanner() + scanner.processfile(self.test_mobi, self.test_ROOTLIB, os.path.join(self.test_ROOTLIB,self.test_mobi), None,0,542811) + book = Book.objects.get(filename=self.test_mobi) + self.assertIsNotNone(book) + self.assertEqual(scanner.books_added,1) + self.assertEqual(book.filename, self.test_mobi) + self.assertEqual(book.path, ".") + self.assertEqual(book.format, "mobi") + self.assertEqual(book.cat_type, 0) + #self.assertGreaterEqual(book.registerdate, ) + self.assertEqual(book.docdate, "2011-11-20") + self.assertEqual(book.lang, "") + self.assertEqual(book.title, "Vector") + self.assertEqual(book.search_title, "Vector".upper()) + self.assertEqual(book.annotation, "") + self.assertEqual(book.avail, 2) + self.assertEqual(book.catalog.path, ".") + self.assertEqual(book.catalog.cat_name, ".") + self.assertEqual(book.catalog.cat_type, 0) + self.assertEqual(book.filesize, 542811) + + self.assertEqual(book.authors.count(), 1) + self.assertEqual(book.authors.get(full_name="Cook Robin").search_full_name, "COOK ROBIN") + def test_processzip(self): """ Тестирование процедуры processzip (извлекает метаданные из книг, помещенных в архив и помещает их БД) """ opdsdb.clear_all() @@ -86,17 +146,17 @@ class scanTestCase(TestCase): self.assertEqual(book.path, self.test_zip) self.assertEqual(book.cat_type, 1) self.assertEqual(book.title, "Драконьи Услуги") - self.assertEqual(book.authors.get(full_name="Куприянов Денис Валерьевич").search_full_name, "КУПРИЯНОВ ДЕНИС ВАЛЕРЬЕВИЧ") + self.assertEqual(book.authors.get(full_name="Куприянов Денис").search_full_name, "КУПРИЯНОВ ДЕНИС") def test_scanall(self): """ Тестирование процедуры scanall (извлекает метаданные из книг и помещает в БД) """ opdsdb.clear_all() scanner = opdsScanner() scanner.scan_all() - self.assertEquals(scanner.books_added, 4) + self.assertEquals(scanner.books_added, 6) self.assertEquals(scanner.bad_books, 1) - self.assertEquals(Book.objects.all().count(), 4) - self.assertEquals(Author.objects.all().count(), 4) - self.assertEquals(Genre.objects.all().count(), 4) + self.assertEquals(Book.objects.all().count(), 6) + self.assertEquals(Author.objects.all().count(), 6) + self.assertEquals(Genre.objects.all().count(), 5) self.assertEquals(Series.objects.all().count(), 0) self.assertEquals(Catalog.objects.all().count(), 2)