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:
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:
gelboorurule34danboorumoeboorue621
Один упавший провайдер не ломает общий feed: ошибки сохраняются в diagnostics, а остальные провайдеры продолжают отдавать посты.
Как добавить провайдера
- Добавить mapper в
lib/backend/mappers, если формат ответа отличается. - Реализовать
ContentProviderвlib/backend/providers. - Зарегистрировать новый
apiTypeвProviderFactory. - Добавить config через
ProviderManagerили UI Providers.
Интерфейс провайдера:
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:
final result = await ref.read(feedServiceProvider).refresh(
tags: ['touhou', 'hakurei_reimu'],
rating: 'safe',
);
Пример избранного:
await ref.read(favoriteServiceProvider).addFavorite(post);
final saved = await ref
.read(favoriteServiceProvider)
.isFavorite(post.id, post.providerId);
Пример настроек:
final settings = ref.read(settingsServiceProvider);
final exported = await settings.exportSettingsToJson();
await settings.importSettingsFromJson(exported.data);
Сборка и запуск
Установить зависимости:
flutter pub get
Сгенерировать Isar-код:
dart run build_runner build --delete-conflicting-outputs
Запустить:
flutter run -d windows
flutter run -d android
Собрать релиз:
flutter build windows
flutter build apk
Собрать Windows installer:
& "$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 настройки работают локально.
Тесты
flutter analyze
flutter test
В текущей версии покрыты backend-сервисы, provider parsing, smart blacklist, viewed history и tag chip input.