картинку из файла fb2

Как получить картинку из файла fb2?

Привет всем! Я очень люблю читать, в связи с чем у меня на сервере достаточно серьезная библиотека собралась. И понятное дело — где много материалов — много бардака. С наведением порядка в библиотеке разберемся чуть позднее (когда-то дойдут руки, и я допишу программку (дописал 🙂 ), которая будет переименовывать ваши файлы на домашнем компьютере из текущего «arkadij_natanovich_strugatckij-ponedelnik-61f44c8d99b2b.fb2.zip» (а именно в таким виде чаще всего файлы и качаются из Интернета) в нечто вроде «Стругацкие.Понедельник начинается в субботу.fb2» — что всяко лучше и нагляднее первого варианта. Но сегодня — как получить картинку из файла fb2?

Тема поста всплыла очень случайно — в одной книге встретилась замечательная таблица со статистическими данными, а так как переписывать их вручную много и скучно — возникла идея написать выдиратор картинок из fb2.

Не буду рассусоливать (и так слишком много воды в тексте сегодня) — скажу только, что так как формат .fb2 сродни .xml — то и парсить его можно с помощью xml.dom.minidom (подробнее — немного позже). Т.е. логика простая:
1. Мы знаем, что все данные из файла .fb2 можно спарсить на основании того, что этот формат — схож с .xml
2. Все картинки в .fb2 хранятся в самом конце, окружены тегами blablabla
3. А после прочтения документации к формату .fb2 и узнав, что картинки хранятся в кодировке base64
приходим к следующему алгоритму действий:
1. Получаем название книги
2. Открываем ее, и парсим содержимое до тех пор, пока не найдем все, что хранится внутри тегов
3. Получаем это самое содержимое, и декодируем из формата base64 в двоичный вид, а после — в графический файл.
4. Сохраняем файл и радуемся.

Сам код:

import xml.dom.minidom
import base64
 
file = str(input('Введите название книги (в полном виде)\n: '))
 
doc = xml.dom.minidom.parse(file)
pictures_links = doc.getElementsByTagName('binary')
minimal = 0
for pictures_link in pictures_links:
nodes = pictures_link.childNodes
for node in nodes:
if node.nodeType == node.TEXT_NODE:
base64_pictures_bytes = node.data.encode('utf-8')
pictures_name = str('pictures') + str(minimal) + str('.png')
with open(pictures_name, 'wb') as file_to_save:
decoded_image_data = base64.decodebytes(base64_pictures_bytes)
file_to_save.write(decoded_image_data)
minimal = int(minimal)
minimal = minimal + 1

Пояснять тут что-то будет лишним.
Надеюсь, код пригодится 🙂 Как всегда — в случае возникновения вопросов пишите на почту или в Telegram.
И да — в самое ближайшее время сделаю приложение под Windows, которое будет делать тоже самое (получать картинку из файла fb2), но с помощью более привычного оконного интерфейса, а не терминала 🙂 Обещаю не затягивать!

UPD: программку, как и обещал — сделал. Три кнопки, и никакой мороки! Качать можно либо с моего сайта, либо — из моего Телеграм-канала 🙂

Поисковые запросы:
Как получить картинку из файла fb2
Как извлечь фото и картинки из книги формата FB2