Skip to content

refactor(lookup): перевести Google Books на isbnlib + добавить Open Library - #9

Open
gman-dev-nov wants to merge 10 commits into
developfrom
refactor/lookup-isbnlib-foundation
Open

refactor(lookup): перевести Google Books на isbnlib + добавить Open Library#9
gman-dev-nov wants to merge 10 commits into
developfrom
refactor/lookup-isbnlib-foundation

Conversation

@gman-dev-nov

Copy link
Copy Markdown
Owner

Summary

  • Самописный клиент Google Books → тонкая обёртка над isbnlib.meta(isbn, "goob").
  • Новый провайдер Open Library через isbnlib.meta(isbn, "openl").
  • isbnlib синхронный → обёрнут в asyncio.to_thread (есть отдельный тест что вызов уходит в другой thread).
  • Pydantic-модели Google Books удалены вместе с тестом alias-ов.

fix(deps): pin setuptools<81

Найдено бенчмарком: на Python 3.14 + setuptools 82+ isbnlib падал с ModuleNotFoundError: No module named 'pkg_resources' ещё до сетевого вызова. isbnlib 3.10.x использует pkg_resources.iter_entry_points, выпиленный в setuptools 81+. До миграции isbnlib на importlib.metadata держим setuptools<81.

Test plan

  • 5 тестов TestFetchFromGoogleBooks (success, empty, no_title, ISBN exception, runs_in_thread)
  • 3 теста TestFetchFromOpenLibrary (success, empty, exception)
  • Интеграционный тест порядка в lookup chain
  • Полный прогон: 182 passed

🤖 Generated with Claude Code

Уточнил обработку и выбор результатов DDG для книг Alpina, чтобы бот стабильнее восстанавливал корректные название, автора и другие метаданные в сценариях, где прежний fallback часто возвращал неполные или неточные данные.

Коммит собирает исходное улучшение и последующий lint-fix в один логический bugfix, чтобы история ветки отражала единственную пользовательскую проблему: слабое извлечение метаданных Alpina через DDG.
Добавил дополнительный путь поиска книги через Yandex и Playwright для ISBN, которые не находятся в основных источниках. Это закрывает сценарии, где обычный lookup возвращает пустой результат, хотя книга существует в открытых каталогах или поисковой выдаче.

Если автоматический поиск не находит книгу, бот теперь просит у пользователя короткую текстовую подсказку и повторяет поиск с контекстом. Такой flow снижает число тупиковых добавлений, делает поведение бота понятнее и помогает восстановить метаданные без ручного заполнения всей карточки.
Добавил полноценный экран проверки OCR-черновика после сканирования обложки и титульного листа. Пользователь может уточнить ISBN, автора и название до сохранения, а бот показывает промежуточную карточку книги вместо немедленного перехода к сохранению или поиску.

Это уменьшает число ошибок после OCR, делает сценарий добавления книги управляемым и готовит данные к дальнейшему обогащению метаданными только после того, как пользователь подтвердил базовые поля.
…авок

Разделил подтверждение OCR-черновика на два осознанных действия: мгновенное добавление книги по подтвержденным данным и отдельный поиск внешних метаданных. Это ускоряет быстрый сценарий добавления и убирает лишние внешние запросы, когда OCR уже дал достаточно точный результат.

Также добавил повторный lookup из preview перед сохранением книги. Данные провайдера теперь только дополняют карточку и не перетирают вручную подтвержденные ISBN, автора и название, поэтому пользователь не теряет свои исправления после OCR.
Добавил в MEMORY.md рабочие договоренности по разнесению больших наборов изменений на тематические ветки, атомарности коммитов и формату commit message. Это нужно, чтобы новые правила не остались только в обсуждении и использовались как постоянная часть проектной памяти.

Отдельно зафиксировал ожидание к body коммита и PR: человеческое объяснение того, что изменилось, какую проблему это решает и зачем выбран именно такой способ реализации.
Усилил общий парсер поисковой выдачи и Yandex fallback для кейсов, где книга видна человеку в поиске, но бот теряет автора или возвращает усеченное название. Добавлен разбор формата 'Автор: Название', более аккуратный выбор полного title вместо обрезанных вариантов и добор метаданных с верхних внешних страниц выдачи.

Это нужно для проблемных ISBN вроде 9785002143382, где поисковик уже показывает релевантную книгу, но прежние эвристики отдавали неполные или шумные данные. В коммит также входят регрессионные тесты и отладочный Playwright-скрипт для живой проверки Yandex path.
Добавил новый Playwright fallback по книжным сайтам для ISBN, которые не удается стабильно добрать через каталоги и поисковики. Новый слой идет напрямую в LiveLib, MyBook и Labirint, пытается вытащить структурированные title, author и ссылку на карточку книги, а затем подключается в lookup-цепочку до DuckDuckGo.

Это нужно как последний шанс для кейсов, где книга существует на книжных сайтах и находится человеком вручную, но обычные провайдеры не возвращают понятный результат. Для текущих проблемных ISBN живой прогон уже дает корректную карточку через MyBook или Labirint, а в тестах зафиксирован порядок fallback и разбор HTML этих сайтов.
Файл .bot.pid — это рантайм-артефакт скрипта запуска бота
(хранит PID процесса для останова). Он постоянно мелькает в
git status и не должен попадать в индекс.
…ibrary

Самописный клиент Google Books заменён на тонкую обёртку над
isbnlib.meta(isbn, "goob"). Это убирает Pydantic-модели
GoogleBooksResponse/Item/VolumeInfo, регексы и ручную обработку
errors HTTP — isbnlib решает это сам, и заодно открывает дверь
будущим плагинам isbnlib-* (BnF, LoC, DnB).

Заодно добавлен новый провайдер Open Library через
isbnlib.meta(isbn, "openl") — он встаёт в основную гонку после
Google Books и часто закрывает дыры там, где Google пуст по
англоязычным ISBN.

isbnlib синхронный — обёрнут в asyncio.to_thread. ``client:
httpx.AsyncClient`` оставлен в сигнатурах ради совместимости с
другими провайдерами, но фактически не используется.

Удалены тесты, проверявшие ручной httpx-парсинг JSON Google
Books, плюс тест ``test_google_books_response_aliases`` —
модели больше не существуют.

Реализация по TDD: 5 новых тестов на isbnlib-обёртку Google Books
(включая проверку, что вызов уходит в отдельный thread) + 3
теста на Open Library + интеграционный тест порядка в lookup
chain.
isbnlib 3.10.x импортит iter_entry_points из pkg_resources, который
setuptools 81+ выпилили. На Python 3.14 + setuptools 82 любой вызов
isbnlib.meta() падал с ModuleNotFoundError ещё до сетевого запроса —
найдено при бенчмарке провайдеров.

До миграции isbnlib на importlib.metadata держим setuptools<81.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant