Реализовал CLI инструмент metabook для парсинга электронных книг форматов epub и fb2, с удобной архитектурой под расширение.
Использованы только встроенные библиотеки: argparse, xml.
Описание функцианла иструмента:
usage: E-book metadata parser [-h] [-v] filename [filename ...]
Returns title, author, publisher and date published from a specified EPUB or FB2
positional arguments:
filename insert a relative or absolute filepaths
options:
-h, --help show this help message and exit
-v, --verbose display additional information
Я поставил себе целью разработать поддерживаемое, тестируемое и удобно расширяемое приложение, соблюдая принципы SOLID, DRY, KISS.
Класс EbookParser работает с интерфейсом абстрактного класса, представляющего электронную книгу, который требует реализации менеджера контекста (т.к. зачастую для парсинга книги ее требуется распаковать, а после парсинга почистить распакованные файлы) и метода get_metadata()
, осуществляющего сам парсинг и возвращающего необходимые данные в датаклассе с модифицированным методом __str__
для удобства вывода в stdout. В свою очередь, строчная репрезентация датакласса зависит от наличия флага --verbose
, который добавляет к выводу информацию о языкe книги и ее описание.
От абстрактного класса Ebook наследуются классы, соответствующие поддерживаемым форматам электронных книг: EPUB_book и FB2_book. За создание объектов этих классов отвечает фабрика. В случае с EPUB форматом, метод __enter__
распаковывает файлы книги во временную папку, где метод _find_opf
найдет файл с расширением .opf, содержащий метаданные книги для последующего парсинга, после чего метод __exit__
удалит временную папку. В случае с форматом FB2, который не требует разархивации, метод __enter__
просто возвращает self.
git clone https://github.com/cyrillus31/metabook-cli-ebook-metadata-parser.git
cd metabook-cli-ebook-metadata-parser/metabook/
К проекту прилагаются файлы для проверки работы программы:
python main.py ../Books_examples/* --verbose
CLI инструмент может работать с абсолютными и относительными путями файлов и любым количеством аргументов.