BookWorm — инструмент для импорта книг в Open Library — сейчас берёт метаданные только из Amazon и ISBNdb. Это ломается, когда данных нет или они кривые. Особенно страдают книги с одними ISBN-13: импорт проваливается, и в библиотеке остаются мусорные записи вроде «Book 978...». Проблема касается и редких, и международных изданий.
Решение — добавить Google Books как запасной источник. Если Amazon ничего не дал или есть только ISBN-13, BookWorm будет стучаться к Google Books API, дёргать метаданные и сохранять их для импорта. В списке допустимых источников (STAGED_SOURCES) появится "google_books". Запрос к affiliate-серверу: http://{affiliate_server_url}/isbn/{identifier}?high_priority=true&stage_import=true (identifier — ISBN-10, ISBN-13 или ASIN). Когда метаданные дополняют уже существующую запись, новые идентификаторы должны добавляться в source_records, а не перезаписывать старые.
На стороне scripts/affiliate_server.py появляется функция stage_from_google_books. Она пытается получить метаданные по ISBN, и если успешно — добавляет их в соответствующий batch через Batch.add_items. Обработчик запросов на affiliate-сервере будет обращаться к Google Books только для ISBN-13, которые не нашлись в Amazon, и только если в запросе есть параметры high_priority=true и stage_import=true. Если Google Books возвращает больше одного результата для одного ISBN — логируется предупреждение, а данные не сохраняются, чтобы не плодить мусор.
Из ответа Google Books нужно вытащить обязательные поля: isbn_10, isbn_13, title, subtitle, authors, source_records, publishers, publish_date, number_of_pages, description. Формат данных должен совпадать с тем, что ждёт система импорта Open Library. Также в scripts/promise_batch_imports.py обновляется логика: для обогащения неполных записей теперь используется stage_bookworm_metadata вместо старой прямой привязки к Amazon.
Новые публичные интерфейсы: fetch_google_book(isbn) — делает запрос к Google Books API, возвращает сырой JSON или None. process_google_book(google_book_data) — нормализует JSON в формат записи Open Library. stage_from_google_books(isbn) — связка: fetch + process + сохранение в batch, возвращает bool. get_current_batch(name) — получает или создаёт batch (например, "amz" или "google"). BaseLookupWorker — базовый потоковый класс для обработчиков API с методом run(). AmazonLookupWorker — его наследник, который батчит до 10 идентификаторов Amazon и обрабатывает их вместе, соблюдая лимиты API.