diff --git a/family/documents/google-books-api-key.md b/family/documents/google-books-api-key.md new file mode 100644 index 00000000..e2ef946e --- /dev/null +++ b/family/documents/google-books-api-key.md @@ -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`) diff --git a/family/documents/kids-activities.md b/family/documents/kids-activities.md index 51f79d02..da438015 100644 --- a/family/documents/kids-activities.md +++ b/family/documents/kids-activities.md @@ -154,6 +154,14 @@ updated: 2026-05-16 --- +## 🏆 Достижения + +| Дата | Игра | Достижение | +|------|------|-----------| +| 16.05.2026 | DKC Returns (Dolphin/Wii) | Прошли первую землю (World 1) вместе 🎉 | + +--- + ## 📅 Ближайшие даты - **23 мая** — День рождения Лизы 🎂 (7 лет). Напоминание по крону 22 мая: набрать Happy Birthday на музыкальной шкатулке Lego diff --git a/family/how-to/htpc-emulators-setup.md b/family/how-to/htpc-emulators-setup.md index ba12309d..d7c7dd8d 100644 --- a/family/how-to/htpc-emulators-setup.md +++ b/family/how-to/htpc-emulators-setup.md @@ -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`) diff --git a/family/projects/media-pipeline-agent.md b/family/projects/media-pipeline-agent.md new file mode 100644 index 00000000..87caa735 --- /dev/null +++ b/family/projects/media-pipeline-agent.md @@ -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 и т.д.): +- Тег `media-pipeline-agent` — отличает от 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 diff --git a/family/projects/media-toolbox-kraken.md b/family/projects/media-toolbox-kraken.md index 090f244f..b06bd4c4 100644 --- a/family/projects/media-toolbox-kraken.md +++ b/family/projects/media-toolbox-kraken.md @@ -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 diff --git a/personal/projects/library-app.md b/personal/projects/library-app.md new file mode 100644 index 00000000..7f6c87c8 --- /dev/null +++ b/personal/projects/library-app.md @@ -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.