fix upload

This commit is contained in:
otsmr 2025-07-05 16:34:13 +02:00
parent f1dc6dff54
commit 23e2cd5031
3 changed files with 53 additions and 22 deletions

View file

@ -90,6 +90,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
} else if (state == AppLifecycleState.paused) { } else if (state == AppLifecycleState.paused) {
wasPaused = true; wasPaused = true;
globalIsAppInBackground = true; globalIsAppInBackground = true;
handleUploadWhenAppGoesBackground();
} }
} }

View file

@ -447,6 +447,8 @@ Future handleUploadStatusUpdate(TaskStatusUpdate update) async {
Future handleUploadSuccess(MediaUpload media) async { Future handleUploadSuccess(MediaUpload media) async {
Log.info("Upload of ${media.mediaUploadId} success!"); Log.info("Upload of ${media.mediaUploadId} success!");
currentUploadTasks.remove(media.mediaUploadId);
await twonlyDB.mediaUploadsDao.updateMediaUpload( await twonlyDB.mediaUploadsDao.updateMediaUpload(
media.mediaUploadId, media.mediaUploadId,
MediaUploadsCompanion( MediaUploadsCompanion(
@ -596,35 +598,63 @@ Future handleMediaUpload(MediaUpload media) async {
try { try {
Log.info("Starting upload from ${media.mediaUploadId}"); Log.info("Starting upload from ${media.mediaUploadId}");
final task = UploadTask.fromFile(
taskId: "upload_${media.mediaUploadId}",
displayName: (media.metadata?.isVideo ?? false) ? "image" : "video",
file: uploadRequestFile,
url: apiUrl,
priority: 0,
retries: 10,
headers: {
'x-twonly-auth-token': apiAuthToken,
},
);
currentUploadTasks[media.mediaUploadId] = task;
try { try {
await uploadFileFast(media, uploadRequestBytes, apiUrl, apiAuthToken); await uploadFileFast(media, uploadRequestBytes, apiUrl, apiAuthToken);
} catch (e) { } catch (e) {
Log.error("Fast upload failed: $e. Using slow method."); Log.error("Fast upload failed: $e. Using slow method directly.");
final task = UploadTask.fromFile( enqueueUploadTask(media.mediaUploadId);
taskId: "upload_${media.mediaUploadId}",
displayName: (media.metadata?.isVideo ?? false) ? "image" : "video",
file: uploadRequestFile,
url: apiUrl,
priority: 0,
retries: 10,
headers: {
'x-twonly-auth-token': apiAuthToken,
},
);
await FileDownloader().enqueue(task);
} }
await twonlyDB.mediaUploadsDao.updateMediaUpload(
media.mediaUploadId,
MediaUploadsCompanion(
state: Value(UploadState.uploadTaskStarted),
),
);
} catch (e) { } catch (e) {
Log.error("Exception during upload: $e"); Log.error("Exception during upload: $e");
} }
} }
Map<int, UploadTask> currentUploadTasks = {};
Future enqueueUploadTask(int mediaUploadId) async {
if (currentUploadTasks[mediaUploadId] == null) {
Log.info("could not enqueue upload task: $mediaUploadId");
return;
}
Log.info("Enqueue upload task: $mediaUploadId");
await FileDownloader().enqueue(currentUploadTasks[mediaUploadId]!);
currentUploadTasks.remove(mediaUploadId);
await twonlyDB.mediaUploadsDao.updateMediaUpload(
mediaUploadId,
MediaUploadsCompanion(
state: Value(UploadState.uploadTaskStarted),
),
);
}
Future handleUploadWhenAppGoesBackground() async {
if (currentUploadTasks.keys.isEmpty) {
return;
}
Log.info("App goes into background. Enqueue uploads to the background.");
final keys = currentUploadTasks.keys.toList();
for (final key in keys) {
enqueueUploadTask(key);
}
}
Future uploadFileFast( Future uploadFileFast(
MediaUpload media, MediaUpload media,
Uint8List uploadRequestFile, Uint8List uploadRequestFile,
@ -643,7 +673,7 @@ Future uploadFileFast(
filename: "upload", filename: "upload",
)); ));
final response = await requestMultipart.send().timeout(Duration(seconds: 3)); final response = await requestMultipart.send();
if (response.statusCode == 200) { if (response.statusCode == 200) {
Log.info('Upload successful!'); Log.info('Upload successful!');
await handleUploadSuccess(media); await handleUploadSuccess(media);

View file

@ -4,7 +4,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
# Prevent accidental publishing to pub.dev. # Prevent accidental publishing to pub.dev.
publish_to: 'none' publish_to: 'none'
version: 0.0.48+48 version: 0.0.49+49
environment: environment:
sdk: ^3.6.0 sdk: ^3.6.0