105 lines
5.0 KiB
Markdown
105 lines
5.0 KiB
Markdown
# Lunaris
|
||
|
||
Lunaris — локальное Flutter-приложение для просмотра booru, gelbooru, rule34-подобных источников и artist-архивов в Pinterest-стиле.
|
||
|
||
Приложение не использует отдельный backend-сервер. Вся логика живет внутри Flutter: API-провайдеры, локальный кеш metadata, избранное, коллекции, история просмотров, фильтры, диагностика, загрузки и обновления.
|
||
|
||
## Что умеет
|
||
|
||
- Masonry feed с несколькими провайдерами и естественно перемешанной выдачей.
|
||
- Поиск тегов через chip-input с подсказками из активных API.
|
||
- Избранное, история просмотров, коллекции и пакетное добавление в коллекции.
|
||
- Smart blacklist/whitelist по тегам, группам тегов, рейтингу, провайдеру, типу файла и score.
|
||
- Details viewer для фото, GIF, видео и SWF на Windows.
|
||
- Удобный видеоплеер с fullscreen, repeat, mute, half-volume и сохранением настроек.
|
||
- Mobile image zoom: pinch-to-zoom и double tap в details.
|
||
- Опциональное автоскачивание новых favorites с отдельным удалением локального файла без удаления из избранного.
|
||
- Отдельная вкладка Artists для Kemono/Coomer без смешивания с обычной booru-лентой.
|
||
- Управление провайдерами, health-check и provider diagnostics.
|
||
- Кастомизация интерфейса: тема, язык RU/EN, акцентный цвет, видимые вкладки, beta/experimental обновления.
|
||
- Экспорт и импорт настроек JSON.
|
||
- Проверка Gitea Releases и скачивание APK/Windows installer прямо из приложения.
|
||
|
||
## Скачать
|
||
|
||
Готовые сборки лежат в Gitea Releases:
|
||
|
||
[Lunaris 2.0.1](https://gitea.rardogsynapse.online/RarDog/RuleGelApp/releases/tag/v2.0.1)
|
||
|
||
- `Lunaris-v2.0.1.apk` — APK для Android.
|
||
- `LunarisSetup-v2.0.1.exe` — установщик для Windows.
|
||
- `LunarisPortable-v2.0.1.zip` — portable-версия для Windows.
|
||
|
||
## Провайдеры
|
||
|
||
Обычный feed:
|
||
|
||
- Gelbooru
|
||
- Rule34
|
||
- Safebooru
|
||
- Konachan
|
||
- Yande.re
|
||
- e621 / e926
|
||
- Xbooru
|
||
- CosBooru
|
||
- Realbooru отключен по умолчанию, если публичный API недоступен
|
||
|
||
Artists flow:
|
||
|
||
- Kemono
|
||
- Coomer
|
||
|
||
Kemono/Coomer остаются отдельным разделом Artists и не попадают в общий booru feed.
|
||
|
||
## Архитектура
|
||
|
||
- `lib/core` — HTTP, база, кеш, ошибки, Result и утилиты.
|
||
- `lib/backend/models` — доменные модели.
|
||
- `lib/backend/providers` — API-провайдеры и ProviderManager.
|
||
- `lib/backend/repositories` — доступ к локальному Isar-хранилищу.
|
||
- `lib/backend/services` — Feed/Search/Favorites/Collections/Settings/Diagnostics/Downloads/Updates.
|
||
- `lib/backend/di` — Riverpod providers для backend/core.
|
||
- `lib/app` — приложение, роутер, тема, локализация, motion и responsive helpers.
|
||
- `lib/shared/widgets` — общие UI-компоненты.
|
||
- `lib/features` — экраны и контроллеры фич.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
flutter pub get
|
||
flutter run -d windows
|
||
flutter run -d android
|
||
```
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
flutter analyze
|
||
flutter test
|
||
flutter build apk
|
||
flutter build windows
|
||
```
|
||
|
||
Windows installer собирается через Inno Setup:
|
||
|
||
```powershell
|
||
ISCC.exe installer\Lunaris.iss
|
||
```
|
||
|
||
## Как добавить провайдера
|
||
|
||
1. Создать класс, реализующий `ContentProvider`.
|
||
2. Добавить mapper к единой модели `Post`.
|
||
3. Зарегистрировать `apiType` в `ProviderFactory`.
|
||
4. Добавить seed config в `ProviderRepository`, если провайдер нужен по умолчанию.
|
||
5. Добавить тесты parser/provider factory.
|
||
|
||
## Безопасность
|
||
|
||
- Feed работает только с metadata/preview и не скачивает original/full files автоматически.
|
||
- Загрузка файлов происходит только по явному действию пользователя или при включенной настройке auto-download favorites.
|
||
- Приложение уважает API и rate limits сайтов.
|
||
- NSFW/blur/blacklist настраиваются локально.
|
||
- API keys/custom headers хранятся локально и экспортируются только через явный export settings.
|
||
- Локальные пути скачанных файлов не попадают в JSON export/import.
|