AGENTS.md: variant B slim-down + sec07 file-count fixes (20 files, 88 MB)
- Goal: running-log → компактная таблица status 01–07 + next (история в git/SUMMARY) - Conventions: one-shot migration-история → по строке (скрипты помечены done) - EN sweep: удалены Result-блоки sec01/sec05 (в git/MANIFEST), метод сохранён; 'Table 3' → 'at a glance' - Content audit: лог находок sec01-06 → операционные правила триажа (4) - Lessons: lesson 3/8/9 сжаты (dubль precheck-логики убран), queue-паттерн сохранён - Download conventions: 'gitignored' → 'в git LFS' (устаревшая строка) - Jung CW special case: + АСТ Неоклассик-серия (CW3 2025, CW2 нет, калка-ловушка) - FIX: sec07 = 20 файлов (88 MB), не 21 (CW3-1960 ia double-counted); SUMMARY/MANIFEST синхронизированы
This commit is contained in:
parent
2400201ebf
commit
8bcd745039
3 changed files with 77 additions and 109 deletions
172
AGENTS.md
172
AGENTS.md
|
|
@ -6,26 +6,20 @@ For every book in the ISAP Zurich reading list (https://isapzurich.com/en/librar
|
|||
find the **Russian edition(s)**: correct Russian title, publisher, year, translator, ISBN,
|
||||
libgen download page (if exists), and РГБ (RSL) bibliographic record (if exists).
|
||||
|
||||
We work **section by section**. Sections **01–05 are COMPLETE** (01: 38✅/2🔶/15❌; 02: 23✅/5🔶/29❌;
|
||||
03: 38✅/30❌; 04: 12✅/1🔶/26❌; **05: 17✅/12❌**). Section 05: research + RU downloads
|
||||
2026-09-22 (7 rescues from user tips — see Lessons), **EN downloads COMPLETE 2026-09-23**
|
||||
(30 files, 362 MB; 5 EN gaps unavailable + 2 ia-restricted; SUMMARY.md at-a-glance table done).
|
||||
Section 06: research + user oracle DONE 2026-09-24 (28 карточек: **19 ✅ / 1 🔶 / 8 ❌**;
|
||||
7 rescues; каталог Касталии 1285 в data/catalogs + rule в gate v3); **downloads FINAL
|
||||
2026-09-25** (34 файла, 608 MB: RU 12 + EN 21 + DE 1 бонус; 6 кросс-рефов на sec01-03;
|
||||
EN: 9 с ia open-uploads + 12 с libgen после находки key-vs-f_id — rescues 09-t1, 13, 14, 17, 19, 20, 23;
|
||||
RU платные castalia-PDF не скачивались; sec03#20 RU-дыра пометка в MANIFEST). **2026-09-25:
|
||||
wiki-anchor audit (1 wrong QID fixed), cross-section FILE dedup (17 md5-дублей удалено,
|
||||
файл = только в первой секции), `data/MASTER-LIST.md` + `tools/xref.py` (все 12 секций,
|
||||
каждая книга ищется один раз), RAW 07–12 скачан (sections/07/RAW.md + data/isap-raw/).**
|
||||
Section 07 **COMPLETE 2026-09-26** (27 items: **4 ✅ / 0 🔶 / 23 ❌** RU; 20 EN files, 87 MB.
|
||||
Rescue wave: CW3-РУ «Психогенез душевных болезней» АСТ 2025 (flibusta.**su** b/390112 — .su ≠ .is!)
|
||||
+ 7 EN rescues via file-level libgen (objects[]=f, подсказки пользователя): CW2×2, CW3×2, Bovensiepen,
|
||||
Krieger JAP 2019, Meier I JAP 2019 — статьи контент-верифицированы (не рецензии). Новый tool
|
||||
`tools/doi.py` (Crossref→DOI→libgen) для article-items; 09 Hill pre-DOI не ищется). 08–12 scope
|
||||
decision pending
|
||||
(RAW в data/isap-raw/, MASTER-LIST уже просчитал: 08=47 NEW/5 xref, 09=25/12, 10=38/4,
|
||||
11=9/14, 12=35/5).
|
||||
We work **section by section**. Status (детали — в SUMMARY.md/MANIFEST.md секции + git log):
|
||||
|
||||
| sec | name | items | RU ✅/🔶/❌ | files (EN+RU) | state |
|
||||
|-----|------|-------|-----------|----------|-------|
|
||||
| 01 | fundamentals | 55 | 38/2/15 | 113 | FINAL 2026-09-25 |
|
||||
| 02 | dreams | 57 | 23/5/29 | 37 | FINAL 2026-09-25 |
|
||||
| 03 | myths & fairy tales | 68 | 38/0/30 | 129 | FINAL 2026-09-25 |
|
||||
| 04 | pictures | 39 | 12/1/26 | 28 | FINAL 2026-09-25 |
|
||||
| 05 | ethnology | 29 | 17/0/12 | 38 | FINAL 2026-09-25 |
|
||||
| 06 | religion | 28 | 19/1/8 | 38 | FINAL 2026-09-25 |
|
||||
| 07 | complexes | 27 | 4/0/23 | 20 (EN only) | FINAL 2026-09-26 |
|
||||
|
||||
**Next:** scope decision for sections 08–12 (RAW в data/isap-raw/; MASTER-LIST просчитал:
|
||||
08=47 NEW/5 xref, 09=25/12, 10=38/4, 11=9/14, 12=35/5).
|
||||
|
||||
## Repository layout
|
||||
|
||||
|
|
@ -98,16 +92,12 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
|
|||
(f) EN-каталогами: полные записи не ведутся (WorldCat мёртв) — строка `EN refs` по данным
|
||||
isbnval/OL/ia; (g) ✅-карточка: РГБ обязателен + ≥1 второй каталог если sweep его трогал;
|
||||
(h) старое поле Status-формулировок: единая «маркер + одна фраза».
|
||||
**Migration DONE 2026-09-21** (219/219 cards, `tools/migrate_cards_v3.py`, linter
|
||||
`tools/check-md.py` = 0 issues; Downloads tables rebuilt from MANIFESTs; sec04 #22 = ES section).
|
||||
New cards (sec05+) start on v3.
|
||||
- **SECTION FILES UNIFICATION DONE 2026-09-21** (order: MANIFEST → INDEX → MISSING → SUMMARY →
|
||||
dossiers; scripts: `tools/migrate_manifests.py`, `migrate_indexes.py`, `make_authors_table.py`,
|
||||
`restructure_summary.py`, `migrate_dossiers.py`). Findings baked in: sec01 +4 missing EN files
|
||||
(ia byte-verified), sec04 Red Book +4 files, libgen f_ids recovered from queue logs,
|
||||
136 card DL sources normalized, MISSING anchors = card gate refs (17+34+30+27), living authors
|
||||
keep open-ended dates `[1951-]`.
|
||||
- **Section file CANONS v1 (agreed 2026-09-21, migration in order: MANIFEST → INDEX → MISSING → SUMMARY → dossiers):**
|
||||
Все карточки мигрированы на v3 (2026-09-21, one-shot `tools/migrate_cards_v3.py`);
|
||||
linter `tools/check-md.py` = 0 issues. New cards start on v3.
|
||||
- **Section files unified 2026-09-21** (CANONs ниже; one-shot скрипты `tools/migrate_*.py`,
|
||||
`make_authors_table.py`, `restructure_summary.py` — done, не для повторного запуска).
|
||||
Living authors keep open-ended dates `[1951-]`.
|
||||
- **Section file CANONS v1 (agreed 2026-09-21):**
|
||||
**SUMMARY.md:** H1 `# Section NN — <Name>: summary (<date>)` → `## Final counts` (одна строка:
|
||||
статусы + файлы) → `## Publication status at a glance` (ОБЯЗАТЕЛЬНЫЙ, колонки `# | EN book | EN ISBN
|
||||
| RU book | RU ISBN | DL EN | DL RU` + totals-строка + legend ✅/⚠/❌) → `## Authors — EN → RU`
|
||||
|
|
@ -510,10 +500,9 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
|
|||
Reality*), «Модели культуры» (not «Узоры/Образцы культуры»), «Потерянный мир Калахари» (the
|
||||
«Затерянный» variant is a DIFFERENT book — Bjerrre). Always probe 2–3 RU title variants;
|
||||
for authors with FR/DE originals (Eliade, van Gennep) also try the FR/DE-based RU title.
|
||||
3. **rutitles diff was SKIPPED for sec05 and would have caught 3/7 rescues** («Аспекты мифа»,
|
||||
«Культурный комплекс», «На пороге инициации» were all in data/ru-titles.jsonl from the cogito
|
||||
crawl). **Mandatory: `tools/rutitles.py both "<EN title>"` for every item before ❌** (added to
|
||||
the negatives gate below).
|
||||
3. **rutitles diff MANDATORY before ❌:** sec05 пропустил его и потерял бы 3/7 rescues
|
||||
(все были в data/ru-titles.jsonl). `tools/rutitles.py both "<EN title>"` по каждому item
|
||||
(в negatives gate ниже).
|
||||
4. **flib authorall for prolific RU authors** (Элиаде a/2943 = 49 books) caught «Тайные общества»
|
||||
(sec05 #13) that libgen title search missed. Always run flib author sweep for authors with
|
||||
>5 RU books.
|
||||
|
|
@ -527,65 +516,47 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
|
|||
`static.flibusta.is` URL.
|
||||
(b) **KEY vs f_id (системная ловушка, наш баг, не libgen):** в JSON-карточке издания
|
||||
`files` = `{public_key: {f_id: X, md5: Y}}` — КЕЙ и f_id-ЗНАЧЕНИЕ = РАЗНЫЕ файловые записи.
|
||||
`object=f&ids=<key>` возвращает устаревший/чужой файл (Solomon: key 92709688 = 20MB рус. антология;
|
||||
f_id 93253044 = настоящая 2MB-книга). Утром 2026-09-25 «24 mislinked EN» = качали по key;
|
||||
скачав по f_id-значениям — rescues 06-й секции: 09-t1, 13, 14, 17, 19, 20, 23 + бэкапы.
|
||||
**Правило: качать и пречекать ТОЛЬКО по f_id-значению из files-мапы (md5 для контроля).**
|
||||
Файл-уровневый поиск (`objects[]=f` в lg.py) находит файлы, не привязанные к «нашему» изданию
|
||||
(так найден md5 Solomon, когда editions-поиск его не показывал).
|
||||
`object=f&ids=<key>` возвращает устаревший/чужой файл (Solomon: key 92709688 = 20MB рус.
|
||||
антология; f_id 93253044 = настоящая 2MB-книга).
|
||||
**Правило: качать и пречекать ТОЛЬКО по f_id-значению из files-мапы (md5 для контроля)** —
|
||||
утренний «24 mislinked EN» 2026-09-25 = качали по key; по f_id — rescues sec06.
|
||||
Файл-уровневый поиск (`objects[]=f` в lg.py) находит файлы, не привязанные к «нашему» изданию.
|
||||
6. **Collection-inclusion questions** (#27/#28): download the smallest fb2, parse the TOC
|
||||
(`<section name="title">`), grep for the EN book title + RU calque. «Символ и ритуал» (Наука
|
||||
1983) CONTAINS «Ритуальный процесс» (full text, core section) but NOT «Лес символов»
|
||||
(citations only).
|
||||
7. **flib pdf download**: `/b/<id>/pdf` may return an HTML stub; `/b/<id>/download` → 302 →
|
||||
direct `static.flibusta.is:443/b.usr/<File>.<ext>` URL — curl that directly.
|
||||
8. **Content-verify gate (2026-09-22, после sec05 mislinked batch; precheck дообучен 2026-09-25):**
|
||||
every downloaded file gets a two-second check — magic bytes + `pdfinfo` pages + first-page/head
|
||||
text containing the expected RU title/author. A file that fails is discarded and re-sourced
|
||||
(usually flib). **Pre-download gate: `tools/lgdl.py precheck <f_id> <edition_id> [pages]`**
|
||||
(exit 0 OK / 1 SUSPECT / 2 BAD). Логика (2026-09-25): (1) reverse-map file-записи: значения
|
||||
= PUBLIC edition ids — совпадение с целью = сильный OK-сигнал (для записи настоящего f_id);
|
||||
(2) locator: ≥2 общих слова с целью = OK; слова есть, но 0 общих = BAD (именует другую книгу);
|
||||
хэш/ISBN/пустой locator = без сигнала (SUSPECT) — digit-содержащие runs маскируются до
|
||||
токенизации (иначе hex даёт фейк-токены вроде «aaae»). Контент-верификация после даунлоуда —
|
||||
всегда конечный гейт. Mislink = skip → next f_id of same edition → next edition → flib;
|
||||
отклонённые f_id логируются в MANIFEST notes. `dl <f_id> <dir> <name> <edition_id>` запускает
|
||||
precheck автоматически.
|
||||
9. **EN-queue infra (2026-09-23, sec05 EN sweep)**: the libgen bottleneck is (a) `ads.php`
|
||||
card-page IP-throttling under sustained load — pause 30–60 min, do NOT hammer (deepens the
|
||||
block); (b) wedged CDN edges — each `get.php` 302s to a different storage host, so
|
||||
`lgdl.py` now speed-probes (6 s range fetch) and re-draws the link on slow edges. Queue
|
||||
pattern that survived the day: `queue.sh` = per-file `[ -f out ] && skip || timeout 1500
|
||||
python3 -u lgdl.py dl ... >> "$LOG" 2>&1` + a **watchdog** bash loop (restart the queue if it
|
||||
dies without a DONE marker — skip-existing makes restarts safe). Traps hit: python stdout
|
||||
block-buffers to a file (use `-u` or logs look dead); generated-script typos (`>> LOG` vs
|
||||
`>> $LOG`) — always `bash -n` a generated queue; killing a worker does NOT kill the parent
|
||||
queue bash (dual-queue downloads corrupt the cookie jar). AA (annas-archive.gl) = 403 bot-wall
|
||||
for anon downloads from this box; i2p not worth the router setup.
|
||||
8. **Content-verify gate (MANDATORY):** после КАЖДОГО даунлоуда — magic bytes + `pdfinfo` pages
|
||||
+ first-page/head text = ожидаемый title/author; для статей — автор+журнал+страницы = RAW и
|
||||
это статья, НЕ рецензия. Прошёл = discard + re-source (flib/lg другой ed). **Pre-download:
|
||||
`tools/lgdl.py precheck <f_id> <edition_id>`** (0 OK / 1 SUSPECT / 2 BAD; `dl … <edition_id>`
|
||||
запускает precheck автоматически). Mislink = next f_id → next edition → flib; отклонённые
|
||||
f_id в MANIFEST notes. (Логика precheck v2: reverse-map + locator, см. докстринг скрипта.)
|
||||
9. **EN-queue infra (переиспользуемый паттерн):** `queue.sh` = per-file
|
||||
`[ -f out ] && skip || timeout 1500 python3 -u lgdl.py dl ... >> "$LOG" 2>&1` + **watchdog**
|
||||
(рестарт если очередь умерла без DONE-маркера; skip-existing делает рестарт безопасным) +
|
||||
`setsid nohup`. Ловушки: (a) `bash -n` на сгенерированный скрипт ОБЯЗАТЕЛЕН (one-liner
|
||||
`dl() { … }` без `;` перед `}` = тихая смерть);
|
||||
(b) python stdout блок-буферизуется в файл — всегда `-u`;
|
||||
(c) `ads.php` throttle под sustained load — пауза 30–60 мин, НЕ долбить;
|
||||
(d) NEVER `pkill -f lgdl.py` (убьёт и саму очередь) — kill worker по comm;
|
||||
(e) dual-queue corrupt cookie jar. AA (annas-archive.gl) = 403 anon отсюда; i2p not worth it.
|
||||
|
||||
## Content audit (2026-09-25) — what the full-file vs item-title sweep found
|
||||
## Content audit (method; ran on sec01–07, 2026-09-25/26)
|
||||
|
||||
Tool: `tools/audit_content.py <sec>...` (samples first/mid pages of every file, scores title
|
||||
overlap, flags SUSPECT/SMALL/NO-TEXT/NO-CYR). Ran on all sections 01–06 (sec05: fix the
|
||||
per-item header parse first — sec05 uses «— ✅» not «— N files»). Findings (commits
|
||||
`85c41ac` + follow-ups):
|
||||
1. **Mislinked whole files caught:** sec01 #29 RU fb2 = fantasy novel; sec01 #47 two review
|
||||
clippings (1950 «About Books»); sec03 #11 `-b` epub = Spanish von Franz (Paidós 1983) with
|
||||
forged EN OPF title; sec03 #42 «КАРО 2012» = English reader (Irish Tales), not the listed
|
||||
book and not a RU translation; sec02 #16 bosnak .txt = double-encoded mojibake (replaced by
|
||||
clean flib fb2 b/844509).
|
||||
2. **Foreign OCR layer (file OK, text layer wrong):** sec06 #28 ia Zimmer = all-Devanagari OCR
|
||||
(Lal Bahadur Shastri Academy stamp); images verified = RKP «Philosophies of India» (p.100
|
||||
«PART II Philosophies of Time»). Keep; the twin lg file is the clean copy.
|
||||
3. **Previews/fragments labeled as editions:** sec03 #56 Onians b/c/d/e = Cambridge 24–87 KB
|
||||
chapter previews (marked ПРЕВЬЮ in MANIFEST); sec01 #12 was a 23-pp PagePlace preview (→ full).
|
||||
4. **False positives to expect:** windows-1251/UTF-16/KOI8 fb2/txt (decoding, not corruption),
|
||||
image scans without OCR (NO-TEXT/NO-CYR — verify by rendering pages: pdftoppm/ddjvu +
|
||||
imagemagick), spaced-out OCR titles («T H C T F»), library stamps (Cornell/India/Claremont),
|
||||
VeryPDF watermark pages (sec04 #30 buksmart — watermark + FR part, legit 2020 ed.).
|
||||
5. **Bonus rule in practice:** different-but-related books stay as bonus files with
|
||||
`Бонус: ДРУГАЯ книга (...)` note, status unchanged; rename file to drop the false lang/year
|
||||
label. Same for wrong-year filename (sec06 #18 «1981» → 1989, Perera had two «Descent…» books).
|
||||
overlap, flags SUSPECT/SMALL/NO-TEXT/NO-CYR). Run at section end. Триажа флагов:
|
||||
1. **Mislinked file** (файл = другая книга/рецензия/фрагмент) → удалить, re-source (flib/lg),
|
||||
записать в MANIFEST Notes. Превью/фрагменты (2–14 pp, chapter previews) = не издание.
|
||||
2. **Foreign OCR layer** (файл OK, текстовый слой на чужом языке/мусор) → keep + пометка,
|
||||
чистая twin-копия в приоритете.
|
||||
3. **False positives (не чинить):** windows-1251/UTF-16/KOI8 fb2/txt (декодирование, не
|
||||
порча), image-сканы без OCR (проверить рендером: pdftoppm/ddjvu), spaced-out OCR titles
|
||||
(«T H C T F»), library stamps, VeryPDF-водяные знаки.
|
||||
4. **Bonus rule:** related-but-different книга = bonus-файл с пометкой `Бонус: ДРУГАЯ книга
|
||||
(...)`, status не менять; переименовать файл, если false lang/year в имени.
|
||||
5. Контент-верификация после КАЖДОГО даунлоуда — см. Lessons (gate).
|
||||
|
||||
## Catalog caching convention
|
||||
|
||||
|
|
@ -736,8 +707,11 @@ Before downloading from libgen: verify file locator/title (mislinked-file trap).
|
|||
|
||||
Special cases:
|
||||
- **Jung's CW volumes:** translated and widely available — don't deep-search; note the RU
|
||||
volume for the item (CW15 = «Дух в человеке, искусстве и литературе», Харвест 2003;
|
||||
Red Book = «Красная книга (Liber Novus)», Касталия 2025, trans. О. Комков).
|
||||
volume for the item. Факты: АСТ сер. «Философия – Neoclassic» публикует CW последовательно
|
||||
(CW3 = «Психогенез душевных болезней» 2025, пер. Чечина, 978-5-17-139315-1; CW2 пока нет —
|
||||
ре-проб). CW15 = «Дух в человеке, искусстве и литературе» (Харвест 2003); Red Book =
|
||||
«Красная книга (Liber Novus)» (Касталия 2025, пер. О. Комков). Калка-ловушка: «Психогенез
|
||||
**душевных**» ≠ «…психических».
|
||||
- **Essays/chapters** (e.g. Jaffé in *Man and his Symbols*): mark 🔶 if only the parent
|
||||
book/anthology is available in RU.
|
||||
|
||||
|
|
@ -746,13 +720,13 @@ Special cases:
|
|||
- ~4s between libgen requests, ~3s between RSL pages, ~2s between shop requests.
|
||||
- All tools cache nothing by default; reruns are fine but avoid duplicate queries in a batch.
|
||||
|
||||
## EN original sweep (soft libgen queries) — validated 2026-09-20 (sec01: +50 files)
|
||||
## EN original sweep (soft libgen queries) — method (validated 2026-09-20, reused sec05/06/07)
|
||||
|
||||
Exact full-title libgen queries miss a lot (indexed titles vary: reprints, e-books, variants).
|
||||
The validated approach for closing the EN download gap of a section:
|
||||
|
||||
1. **Build the gap list** from `downloads/0N-*/MANIFEST.md` («EN full text unavailable /
|
||||
not present» block) + SUMMARY Table 3 DL EN column (rows with «— (restricted)» / «—»).
|
||||
1. **Build the gap list** from `downloads/0N-*/MANIFEST.md` («Not downloadable» block) +
|
||||
SUMMARY «at a glance» DL EN column (rows with «— (restricted)» / «—»).
|
||||
2. **Soft libgen queries, 2–3 rounds** (author-centric, not title-guessing):
|
||||
- round 1: `<author surname> <1–2 distinctive title words>`;
|
||||
- round 2 (0-hit items): `<author surname>` alone, filter results by title/first name;
|
||||
|
|
@ -777,16 +751,9 @@ The validated approach for closing the EN download gap of a section:
|
|||
7. **archive.org (ia) as complement** for trade-restricted items: `tools/ia.py search "…"` →
|
||||
open items only (`RESTRICTED` = borrow-only). Jung CW: single open item `CarlJungCollectedWorks`
|
||||
(vols 1–18 + seminars, PDF+EPUB, direct `/download/<item>/<file>`).
|
||||
8. **Docs to update after:** SUMMARY Table 3 DL EN + totals row, MANIFEST (EN section with lg f_id /
|
||||
ia item per file; «not downloadable» list), per-card line «EN downloaded (date): <source> — <edition>»
|
||||
(or «EN full text: NOT FOUND (date, 3 rounds)» for the true gaps), CONTEXT.md note. One commit per section.
|
||||
|
||||
Result sec01: 50 files from 58 missing (8 genuinely absent: 13, 16, 38, 42, 48, 50, 52, 54 +
|
||||
643 MB 24a replaced by 1991 twin).
|
||||
Result sec05 (2026-09-23): 30 files from 31 candidates (08b 37-pp fragment discarded); 5 truly
|
||||
unavailable (04 Chiron 1993, 05 1981, 15 SUNY 1997, 16 SUNY 1997, 23 Southern Book 1988) + 2
|
||||
ia-restricted (03, 14). Queue infra: watchdog + speed-probe + `timeout 1500` per file +
|
||||
unbuffered logs; ads.php throttle → pause, don't hammer.
|
||||
8. **Docs to update after:** SUMMARY at-a-glance DL EN + totals row, MANIFEST (per-item rows with
|
||||
lg f_id / ia item; «Not downloadable»), per-card Downloads table + Notes line.
|
||||
One commit per section. (Результаты прошлых секций — в их MANIFEST/Summary + git log.)
|
||||
|
||||
## Dedup rules (user, 2026-09-25) — КАЖДАЯ КНИГА ИЩЕТСЯ/СКАЧИВАЕТСЯ ОДИН РАЗ
|
||||
|
||||
|
|
@ -798,8 +765,8 @@ unbuffered logs; ads.php throttle → pause, don't hammer.
|
|||
манифестов (см. правило ниже). RAW новой секции кладётся в sections/0N/RAW.md (или
|
||||
data/isap-raw/), xref.py подхватывает автоматически. Скрипт локальный, ~1 c.
|
||||
- **File level:** файл хранится ТОЛЬКО в первой секции, где книга появилась; поздние секции —
|
||||
cross-ref «secNN: <file>» в MANIFEST/карточке. 2026-09-25: 17 md5-дублей удалено
|
||||
(`tools/dedup_files.py`), в каждом MANIFEST — датированная Notes-строка.
|
||||
cross-ref «secNN: <file>» в MANIFEST/карточке. (2026-09-25: 17 md5-дублей удалено
|
||||
`tools/dedup_files.py`.)
|
||||
- **Профилактика дублей:** перед скачиванием в новой секции — md5-scan downloads/ по книге
|
||||
(или по MASTER-LIST: если каноническая секция уже скачала — не скачивать).
|
||||
- **MANIFEST «Not downloadable»** — не источник истины по кросс-секционным книгам:
|
||||
|
|
@ -819,4 +786,5 @@ unbuffered logs; ads.php throttle → pause, don't hammer.
|
|||
Cyrillic pages); a one-shot exact-title probe is cheap, don't plan on it.
|
||||
- **RU translations: libgen.vg + flibusta.is** (flib = fb2/epub when libgen has only scan-pdf or nothing).
|
||||
- Per language, format priority: ALL pdfs if any pdf exists; else all fb2; else all epub; else all doc.
|
||||
- File naming `NN-<slug>-<lang>-<edition>.<ext>`; `downloads/0N-<name>/` gitignored, only `MANIFEST.md` committed.
|
||||
- File naming `NN-<slug>-<lang>-<edition>.<ext>`; **downloads в git LFS** (.gitattributes per sec),
|
||||
MANIFEST.md — обычный текст.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue