From 5e3efb0da9a69bbe533b90575ab53b353a13433e Mon Sep 17 00:00:00 2001
From: RarDog
Date: Sat, 5 Sep 2026 15:16:08 +0300
Subject: [PATCH] feat: add audio playback support (MP3/WAV/FLAC) and fix
attachment loading in creator posts
---
README.md | 2 +-
README_RU.md | 2 +-
lib/app/app_version.dart | 4 +-
lib/app/changelog.dart | 10 +
lib/backend/providers/kemono_provider.dart | 43 +-
lib/backend/providers/pawchive_provider.dart | 76 ++-
lib/backend/utils/media_quality.dart | 51 +-
.../presentation/artist_posts_screen.dart | 39 +-
.../presentation/post_details_screen.dart | 40 +-
.../widgets/post_media_viewer.dart | 501 +++++++++++++++++-
lib/shared/widgets/post_card.dart | 292 +++++++++-
pubspec.yaml | 2 +-
test/backend/pawchive_provider_test.dart | 65 +++
13 files changed, 1073 insertions(+), 54 deletions(-)
diff --git a/README.md b/README.md
index 9ac8693..16b3ba2 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
-
+
diff --git a/README_RU.md b/README_RU.md
index 27c50d9..7de87ae 100644
--- a/README_RU.md
+++ b/README_RU.md
@@ -14,7 +14,7 @@
-
+
diff --git a/lib/app/app_version.dart b/lib/app/app_version.dart
index 3069ec3..09c7d43 100644
--- a/lib/app/app_version.dart
+++ b/lib/app/app_version.dart
@@ -1,3 +1,3 @@
-const appDisplayVersion = '3.5.2';
-const appBuildNumber = 78;
+const appDisplayVersion = '3.5.3';
+const appBuildNumber = 79;
const appReleaseChannel = 'Stable';
diff --git a/lib/app/changelog.dart b/lib/app/changelog.dart
index 92a0a77..cc69d6c 100644
--- a/lib/app/changelog.dart
+++ b/lib/app/changelog.dart
@@ -1,4 +1,14 @@
const prismaChangelog = [
+ PrismaChange(
+ version: '3.5.3',
+ title: 'Поддержка аудиозаписей (MP3/WAV/FLAC) и исправление загрузки медиа у авторов',
+ bullets: [
+ 'Полноценная поддержка аудио: добавлено воспроизведение MP3, M4A, WAV, FLAC, OGG, AAC и OPUS файлов авторов (Patreon, Fanbox и др.).',
+ 'Встроенный аудиопроигрыватель: карточка с анимированной пластинкой/обложкой, таймлайном, перемоткой на 10 сек, повтором и регулятором громкости.',
+ 'Устранение ошибки 404 у миниатюр: исправлена попытка загрузки несуществующих эскизов для аудио и видео с Pawchive, из-за чего файлы отображались как битые.',
+ 'Фильтр аудиозаписей: во вкладке артиста добавлен фильтр «Аудио», позволяющий мгновенно находить все треки и голосовые посты автора.',
+ ],
+ ),
PrismaChange(
version: '3.5.2',
title: 'Исправление наложения клавиатуры и поиска авторов',
diff --git a/lib/backend/providers/kemono_provider.dart b/lib/backend/providers/kemono_provider.dart
index 796f4c4..5160d9d 100644
--- a/lib/backend/providers/kemono_provider.dart
+++ b/lib/backend/providers/kemono_provider.dart
@@ -600,14 +600,47 @@ class KemonoProvider
}
String _fileType(String value) {
- final lower = value.toLowerCase().split('?').first;
- if (lower.endsWith('.webm') || lower.endsWith('.mp4')) return 'video';
+ final lower = value.toLowerCase().split('?').first.trim();
+ if (lower.endsWith('.webm') ||
+ lower.endsWith('.mp4') ||
+ lower.endsWith('.mov') ||
+ lower.endsWith('.mkv') ||
+ lower.endsWith('.avi') ||
+ lower.endsWith('.flv') ||
+ lower.endsWith('.wmv') ||
+ lower.endsWith('.m4v') ||
+ lower.endsWith('.ts')) {
+ return 'video';
+ }
+ if (lower.endsWith('.mp3') ||
+ lower.endsWith('.m4a') ||
+ lower.endsWith('.wav') ||
+ lower.endsWith('.ogg') ||
+ lower.endsWith('.flac') ||
+ lower.endsWith('.aac') ||
+ lower.endsWith('.opus') ||
+ lower.endsWith('.wma')) {
+ return 'audio';
+ }
if (lower.endsWith('.gif')) return 'gif';
if (lower.endsWith('.swf')) return 'swf';
- if (lower.endsWith('.png')) return 'png';
- if (lower.endsWith('.jpg') ||
+ if (lower.endsWith('.zip') ||
+ lower.endsWith('.rar') ||
+ lower.endsWith('.7z') ||
+ lower.endsWith('.tar') ||
+ lower.endsWith('.gz') ||
+ lower.endsWith('.pdf') ||
+ lower.endsWith('.txt')) {
+ return 'archive';
+ }
+ if (lower.endsWith('.png') ||
+ lower.endsWith('.jpg') ||
lower.endsWith('.jpeg') ||
- lower.endsWith('.webp')) {
+ lower.endsWith('.webp') ||
+ lower.endsWith('.avif') ||
+ lower.endsWith('.bmp') ||
+ lower.endsWith('.heic') ||
+ lower.endsWith('.tiff')) {
return 'photo';
}
return 'unknown';
diff --git a/lib/backend/providers/pawchive_provider.dart b/lib/backend/providers/pawchive_provider.dart
index 0a1555b..0350058 100644
--- a/lib/backend/providers/pawchive_provider.dart
+++ b/lib/backend/providers/pawchive_provider.dart
@@ -414,7 +414,15 @@ class PawchiveProvider
}
final attachments = json['attachments'];
if (attachments is List) {
- files.addAll(attachments.whereType