Библиотеку начал собирать ещё мой отец. Потом и я много покупал.
Сейчас это несколько тысяч книг. И в какой‑то момент я понял, что уже не помню, что у меня есть. Покупаю на развале книгу, а дома нахожу второй экземпляр. Ищу второй том и не знаю, есть ли первый.
Писать каталог я позвал ИИ‑ассистента. С кодом он управился быстро. С советским титульным листом мы застряли: ни ассистент, ни программа не смогли прочитать его даже с десятой попытки.

Почему не LiveLib
Я внёс в LiveLib больше тысячи книг. Когда захотел забрать список, выяснилось, что экспорта нет. Свои же данные можно только листать страницами.
В карточке LiveLib я вижу, что это за книга. У себя хочу видеть ещё и экслибрис, надпись на форзаце и имя друга, которому я дал книгу «на недельку» пару лет назад.
Open Library и книга на суахили
Готовые каталогизаторы есть: LibraryThing, Tellico, Inventaire. Сканер штрихкода есть у всех. За описаниями книг они обращаются в Open Library и Google Books.
Я дал Open Library семь своих книг. Она не узнала ни одной.
Для неё «Энергоиздат», 1982 — примерно как для меня книга на суахили. У многих старых книг нет ни штрихкода, ни ISBN. На советских книгах ISBN появился только в конце восьмидесятых.
Так я взялся за свой каталог. Назвал Филином: птица ночная, книжная, и в трее компьютера смотрится солидно.
Издание и экземпляр
Издание — то, что напечатано: автор, переводчик, издательство, год, тираж. Оно одно на всех, у кого стоит этот томик.
Экземпляр — то, что стоит у меня: на какой полке, в каком состоянии, кто брал почитать и вернул ли. Можно пометить «не давать» — Филин переспросит, но запрещать не станет.
Из этого вырос учёт собраний сочинений. Кто собирал «в 30 томах», знает, что один том может занимать две книги. А тома 6 и 7 могут быть под одной обложкой. Филин считает книги на полке и показывает, чего не хватает до полного комплекта.
Ещё у экземпляра есть отметка о личной ценности. Она для книг, которыми я дорожу.

С телефоном к полке
Книги стоят не у компьютера. Заводить их надо там, где они живут: у полки, с книгой в руке. Значит, нужен телефон.
Сначала я хотел читать штрихкод камерой прямо из браузера. Для этого нужно защищённое соединение, а у домашнего сервера его нет. С обходными путями вышло одно шаманство.
Решили писать настоящее приложение для Android. Под Android я не писал никогда, Kotlin не знаю. Тут ИИ отработал лучше всего: поставил инструменты для сборки, написал приложение на Kotlin, собрал и подписал APK.
Приложение показывает те же страницы Филина. Свои у него сканер штрихкода, камера и самообновление.
Ставится приложение с самого Филина. На компьютере открываешь страницу «Телефоны» и сканируешь QR‑код для скачивания APK. Второй QR‑код нужен для привязки телефона. Разрешить или закрыть доступ можно только с компьютера. Чужой телефон в той же сети Wi‑Fi каталога не увидит.
Первой книгой, заведённой с телефона у полки, стала «Первая оборона Севастополя». В карточке были только ISBN и фото обложки.
Теперь я прямо у шкафа навожу телефон на штрихкод. Через секунду вижу «такая уже есть» или карточку новой книги. Во втором случае жму «Найти в РГБ», выбираю запись и нажимаю «Это она». Можно вернуть книгу на полку и взять следующую.
ИИ сам внёс в план офлайн‑очередь сканов. Потом пришлось бы разбирать эту очередь, сверять дубли и исправлять ошибки. У меня дома компьютер и так включён, поэтому очередь из плана убрали.

Где взять описание книги, у которой нет ISBN
Вбивать всё руками — минут десять на книгу. На несколько тысяч — пенсия.
Я устроил источникам экзамен на восьми своих книгах:
FantLab — 3 из 8, только художественные;
alib.ru — нашёл всё, но это магазин, а не каталог;
каталог Российской государственной библиотеки — 7 из 8, включая обе книги без ISBN.
У РГБ поиск закрыт для программ, открыты только страницы конкретных записей.
Ассистент полез разбираться, как поиск устроен изнутри. Посмотрел токены и сессию, прикинул, можно ли выдать программу за браузер, и сам остановился. Сказал примерно так: это обход защиты от ботов, а её поставили ровно для того, чтобы программы туда не ходили. Делать не буду.
Я, честно говоря, удивился. До этого я воспринимал ИИ как очень быстрого исполнителя: сказал — сделал. А тут выяснилось, что у него есть правила, которые не отменяются просьбой хозяина. Чужой сайт закрылся от программ — значит, программа туда не ходит, сколько ни объясняй, что «мне только для себя».
А потом я заметил, что то же правило уже работает в проекте и без него: LiveLib в условиях использования запрещает автоматический доступ — и импорт у нас только из страниц, которые я сохранил руками. alib.ru блокирует частые запросы — и Филин ходит туда по одной книге, по кнопке.
Поиск РГБ я запускаю сам во встроенном браузере. Выбираю книгу в списке, жму «Это она», и Филин забирает из записи авторов, переводчиков, издательство, год, ББК и темы.

Ищу Эмара — Филин находит композитора Малера. Искали по самому длинному слову в имени, а «Густав» у них общий. Теперь ищем по всем словам.
А «Твёрдую руку» Эмара 1982 года мы искали в каталоге РГБ четырьмя способами и так и не нашли, но это достаточно редкий случай когда не находит. Книга стоит у меня на полке.
Отдельная загадка — белый экран вместо РГБ на моём телефоне. На компьютере всё работает, на телефоне — белое поле. Оказалось, в прошивке просто нет корневого сертификата, которым подписан сайт библиотеки. Добавили доверие к этому сертификату только для rsl.ru.
Тусмав Эмар и соавтор по фамилии Рука
С книгами восьмидесятых повезло: штрихкода нет, но ISBN напечатан. Камера телефона читает его прямо с оборота, а контрольная цифра не даёт принять мусор. Нашёлся ISBN — остальное подскажет РГБ.
Книги постарше приходится фотографировать.

Советский титульный лист — произведение искусства. Название красным, автор прописью, виньетки, всадник на коне. Вот титул Эмара: «Густав Эмар. Твёрдая рука. Гамбусино. Москва, Энергоиздат, 1982».
Филин прочитал «Тамбусино». Автором стал «Тусмаb Эмар» (с латинской «b» на конце, для солидности), а соавтором оказалась «Рука». Нарядную прописную «Г» он принял за «Т», слово «Твёрдая» пропустил. Город, издательство и год были набраны обычным шрифтом, их он прочитал без ошибок.
Карточку на обороте у Тарле я сфотографировал вверх ногами — и получил ничего. Первый живой снимок того самого Эмара дал вместо года издания «861»: программа решила по картинке в середине страницы, что лист перевёрнут. Начинали мы с Tesseract. На красных титулах он выдавал ноль. Спорить на ощупь надоело, и я собрал экзамен: настоящие снимки моих книг и правильные ответы — автор, название, издательство, год.
PaddleOCR правильно распознал больше снимков и справился примерно в пять раз быстрее Tesseract. Чтобы оставить один exe без Python, мы подключили ONNX Runtime к программе на Go напрямую через системные вызовы Windows. Модели распознавания весят около 27 МБ, и в программу я их вшивать не стал: Филин сам скачивает их отдельным пакетом из выпуска на GitHub при первом запуске, а пока качает, всё остальное работает.
Если на обороте титула есть каталожная карточка, фотографируйте её. Она набрана обычным шрифтом, и программа читает её почти без ошибок. А нарядный титул пусть остаётся для души.
Что ИИ делал хорошо, а где врал уверенно
Код Филина почти целиком написал ИИ‑ассистент. С Go, Kotlin, SQL и сборкой Android он справлялся быстро. Я решал, что нужно, и проверял результат на своих книгах. Что код сделает с «Оцеолой» 1983 года, видно только на настоящей книге. Слову «готово» я перестал верить после нескольких таких разговоров.
«Удалите книгу и заведите заново», — посоветовал ассистент. Кнопки удаления в программе не было вообще. Он не проверил.
«Браузер этого не позволит», — сказал он про запрос к РГБ. Позволил: сайт библиотеки это явно разрешает. Тоже не проверил.
«Распознавание работает» — проверено на подставном распознавателе. Первое же настоящее фото с телефона дало «861» вместо года.
После этого я требовал проверять распознавание на настоящем снимке с телефона, а ограничения браузера воспроизводить перед тем, как объявлять их непреодолимыми. Ассистент ждёт моего согласия, прежде чем делать предложенное. В основную ветку изменения вливаю я.
По замерам мы отказались от Tesseract и FantLab. Автоматический подбор жанров не выдержал проверки на данных самой РГБ.
49 мегабайт, которые не могли скачаться
Филин — один файл filin.exe, данные лежат рядом с ним. Никаких облаков: книги — это личное.
Обновляется Филин сам: узнаёт о выпуске, спрашивает, качает, сверяет контрольную сумму, делает копию библиотеки — и только потом заменяет себя.
Первое настоящее обновление не встало вообще. Все тесты зелёные, а на медленном канале 49 мегабайт качались дольше, чем программе разрешалось ждать. И каждый раз — с начала. Пришлось учить докачке и выносить тяжёлое из exe. Сейчас он весит 16 МБ.
Библиотека живёт на старом жёстком диске, который уже жалуется на здоровье. Поэтому появилась кнопка «💾 Копия«.»
Что получилось
Каталог для Windows и Android, бесплатный и открытый.
Книгу с ISBN можно добавить с телефона за секунды. Сканируешь код и выбираешь запись в РГБ.
Для книги без ISBN фотографируешь оборот, правишь черновик и сверяешься с РГБ.
Нарядные титулы пока побеждают. Если автор набран крупнее названия, Филин их путает.
В одиночку я бы каталог для отцовской библиотеки не написал.
Если у вас тоже шкафы советских книг
Филин здесь: github.com/aleksandrgradoboev‑svg/filin. Есть инструкция по установке без командной строки.
Windows при первом запуске предупредит, что программа неподписанная: подпись стоит денег, а Филин бесплатный. Нажмите «Подробнее», затем «Выполнить в любом случае».
Если Филин плохо прочитал ваш титул, пришлите фото в issues. Добавлю его в следующий набор для проверки распознавания.
Как вы ведёте учёт домашней библиотеки?

Комментарии 0