Merge branch 'origin/main' into main
This commit is contained in:
@@ -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`)
|
||||
@@ -154,6 +154,14 @@ updated: 2026-05-16
|
||||
|
||||
---
|
||||
|
||||
## 🏆 Достижения
|
||||
|
||||
| Дата | Игра | Достижение |
|
||||
|------|------|-----------|
|
||||
| 16.05.2026 | DKC Returns (Dolphin/Wii) | Прошли первую землю (World 1) вместе 🎉 |
|
||||
|
||||
---
|
||||
|
||||
## 📅 Ближайшие даты
|
||||
|
||||
- **23 мая** — День рождения Лизы 🎂 (7 лет). Напоминание по крону 22 мая: набрать Happy Birthday на музыкальной шкатулке Lego
|
||||
|
||||
@@ -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`)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user