Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions alpina.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Alpina ISBN Issues And Next Task

## Context

В этой сессии разбирали два ISBN из книг издательства Альпина / Alpina non-fiction.

### 1. ISBN `9785916717099`

Проблема:
- книга находилась, но без автора
- позже выяснилось, что title тоже был шумный из marketplace-выдачи

Ожидаемые данные:
- `title`: `От 0 до 5: Простые подсказки для умных родителей`
- `author`: `Трейси Катчлоу`

Что уже сделано:
- в `home_library/providers/ddg.py` добавлен разбор автора из DDG snippets
- добавлена очистка шумных title для кейсов `АНФ`, `арт. <isbn>`, возрастных меток, marketplace-префиксов и edition suffix
- добавлены тесты в `tests/test_home_library_providers.py`, включая отдельный тест на эту книгу

Git:
- ветка: `fix/alpina-non-fiction`
- commit: `4d6c613`
- PR: `https://github.com/gman-dev-nov/Home-Library-Telegram-Bot/pull/1`

### 2. ISBN `9785961449136`

Проблема:
- книга не находится вообще
- ожидаемая книга: `Марк Мэнсон - Мужские правила: Отношения, секс, психология`

Ожидаемые данные:
- `title`: `Мужские правила: Отношения, секс, психология`
- `author`: `Марк Мэнсон`

## Reproducer

Текущий репродьюсер для проблемного ISBN `9785961449136`:

```bash
venv/bin/python - <<'PY'
import asyncio
import httpx
from home_library.providers.labirint import fetch_from_labirint
from home_library.providers.piter import fetch_from_piter
from home_library.providers.google_books import fetch_from_google_books
from home_library.providers.ddg import fetch_from_ddg
from home_library.providers.lookup import fetch_book_by_isbn

ISBN = "9785961449136"

async def main():
async with httpx.AsyncClient(timeout=20) as client:
for name, fn in [
("labirint", fetch_from_labirint),
("piter", fetch_from_piter),
("google", fetch_from_google_books),
("ddg", fetch_from_ddg),
]:
try:
book = await fn(ISBN, client)
except Exception as exc:
print(name, "ERROR", type(exc).__name__, exc)
continue
print(name, book)

book = await fetch_book_by_isbn(ISBN)
print("lookup", book)

asyncio.run(main())
PY
```

Наблюдаемое поведение на момент записи:
- `labirint -> None`
- `piter -> None`
- `google -> None`
- `ddg -> None`
- `lookup -> None`

## Extra Investigation Notes

Что проверено по `9785961449136`:

- `Google Books` по ISBN возвращает `totalItems: 0`
- `OpenLibrary` по ISBN возвращает `{}`
- `Labirint` по ISBN не даёт результата
- `Piter` по ISBN возвращает пустой список
- `DuckDuckGo` по чистому ISBN почти пустой и не даёт данных для парсинга

Важная находка:
- если в DDG добавить контекст, например
- `9785961449136 Мужские правила`
- `9785961449136 Марк Мэнсон`
- нужная книга сразу находится

Но это не решает задачу, потому что на вход текущего pipeline приходит только ISBN, а фразы `Мужские правила` или `Марк Мэнсон` бот сам ниоткуда не знает.

Что ещё смотрели:
- `Читай-город` по server-rendered HTML пишет `Поиск по запросу «9785961449136», не принес результатов`
- `site:litres.ru`, `site:alpinabook.ru`, `9785961449136 Альпина` через DDG тоже оказались ненадёжными для автоматического ISBN-only поиска

## Root Problem

Текущая цепочка провайдеров:

- `Labirint`
- `Piter`
- `Google Books`
- `DuckDuckGo` fallback

Для `9785961449136` этого недостаточно.

Проблема не в Telegram formatter и не в выводе карточки.
Проблема в отсутствии провайдера, который умеет стабильно находить эту книгу по одному ISBN.

## What Needs To Be Done

Нужна отдельная задача на реализацию нового провайдера ISBN metadata.

Цель:
- научить `fetch_book_by_isbn("9785961449136")` возвращать книгу
- `title = "Мужские правила: Отношения, секс, психология"`
- `author = "Марк Мэнсон"`

Предпочтительный подход:
1. Найти новый источник, который реально работает по одному ISBN.
2. Добавить новый провайдер в `home_library/providers/`.
3. Подключить его в `home_library/providers/lookup.py` перед `DuckDuckGo` fallback.
4. Покрыть провайдер unit-тестами.
5. Добавить regression-тест на ISBN `9785961449136`.

## Suggested Task For Next Session

Реализовать новый провайдер поиска книги по ISBN для кейсов, которые не покрываются `Labirint`, `Piter`, `Google Books` и текущим `DuckDuckGo` fallback.

Обязательные требования:
- сохранить текущую логику и не ломать уже исправленный кейс `9785916717099`
- добавить regression coverage для `9785961449136`
- не усложнять DDG эвристиками без нового источника, если можно добавить более надёжный провайдер

Definition of done:
- `fetch_book_by_isbn("9785961449136")` возвращает не `None`
- title и author соответствуют ожидаемым значениям
- тесты провайдеров проходят

## Candidate Checks For New Provider

В следующей сессии стоит первым делом проверить:
- есть ли стабильный JSON/API или server-side HTML у `Альпина`
- есть ли пригодный источник у другого магазина, который ищет по ISBN без client-side-only выдачи
- можно ли использовать ещё один открытый книжный каталог вместо расширения DDG
Loading
Loading