Программа для извлечения и замены иллюстраций в .fb2-книгах

(зеркала: http://www.flibusta.net/node/83100 и http://www.the-ebook.org/forum/viewtopic.php?t=15947)

Дарю обществу: fb2bin - извлекалка/заменялка двоичных вложений (картинок, MIDI-файлов и прочего) в .fb2-файлах. Возможности:

  • проверка целостности вложений и вывод их списка с размерами в байтах;
  • извлечение вложений в виде файлов в указанный каталог;
  • замена вложений на имеющиеся в указанном каталоге файлы.

В ближайших планах - обработка вложений не сплошная, а списком; сличение вложений с файлами; обработка вложений .bat-файлами или иными скриптами.
Программа запускается с командной строки, может принимать и отдавать FB2-файлы через стандартный ввод/вывод (т.е. использоваться как фильтр). При запуске без параметров даёт подсказку о способе вызова подсказки :-) - правда, по-английски; даю краткий перевод:

Цитата:
fb2bin - список/извлечение замена двоичных вложений в FB2-файлах, (версия, дата)
Вдохновлено форумом о программах для "ебуководов"
Использование:
fb2bin -h
fb2bin -l [ -vqfi ] fb2-файл
fb2bin -x [ -vqfid путь ] исходный-fb2 [ id-вложения ... ] [ @список-id'ов-вложений ... ]
fb2bin -r [ -vqfd путь ] исходный-fb2 выходной-fb2 [ id-вложения ... ] [ @список-id'ов-вложений ... ]
Команды:
-h, --help - подсказка
-l, --list - показать список вложений
-x, --extract - извлечь вложения в файлы
-r, --replace - заменить вложения на файлы
Аргументы:
исходный-fb2, выходной-fb2 - имена файлов, либо "-" - входной и выходной поток соответственно
id-вложения - один или более идентификаторов извлекаемых/заменяемых вложений (если не указано - будут обрабатываться все вложения)
список-id'ов-вложений - один или более файлов, содержащих идентификаторы обрабатываемых вложений
Опции:
-q, --quiet - режим "молчун" (выдаются только сообщения об ошибках; удобно для батничков; если задать дважды - будет вообще ничего не сообщаться)
-v --verbose - режим "болтун" (полезно, когда что-то идёт не так и хочется узнать причины происходящего; если задать дважды - будет ещё болтливее)
-f, --far-extension - режим расширенной поддержки Far Manager'а (http://www.farmanager.com)
-i, --ignore-invalid - игнорировать невалидность description'а исходного FB2 (может вызвать странные глюки)
-d, --base-dir=путь - каталог, куда складывать / откуда брать файлы (по умолчанию - текущий каталог)
Коды ERRORLEVEL (для использования в .bat-файлах):
0 - всё сделано ОК;
1 - всё сделано, но возможно, что выходной(-ые) файл(ы) невалиден(-ны)
2 - невалидный исходный файл - выполнение невозможно
3 - приключилась фатальная ошибка (скорее всего - нехватка памяти либо места на диске, но может быть и ошибка лично моя; имеет смысл попробовать ещё раз с увеличенным уровнем "болтливости", если всё равно непонятно - спросить у меня)
4 - ошибка в параметрах командной строки.

Пример применения - для замены прозрачных картинок в FB2-книге на обычные:
Цитата:
@echo off
: извлекаем:
fb2bin -x -d . Kalma_Sirotyi_kvartala_Belvill.192080.fb2
: убираем не-png'шное:
del *.jpg
: делаем непрозрачные:
limpng -r *.png
: возвращаем первоначальные имена:
del ?????.png
ren *.png ?????.*
: минимизируем размер файлов (в отдельный подкаталог):
optipng -O7 -d opti\ *.png
: загоняем обратно в FB2:
fb2bin -r -d opti\ Kalma_Sirotyi_kvartala_Belvill.192080.fb2 - >kalma.fb2

Ну и, само собой, исходники тоже лежат - вдруг кому-то пригодится. Кто найдёт ошибку или предложит доработку - делитесь! :-)
18/10/2010: выложена версия 1.1.
Исправлена пара мелких, но неприятных ошибок. Подправлен интерфейс, улучшен вид выходного FB2-документа (аккуратнее сделаны отступы при изменяемых полях), заменён движок на более компактный и шустрый - программа "похудела" в тридцать раз, с 600 до 20 килобайт - не пугайтесь, это не вирус! :-)
Как обычно - с исходниками.
19/10/2010: версия 1.2.
Добавлена поддержка неюникодных кодировок (в т.ч. windows-1251) - оказывается, XML-движок их не поддерживал. Теперь поддерживает - я его переделал. Правда, без перекодировки - изменённый файл сохраняется в той же кодировке, что и исходный. Извиняюсь за невнимательность, скачавших предыдущие версии прошу скачать свежую.
28/10/2010: версии 1.3 (к вечеру уже устарела :-( ) и 1.4.
Исправлена мелкая ошибка с порядком разбора тэгов; добавлена опция "не проверять валидность description'а FB2-документа" при просмотре списка вложений и их выгрузке; добавлена возможность выборочной обработки вложений с целью интеграции с Far Manager'ом; добавлен режим полного подавления вывода сообщений.
02/11/2010 - версия 1.5
  • Добавлена возможность передачи id'ов обрабатываемых вложений списковыми файлами - гл. обр. для сокращения количества запусков программы при массированных обработках и для удобства использования с Far'ом;
  • расширена поддержка Far Manager'а - пока это только генерация псевдовложения с id="dirinfo" и вывод в него ID'а документа и номера версии (в планах - псевдовложение с id="files.bbs" или "descript.ion" с описаниями картинок (из атрибута title тэга image, из следующего за иллюстрацией текста и т.д.); если кто захочет - добавлю вывод ещё чего-ньдь полезного);
  • в поставку включен файл custom_user.ini - пример использования программы в качестве архиватора для Far'а.

Комментарии

PrePress написал:
Рыжий Тигра написал:
Нууу... вообще-то прога делалась в основном таки для программистов...
А я думал, что для всех работающих с fb2. А ведь пользователи программы с исходниками разбираться и не обязаны вроде бы.
PrePress, отстань от редкого, занесённого в Красную Книгу кошачьего! :)

Читатели и не обязаны смотреть исходники. Они для программистов. Но отсутствие исходников не должно помешать пользоваться готовой программой.

Поясните, зачем вы хотите с помощью этой программы убивать прозрачность PNG. Я наоборот непрозрачные картинки переделываю в прозрачные. Или я что-то недопонимаю?

Tekel написал:
Поясните, зачем вы хотите с помощью этой программы убивать прозрачность PNG.
Во-первых, это только одно из возможных применений проги; остальные - это замена иллюстраций на сделанные из того же оригинала, но с более высоким разрешением либо более аккуратно почищенные, или (в случае, если, как у меня, FBE2 ходит поверх IE5.5) изготовление .fb2-книги c маленькими непрозрачными картинками, а потом уже замена на большие и прозрачные...
Эта программа извлекает и заменяет картинки. Какие на какие менять - дело пользователя.
Во-вторых, есть много читалок, которые не умеют правильно показывать прозрачные иллюстрации - так или иначе гадят: превращают картинку в однобитную, делают из неё "квадрат Малевича", заливают вертикальными чёрными полосами... В таких случаях спасает только или наехать на автора вьюера, чтобы переделал, или (в случае, скажем, вьюеров от Sony и прочих, сделанных на базе Adobe SDK) убрать прозрачность вообще. :-(
Tekel написал:
Я наоборот непрозрачные картинки переделываю в прозрачные.
Я вообще-то тоже. Но не так, как в, например, "Тонкой струне" (кстати, спасибо за великолепно сделанную книгу! Я это всё читал в где-то втором-третьем классе, больше 30 лет назад, приятно вспомнить!) - с прозрачным фоном и непрозрачными деталями, а по-своему, с переменной прозрачностью - от полностью прозрачного белого до полностью непрозрачного чёрного: http://lib.rus.ec/node/228164
(Кстати, вот как выглядит рисунок из расказа "Балкунчик" на насыщенном цветном фоне:

- предлагаю опробовать мою методику, она интереснее! :-) )

Рыжий Тигра, спасибо за рекомендации. Обязательно попробую.

Поясните, зачем вы хотите с помощью этой программы убивать прозрачность PNG. Я наоборот непрозрачные картинки переделываю в прозрачные. Или я что-то недопонимаю?

Рыжий Тигра, ты не мог сделать main как-то попроще? Я же голову сломаю переделывая его в DLL.

FeyFre_r написал:
сделать main как-то попроще?
В смысле - не таким "спагетти"? Пробовал, но там до фига переменных, которые должны передаваться вдоль всего main()'а. :-(
FeyFre_r написал:
его в DLL
Распиши, какие куски надо разнести по каким функциям.

Просто сделай из заданного mxml_node_t*(полученного посредством mxmlLoadFile) извлекалку всех данных которые нужно показать на гора(бинарей и их идентификаторов, всевдо информации(dirinfo и пр.), а также функцию подмены содержимого бинарей(по заданному id, который предыдущей функцией поличил что-ли), ну и commit функцию что-бы добавила историю модификации.
А я уже разберусь как и когда их вызывать.

FeyFre_r написал:
а также функцию подмены содержимого бинарей(по заданному id, который предыдущей функцией поличил что-ли)
Не получится: для каждой подмены надо или извлекать весь XML из файла и обратно сохранять весь (а это долго), или всё время держать всё XML-дерево в памяти (а это громоздко и ХЗ как сохранять между вызовами).

Страницы

X