feat: download media in bounded domain batches
This commit is contained in:
+2
-2
@@ -7,7 +7,7 @@
|
||||
Подтверждено:
|
||||
|
||||
- [x] пакет восстановления A01–A13 завершён; итог и доказательства собраны в [RECOVERY_FIXES_REPORT.md](RECOVERY_FIXES_REPORT.md);
|
||||
- [x] полный Python suite: **155 passed, 1 skipped**; skip относится к интеграционной проверке PostgreSQL и покрывается Docker-приёмкой;
|
||||
- [x] полный Python suite: **157 passed, 1 skipped**; skip относится к интеграционной проверке PostgreSQL и покрывается Docker-приёмкой;
|
||||
- [x] Astro check: 40 файлов, **0 errors / 0 warnings / 0 hints**; production build проходит;
|
||||
- [x] API после миграции healthy; `apps/api/tests/test_api.py`: **20 passed**;
|
||||
- [x] граф Alembic линеен и имеет единственную голову `0016`; CI применяет её на чистой PostgreSQL, полный production bootstrap запускается отдельным еженедельным drill;
|
||||
@@ -30,7 +30,7 @@
|
||||
- [x] **B08 · Семейства силуэтов рыб.** Три случайных hash-варианта заменены классификатором и отдельными формами `pike`, `salmonid`, `cyprinid`, `perch`, `catfish`, `eel`, `flatfish`, `marine`, плюс честный `generic`. Компонент допускает ручное переопределение family; название остаётся главным идентификатором.
|
||||
- [x] **B09 · Глифы снастей и приманок.** Добавлены SVG-глифы `spinner`, `wobbler`, `soft`, `boilie`, `worm`, `rig`, `unknown` и стабильная палитра по normalized name. Классификация срабатывает только по явным словам; глиф сопровождает текст в activity, лидере, уловах, рекордах и списке лучших приманок, не выдавая категорию за точную модель.
|
||||
- [x] **B10 · Визуальные отпечатки водоёмов.** Для каждого slug воспроизводимо выбираются один из восьми береговых контуров, число волн, положение точки и двухсимвольный индекс. Знак используется в каталоге и detail-hero; это явно абстрактный отпечаток, а не карта или игровая география.
|
||||
- [ ] **B11 · Разрешённый media pipeline — в работе.** Версионированный baseline на 12.09.2026 содержит 19 водоёмов и 252 рыбы; полное число снастей неизвестно и остаётся `null`, а не подменяется числом приманок. Воспроизводимый `media_cli --coverage` считает уникальные нормализованные подписи, а не файлы: 228/252 fish-кандидатов (2 approved), 0/19 waterbody, 149 tackle/bait (12 approved); ещё 10 общих схем approved как reference. Общий audit: 24 approved, 420 queued, 8 invalid, ошибок целостности и бесхозных файлов нет. Визуально подтверждена «Акула гигантская» (`rf4map-fish-1`); официальный reference URL вернул HTML и корректно помечен invalid. Offline `--queue-plan` группирует очередь и cooldown по доменам: после текущего окна осталось 363 кандидата media-хранилища RF4MAP и 57 official reference. Точные названия минимум 24 отсутствующих рыб пока неизвестны, потому что baseline подтверждает число, но не содержит канонический перечень имён; выдавать разность только по двум несогласованным каталогам нельзя. Следующие gaps: получить канонические перечни и устойчивые ID, затем загружать assets с соблюдением общего cooldown и вручную сопоставлять. Официальные `/media/fische/`, `/media/levels/` и `.bait_icon` records исследовать только через публичные контракты без обхода защиты.
|
||||
- [ ] **B11 · Разрешённый media pipeline — в работе.** Версионированный baseline на 12.09.2026 содержит 19 водоёмов и 252 рыбы; полное число снастей неизвестно и остаётся `null`, а не подменяется числом приманок. `media_cli --coverage`: 228/252 fish-кандидатов (2 approved), 0/19 waterbody, 149 tackle/bait (12 approved); ещё 10 общих схем approved как reference. Audit: 24 approved, 420 queued, 8 invalid, ошибок целостности и бесхозных файлов нет. Offline `--queue-plan` группирует очередь и cooldown. По разрешению от 13.09 media-окно увеличено: `--download-batch --batch-limit 40` резервирует домен один раз, загружает до 40 assets и блокирует новый batch на 30 минут; 401/403/429/сетевая ошибка останавливает домен сразу, три последовательных invalid/missing — досрочно. Автоматического approve нет. Точные названия минимум 24 отсутствующих рыб неизвестны без канонического перечня. Следующие gaps: дождаться текущего cooldown, выполнить batch, визуально проверить stored-файлы и получить устойчивые ID для водоёмов/полного каталога снастей.
|
||||
- [x] **B12 · Эмблема сочетания.** Страница «водоём + рыба» получила составной атласный seal: собственный отпечаток водоёма пересекается со смысловым силуэтом рыбы. Так визуальная идентичность сопровождает всю иерархию каталога и не требует внешних изображений.
|
||||
- [x] **B13 · Навигационная леска атласа.** Разрозненные ссылки назад на detail-страницах заменены доступной breadcrumb-цепочкой с мотивом лески и узлов. Страница точки связывает главную, водоём и координаты; сочетание — каталог, водоём и рыбу. Текущий узел всегда подписан текстом и отмечен `aria-current`.
|
||||
- [x] **B14 · Атласные переходы сущностей.** Боковые списки рыб и водоёмов на detail-страницах получили компактные силуэты и отпечатки рядом с полным текстовым названием. Знаки продолжают систему каталога в рабочей навигации, а стрелка явно показывает переход к странице сочетания.
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
- RF4MAP: не чаще одного запроса раз в 30 минут.
|
||||
- RF4 Posts: не чаще одного запроса раз в 30 минут.
|
||||
- все пять разрешённых community-адаптеров включены; scheduler хранит cooldown в PostgreSQL и не запускает источник чаще одного раза в 30 минут;
|
||||
- владелец 12 сентября 2026 года явно разрешил локально собирать изображения рыб, водоёмов и снастей; медиакандидаты сохраняются с source URL и хэшем, не публикуются до проверки соответствия и используют тот же 30-минутный лимит домена;
|
||||
- владелец 12 сентября 2026 года явно разрешил локально собирать изображения рыб, водоёмов и снастей, а 13 сентября увеличил окно до 40 assets; медиакандидаты сохраняются с source URL и хэшем, не публикуются до проверки соответствия. Media CLI резервирует одно batch-окно домена, выполняет в нём не более 40 загрузок и не начинает следующее окно того же домена раньше 30 минут;
|
||||
- при `429`, `403`, изменении DOM или неожиданном типе ответа сбор прекращается без попытки обхода ограничения.
|
||||
|
||||
## Что ещё требуется зафиксировать
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
Fallback строится на собственных лёгких SVG: осмысленные семейства силуэтов рыб, типовые глифы снастей и детерминированные абстрактные отпечатки водоёмов. Текстовое название всегда остаётся основным идентификатором; абстрактный контур водоёма не называется картой, а глиф приманки — изображением конкретной модели.
|
||||
|
||||
С 12 сентября 2026 года разрешён локальный сбор медиаресурсов. `python -m rf4_research.media_cli URL` делает один учтённый HTML-запрос и добавляет кандидатов в `data/media/manifest.json`; `--download-one` сохраняет ровно один ожидающий asset по SHA-256 в `data/media/files/`. Оба режима используют общий cooldown площадки. Перед записью проверяются raster-формат, совпадение MIME и предел 40 Мп; manifest получает размеры, объём и время загрузки. Постоянные 404/410, запрет доступа и невалидный файл получают отдельные статусы и не запирают начало очереди. Статус `queued` или `stored` не означает соответствие сущности или разрешение на публичный вывод. Ручная команда с `--review-url`, `--decision`, `--entity-type` и `--entity-key` переводит сохранённый файл в `approved`; неподходящий материал явно получает `rejected`.
|
||||
С 12 сентября 2026 года разрешён локальный сбор медиаресурсов; 13 сентября размер одного окна увеличен до 40 assets на домен. `python -m rf4_research.media_cli URL` делает один учтённый HTML-запрос и добавляет кандидатов в `data/media/manifest.json`; `--download-one` сохраняет один asset, а `--download-batch --batch-limit 40` — до 40 на домен под одной резервацией окна. Следующий batch домена возможен через 30 минут. При 401/403/429 или сетевой ошибке домен останавливается сразу, при трёх последовательных invalid/missing — досрочно; каждый результат сохраняется в manifest. Перед записью проверяются raster-формат, совпадение MIME и предел 40 Мп. Статус `queued` или `stored` не означает соответствие сущности или разрешение на публичный вывод. Ручная команда с `--review-url`, `--decision`, `--entity-type` и `--entity-key` переводит сохранённый файл в `approved`; неподходящий материал явно получает `rejected`.
|
||||
|
||||
`python -m rf4_research.media_cli --audit` не использует сеть: команда выводит сводку статусов и завершается с ошибкой при отсутствующем/изменённом файле, несовпадении SHA-256 или dimensions/MIME, некорректном approved-сопоставлении и наличии бесхозного файла.
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
|---|---|---|---|---|---|---|
|
||||
| RF4DB | уловы, справочники, разрешённые изображения | название + ссылка на исходную запись/страницу | не чаще 1 запроса на площадку за 30 минут, ошибки учитываются | нормализованные данные; raw по retention policy | отключить источник, скрыть публикации, очистить raw и согласованные данные по запросу | **требуется приложить** |
|
||||
| RF4-STAT | уловы и посты | название + ссылка на запись | не чаще 1 запроса на площадку за 30 минут, общий для endpoint | то же | то же | **требуется приложить** |
|
||||
| RF4MAP | точки и разрешённые media-кандидаты | название + ссылка на страницу | не чаще 1 запроса на площадку за 30 минут, включая media/CDN | media только локально по hash; публикация после review | удалить mapping и локальный оригинал, затем записи источника | **требуется приложить** |
|
||||
| RF4MAP | точки и разрешённые media-кандидаты | название + ссылка на страницу | данные: 1 запрос/30 мин; media: до 40 assets в одном зарезервированном окне, следующее окно через 30 мин | media только локально по hash; публикация после review | удалить mapping и локальный оригинал, затем записи источника | **требуется приложить** |
|
||||
| RF4 Posts | точки | название + ссылка на запись | не чаще 1 запроса на площадку за 30 минут | нормализованные данные; raw по retention policy | отключить и удалить по source system | **требуется приложить** |
|
||||
| Официальный RF4 | рекорды и отдельно проверенные справочные изображения | «Официальный сайт RF4» + ссылка | не чаще 1 запроса на домен за 30 минут | по общей retention policy; media в карантине до review | скрыть/удалить mapping и данные конкретного источника | **уточнить основание для media-публикации** |
|
||||
| Официальный RF4 | рекорды и отдельно проверенные справочные изображения | «Официальный сайт RF4» + ссылка | данные: 1 запрос/30 мин; media: до 40 assets в одном зарезервированном окне, следующее окно через 30 мин | по общей retention policy; media в карантине до review | скрыть/удалить mapping и данные конкретного источника | **уточнить основание для media-публикации** |
|
||||
|
||||
## Требования к подтверждению
|
||||
|
||||
|
||||
Reference in New Issue
Block a user