Merge pull request #336 from twonlyapp/dev
Some checks failed
Publish on Github / build_and_publish (push) Has been cancelled

- Improving uploading speed
- Fixing issue with ffmpeg for android
This commit is contained in:
Tobi 2025-12-16 10:06:18 +01:00 committed by GitHub
commit 5645baaae8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 89 additions and 13 deletions

View file

@ -1,5 +1,10 @@
# Changelog
## 0.0.74
- Improving uploading speed
- Fixing issue with ffmpeg for android
## 0.0.73
- Integrated QR code scanner in the main camera

View file

@ -49,6 +49,8 @@
<false/>
<key>FirebaseAutomaticScreenReportingEnabled</key>
<false/>
<key>FlutterDeepLinkingEnabled</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>ITSAppUsesNonExemptEncryption</key>

View file

@ -1,11 +1,13 @@
import 'dart:async';
import 'dart:convert';
import 'package:background_downloader/background_downloader.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:cryptography_flutter_plus/cryptography_flutter_plus.dart';
import 'package:cryptography_plus/cryptography_plus.dart';
import 'package:drift/drift.dart';
import 'package:fixnum/fixnum.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'package:mutex/mutex.dart';
import 'package:twonly/globals.dart';
import 'package:twonly/src/constants/secure_storage_keys.dart';
@ -14,6 +16,7 @@ import 'package:twonly/src/database/tables/messages.table.dart';
import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/api/http/http_requests.pb.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/api/mediafiles/media_background.service.dart';
import 'package:twonly/src/services/api/messages.dart';
import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
import 'package:twonly/src/utils/log.dart';
@ -322,10 +325,62 @@ Future<void> _uploadUploadRequest(MediaFileService media) async {
},
);
Log.info('Enqueue upload task: ${task.taskId}');
final connectivityResult = await Connectivity().checkConnectivity();
await FileDownloader().enqueue(task);
await media.setUploadState(UploadState.backgroundUploadTaskStarted);
if (!connectivityResult.contains(ConnectivityResult.mobile) &&
!connectivityResult.contains(ConnectivityResult.wifi)) {
// no internet, directly put it into the background...
await FileDownloader().enqueue(task);
await media.setUploadState(UploadState.backgroundUploadTaskStarted);
Log.info('Enqueue upload task: ${task.taskId}');
} else {
unawaited(uploadFileFastOrEnqueue(task, media));
}
});
}
Future<void> uploadFileFastOrEnqueue(
UploadTask task,
MediaFileService media,
) async {
final requestMultipart = http.MultipartRequest(
'POST',
Uri.parse(task.url),
);
requestMultipart.headers.addAll(task.headers);
requestMultipart.files.add(
await http.MultipartFile.fromPath(
'file',
await task.filePath(),
filename: 'upload',
),
);
try {
Log.info('Uploading fast: ${task.taskId}');
final response =
await requestMultipart.send().timeout(const Duration(seconds: 4));
var status = TaskStatus.failed;
if (response.statusCode == 200) {
status = TaskStatus.complete;
} else if (response.statusCode == 404) {
status = TaskStatus.notFound;
}
await handleUploadStatusUpdate(
TaskStatusUpdate(
task,
status,
null,
null,
null,
response.statusCode,
),
);
} catch (e) {
Log.info('Upload failed enqueuing task...');
await FileDownloader().enqueue(task);
await media.setUploadState(UploadState.backgroundUploadTaskStarted);
}
}

View file

@ -76,17 +76,29 @@ Future<void> compressAndOverlayVideo(MediaFileService media) async {
var overLayCommand = '';
if (media.overlayImagePath.existsSync()) {
overLayCommand =
'-i "${media.overlayImagePath.path}" -filter_complex "[1:v][0:v]scale2ref=w=ref_w:h=ref_h[ovr][base];[base][ovr]overlay=0:0"';
if (Platform.isAndroid) {
overLayCommand =
'-i "${media.overlayImagePath.path}" -filter_complex "[1:v]format=yuva420p[ovr_in];[0:v]format=yuv420p[base_in];[ovr_in][base_in]scale2ref=w=rw:h=rh[ovr_out][base_out];[base_out][ovr_out]overlay=0:0"';
} else {
overLayCommand =
'-i "${media.overlayImagePath.path}" -filter_complex "[1:v][0:v]scale2ref=w=ref_w:h=ref_h[ovr][base];[base][ovr]overlay=0:0"';
}
}
final stopwatch = Stopwatch()..start();
var additionalParams = '';
if (Platform.isAndroid) {
additionalParams += ' -c:v libx264';
}
var command =
'-i "${media.originalPath.path}" $overLayCommand -map "0:a?" -preset veryfast -crf 28 -c:a aac -b:a 64k "${media.ffmpegOutputPath.path}"';
'-i "${media.originalPath.path}" $overLayCommand -map "0:a?" $additionalParams -preset veryfast -crf 28 -c:a aac -b:a 64k "${media.ffmpegOutputPath.path}"';
if (media.removeAudio) {
command =
'-i "${media.originalPath.path}" $overLayCommand -preset veryfast -crf 28 -an "${media.ffmpegOutputPath.path}"';
'-i "${media.originalPath.path}" $overLayCommand $additionalParams -preset veryfast -crf 28 -an "${media.ffmpegOutputPath.path}"';
}
final session = await FFmpegKit.execute(command);

View file

@ -220,10 +220,12 @@ class MainCameraController {
}
}
} else {
if (scannedNewProfiles[profile.userId.toInt()] == null) {
scannedNewProfiles[profile.userId.toInt()] = ScannedNewProfile(
profile: profile,
);
if (profile.username != gUser.username) {
if (scannedNewProfiles[profile.userId.toInt()] == null) {
scannedNewProfiles[profile.userId.toInt()] = ScannedNewProfile(
profile: profile,
);
}
}
}
}

View file

@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
publish_to: 'none'
version: 0.0.73+73
version: 0.0.74+74
environment:
sdk: ^3.6.0