Merge branch 'origin/main' into main

This commit is contained in:
2026-05-16 22:35:41 +06:00
6 changed files with 248 additions and 3 deletions
+9
View File
@@ -0,0 +1,9 @@
# Google Books API Key
**Key:** AIzaSyCejN7X78Nuiv0-KNJR0zXhfjGVj9OhAt4
**Project:** library-app (Google Cloud Console)
**Quota:** 1,000 req/day без ключа → 10,000 req/day с ключом
**Scope:** Books API только
**Используется в:** library-app на TrueNAS (`/mnt/RED_2TB/docker/library/data/config.toml`)
+8
View File
@@ -154,6 +154,14 @@ updated: 2026-05-16
---
## 🏆 Достижения
| Дата | Игра | Достижение |
|------|------|-----------|
| 16.05.2026 | DKC Returns (Dolphin/Wii) | Прошли первую землю (World 1) вместе 🎉 |
---
## 📅 Ближайшие даты
- **23 мая** — День рождения Лизы 🎂 (7 лет). Напоминание по крону 22 мая: набрать Happy Birthday на музыкальной шкатулке Lego
+34 -3
View File
@@ -4,6 +4,29 @@
---
## Бэкап сейвов
**Daily → Data диск** (`Persistent=true` — срабатывает при включении если пропустил):
- `saves-backup.timer` (00:00 daily)
- Скрипт: `~/scripts/backup-saves.sh`
- Назначение: `/run/media/bazzite/Data/backups/saves/`
- Покрывает: Dolphin GC, Dolphin Wii, RetroArch, Ryujinx, Steam userdata, MAME
**Weekly → Кракен HDD** (`Persistent=true`):
- `saves-sync-kraken.timer` (weekly)
- Скрипт: `~/scripts/backup-saves-to-kraken.sh`
- Назначение: `kraken@192.168.1.14:/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/backups/htpc-saves/`
- ⚠️ Путь назначения **всегда на HDD** (`/srv/dev-disk-by-uuid-.../`), не в `~/` (SSD, маленький)
- Транспорт: rsync по LAN (SSH ключ bazzite→kraken авторизован)
```bash
# Запустить вручную:
bash ~/scripts/backup-saves.sh # Data диск
bash ~/scripts/backup-saves-to-kraken.sh # Кракен
```
---
## Dolphin (Wii / GameCube)
**Версия:** 2603a (Flatpak `org.DolphinEmu.dolphin-emu`)
@@ -30,9 +53,9 @@
- Стики → Axis 0/1 (левый), Axis 2/3 (правый) — deadzone 15%
- Триггеры → Trigger L/R, threshold 90%
**Wiimote + Classic Controller (для Wii игр):** XInput2/0..3/Xbox 360 Controller
- Extension = Classic Controller
- Кнопки маппятся напрямую через Classic Controller
**Wiimote + Nunchuk (для Wii игр):** SDL/0/Xbox 360 Controller
- Extension = **Nunchuk** (не Classic Controller — DKC Returns пишет "unsupported controller" на CC)
- Shake привязан на кнопку X (порог 0.2, frequency 50)
- WiimoteSource = 1 (эмуляция, не реальный Wiimote)
### Игры на Data диске (`/run/media/bazzite/Data/dolphin roms/`)
@@ -165,6 +188,14 @@ gba_data → /run/media/bazzite/Data/gba roms
---
## TODO: DOS / Windows Standalone
- [ ] Discworld (DOS) — настроить через DOSBox в RetroArch или DOSBox Staging standalone
- [ ] Другие Windows/DOS игры — добавить в SRM как standalone shortcuts
- [ ] Добавить парсеры в SRM: DOS и/или Windows категории
---
## Ryujinx (Nintendo Switch)
**Версия:** 1.3.3 (Ryubing fork, Flatpak `io.github.ryubing.Ryujinx`)
+65
View File
@@ -0,0 +1,65 @@
# Media Pipeline — Agentic Flow
## Статус (2026-05-16)
✅ Реализовано и задеплоено на Кракен (`commit 3df97a1`)
## Архитектура
### `ChatGPTAPI.resolveMedia(filename:)`
Tool-calling loop, max 8 раундов, модель `openai/gpt-oss-120b:free` через OpenRouter.
**Инструменты:**
| Tool | Описание |
|------|----------|
| `search_tmdb(title, year?, language?)` | Поиск в TMDb |
| `search_kinopoisk(title, year?)` | Поиск в KP (советские/российские) |
| `fetch_page(url)` | Fetch + HTML-strip https URL (IMDb, BBC, Wikipedia) |
**Результаты (`MediaResolutionResult`):**
- `resolved(tmdbId, kpId, imdbId, title, year)` — найдено в БД → пишем NFO через TMDb
- `metadata(title, year, description, genres, posterUrl, sourceUrl)` — web-only → `writeCustomNFO()`
- `unresolvable(reason)` — не удалось → hint в unresolved.json
### `writeCustomNFO()`
Пишет NFO без DB binding (для BBC docs, Frozen Kingdom и т.д.):
- Тег `<generator>media-pipeline-agent</generator>` — отличает от pipeline-generated
- Поддерживает poster_url, description, genres
## Запуск на Кракене
```bash
cd /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline
docker run --rm \
-v "$(pwd)/config.json:/config/config.json:ro" \
-v "/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/media:/media" \
-v "$(pwd)/cache:/config/cache" \
-v "$(pwd)/unresolved.json:/config/unresolved.json" \
media-pipeline:kraken agent --apply --limit 20
```
Без `--apply` — только hints в unresolved.json, без записи NFO.
## Pending unresolved (12 items, 2026-05-16)
| Путь | Группа | Ожидаемый результат |
|------|--------|---------------------|
| `bbc. the real jungle book bear 2012` | BBC doc | metadata (BBC page) |
| `bbc. секреты собак` | BBC doc | metadata |
| `penguin meet the family (2020)` | BBC doc | metadata |
| `бегемоты - жизнь в воде` | BBC doc | metadata |
| `супер белки (2018)` | doc | metadata/resolved |
| `шпион в снегах 2018` | doc | metadata/resolved |
| `таинственная жизнь собак (hdtvrip 720p, 2013)` | doc | resolved (KP) |
| `Таинственная жизнь собак (HDTVRip 720p, 2013).mkv` | дубль | resolved |
| `budil'nik 1984` | советский м/ф | resolved (KP) |
| `novogodn'aya_pesenka_deda_moroza` | советский м/ф | resolved (KP) |
| `Nehochuha.XVid.DVDRip.avi` | дубль папки | shadow/skip |
| `Bezumnyj_Maks_3...mkv` | дубль папки | shadow/skip |
## Следующие шаги
- [ ] Запустить `agent --apply` на 12 unresolved
- [ ] Проверить Frozen Kingdom (документалка про снежного барса)
- [ ] CV/Whisper (Tier 6) — для случаев где даже агент не справляется
- [ ] Hermes cron: запускать `agent --apply` после каждого sync
+13
View File
@@ -372,6 +372,19 @@ docker run --rm ... media-pipeline:kraken \
-**rsync с HTPC завершён** — 303 фильма, 206 мультиков, 72 серии, 46 документалок (2.2TB)
-**unresolved.json маунтится**`-v $(pwd)/unresolved.json:/config/unresolved.json`
⚠️ **Обязательный pipeline.providers в config.json** — если `tmdb`/`kinopoisk` отсутствуют в блоке → disabled → 213 skipped вместо 278+ applied!
```json
"pipeline": {
"providers": {
"tmdb": { "enabled": true, "language": "ru-RU" },
"kinopoisk": { "enabled": true },
"torrent": { "enabled": true },
"webSearch": { "enabled": true },
"aiAgent": { "enabled": false }
}
}
```
### Запуск pipeline (правильная команда)
```bash
cd /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline
+119
View File
@@ -0,0 +1,119 @@
# Library App
Персональный веб-сайт для библиотеки книг на TrueNAS.
## Назначение
Замена inpxer — полноценный сайт для просмотра коллекции Flibusta (687k книг) + личных книг, с отметками статуса чтения, связями между книгами и графом.
## Деплой
- **Контейнер:** `library-app` на TrueNAS (mallexxx.duckdns.org)
- **Домен:** `library.mallexxx.duckdns.org`
- **Расположение:** `/mnt/RED_2TB/docker/library/`
- **Сеть:** `caddy_default`
## Данные
### Монтирования
| Хост | Контейнер | Режим |
|------|-----------|-------|
| `/mnt/RED_2TB/storage/Downloads/fb2.Flibusta.Net` | `/library` | ro |
| `/mnt/RED_2TB/storage/books` | `/books` | ro |
| `/mnt/RED_2TB/docker/library/data` | `/data` | rw |
### SQLite файлы в `/data/`
**`books.db`** — пересоздаётся при каждом старте контейнера из INPX (≈10 сек):
```sql
books(id, author, genre, title, series, format, date, lang, zip_file)
```
**`library.db`** — персистентный, никогда не удалять:
```sql
read_log(book_id, status, date_updated, rating, notes, created_at)
-- status: 'read' | 'reading' | 'want'
relations(book_id, related_id, type, weight, fetched_at)
-- type: 'same_author' | 'same_series' | 'same_genre' | 'openlibrary'
```
## Статусы книг
| Статус | Значение |
|--------|----------|
| `read` | Прочитано |
| `reading` | Читаю сейчас |
| `want` | Буду читать |
## Источники связей между книгами
Связи строятся при **первом открытии** любой книги, кэшируются в `relations`:
1. **`same_author`** — все книги того же автора (из books.db, мгновенно)
2. **`same_series`** — книги той же серии (из books.db, мгновенно)
3. **`same_genre`** — топ-20 книг жанра по дате (из books.db, мгновенно)
4. **`openlibrary`** — "readers also read" через OpenLibrary API (async, ~300ms)
Повторное открытие: кэш используется. Фоновое обновление — раз в 30 дней (поле `fetched_at`).
## Стек
- **Backend:** Python + FastAPI (JSON API)
- **Frontend:** Vue 3 (CDN, no build) + Tailwind CSS (CDN) — mobile-first SPA
- **Граф:** vis.js (CDN)
- **Контейнер:** python:3.12-slim, uvicorn
## Страницы
| URL | Описание |
|-----|----------|
| `/` | Главная — поиск, жанры (без взрослых), новинки |
| `/book/{id}` | Страница книги — статус, связи, скачать |
| `/my` | Мои книги — read/reading/want с фильтрами |
| `/graph` | Граф прочитанных книг и связей |
| `/adult` | Взрослые жанры — отдельная страница, нет ссылки с главной |
## Взрослый контент
Жанры-теги в `/data/adult_genres.txt` — один жанр на строку. По умолчанию:
```
love_erotica
erotik
sex_sf
adv_sex
prose_sex
```
Эти жанры исключены из главной страницы и поиска по умолчанию. Доступны только через `/adult`.
## Ссылки на скачивание
- **Flibusta (inpxer):** `https://books.mallexxx.duckdns.org/download/{id}`
- **Личные книги:** `https://docs.mallexxx.duckdns.org/books/{path}` (FileBrowser)
## Entrypoint
```bash
# 1. Rebuild books.db из INPX (~10 сек)
python inpx2db.py /library/flibusta_fb2_local.inpx /data/books.db
# 2. Init library.db (если не существует)
python init_db.py /data/library.db
# 3. Запуск сервера
uvicorn main:app --host 0.0.0.0 --port 8080
```
## Статус
**Задеплоен**`https://library.mallexxx.duckdns.org`
- books.db: 687,722 книг, 227 MB, rebuild ~23 сек при старте
- library.db: персистентный, в `/mnt/RED_2TB/docker/library/data/`
- config: `/mnt/RED_2TB/docker/library/data/config.toml`
## История
- **2026-05-16** — задеплоен. INPX parse+SQLite build = 23s (в контейнере), DB = 227MB.