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