Files
Prisma/README.md
T
2026-05-24 11:51:09 +03:00

227 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RuleGel
RuleGel — единое Flutter-приложение для просмотра booru/gelbooru/rule34-подобных источников в Pinterest-стиле.
Приложение не использует отдельный backend-сервер. Вся логика работает локально внутри Flutter: провайдеры API, кэш metadata, избранное, коллекции, история, настройки, диагностика и фильтры.
## Возможности
- Pinterest-like masonry feed с несколькими провайдерами.
- Поиск по тегам через удобные chip-теги: ввёл тег, нажал пробел или Enter, тег стал отдельным элементом.
- Подсказки тегов из provider API.
- Избранное, коллекции и история просмотренных постов.
- Smart blacklist и whitelist с правилами по тегам, рейтингу, провайдеру, типу файла и score.
- Детальный просмотр фото, GIF и видео.
- Видео-плеер с fullscreen, repeat, mute и понижением громкости.
- Desktop-only просмотр `.swf` через Ruffle/WebView на Windows.
- Управление провайдерами, health-check и provider diagnostics.
- Экспорт и импорт настроек.
- Android и Windows сборки.
## Скачать
Готовые сборки лежат в Gitea Releases:
[RuleGel v0.3.0](https://gitea.rardogsynapse.online/RarDog/RuleGelApp/releases/tag/v0.3.0-tag-chips-swf)
- `RuleGelSetup.exe` — установщик для Windows.
- `RuleGel-v0.3.0.apk` — APK для Android.
## Стек
- Flutter и Dart
- Riverpod
- go_router
- Dio
- Isar
- cached_network_image
- flutter_staggered_grid_view
- media_kit
- webview_windows для SWF/Ruffle на Windows
- connectivity_plus
- freezed/json_serializable/build_runner
## Архитектура
RuleGel — Flutter-монолит. UI не дублирует backend-логику, а вызывает локальные сервисы через Riverpod.
Основные слои:
- `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.
- `lib/backend/di` — Riverpod providers для backend/core.
- `lib/app` — приложение, роутер, тема и responsive helpers.
- `lib/shared/widgets` — общие UI-компоненты.
- `lib/features` — экраны и контроллеры фич.
## Экраны
- `/` — главный feed.
- `/search` — поиск и recent searches.
- `/post/:providerId/:postId` — детальный просмотр поста.
- `/favorites` — избранное.
- `/viewed` — история просмотренных постов.
- `/collections` — коллекции.
- `/collections/:collectionId` — посты внутри коллекции.
- `/providers` — управление провайдерами.
- `/providers/new` — добавление/редактирование провайдера.
- `/providers/check` — проверка провайдеров и diagnostics.
- `/settings` — настройки.
## Провайдеры по умолчанию
- Gelbooru — `https://gelbooru.com`
- Rule34 — `https://api.rule34.xxx`
- Safebooru — `https://safebooru.org`
- Konachan — `https://konachan.com`
- Yande.re — `https://yande.re`
- e621 — `https://e621.net`
- e926 — `https://e926.net`
Поддерживаемые `apiType`:
- `gelbooru`
- `rule34`
- `danbooru`
- `moebooru`
- `e621`
Один упавший провайдер не ломает общий feed: ошибки сохраняются в diagnostics, а остальные провайдеры продолжают отдавать посты.
## Как добавить провайдера
1. Добавить mapper в `lib/backend/mappers`, если формат ответа отличается.
2. Реализовать `ContentProvider` в `lib/backend/providers`.
3. Зарегистрировать новый `apiType` в `ProviderFactory`.
4. Добавить config через `ProviderManager` или UI Providers.
Интерфейс провайдера:
```dart
abstract class ContentProvider {
String get id;
String get name;
String get baseUrl;
Future<List<Post>> searchPosts({
required List<String> tags,
required int page,
int limit = 50,
String? rating,
});
Future<Post?> getPost(String id);
Future<ProviderHealth> checkHealth();
}
```
## Локальная база
Isar хранит:
- configs провайдеров;
- health status и diagnostics;
- cached metadata постов;
- избранное;
- коллекции и связи collection-post;
- историю поиска;
- историю просмотренных постов;
- app settings.
Кэш хранит только metadata. Оригинальные медиафайлы не скачиваются автоматически.
## Использование сервисов из UI
UI получает сервисы через Riverpod из `lib/backend/di/backend_providers.dart`.
Пример feed:
```dart
final result = await ref.read(feedServiceProvider).refresh(
tags: ['touhou', 'hakurei_reimu'],
rating: 'safe',
);
```
Пример избранного:
```dart
await ref.read(favoriteServiceProvider).addFavorite(post);
final saved = await ref
.read(favoriteServiceProvider)
.isFavorite(post.id, post.providerId);
```
Пример настроек:
```dart
final settings = ref.read(settingsServiceProvider);
final exported = await settings.exportSettingsToJson();
await settings.importSettingsFromJson(exported.data);
```
## Сборка и запуск
Установить зависимости:
```bash
flutter pub get
```
Сгенерировать Isar-код:
```bash
dart run build_runner build --delete-conflicting-outputs
```
Запустить:
```bash
flutter run -d windows
flutter run -d android
```
Собрать релиз:
```bash
flutter build windows
flutter build apk
```
Собрать Windows installer:
```powershell
& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\RuleGel.iss
```
## Важные заметки
- На Windows для Flutter plugins может понадобиться Developer Mode.
- Android-сборка требует Android SDK и принятые `flutter doctor --android-licenses`.
- Linux build нужно собирать на Linux-хосте.
- Если путь проекта содержит апостроф, Flutter Windows/test tooling может капризничать. Для сборки можно использовать junction-путь без спецсимволов.
- SWF работает только на Windows. На Android он намеренно отключён.
- Для SWF на Windows может понадобиться Microsoft WebView2 Runtime.
## Безопасность
- RuleGel использует публичные API и metadata.
- Приложение не обходит ограничения сайтов.
- Оригинальные файлы скачиваются только вручную по действию пользователя.
- Dio использует нормальный User-Agent.
- Retry/backoff ограничены.
- NSFW/blur/filter настройки работают локально.
## Тесты
```bash
flutter analyze
flutter test
```
В текущей версии покрыты backend-сервисы, provider parsing, smart blacklist, viewed history и tag chip input.