improve media download logging

This commit is contained in:
otsmr 2026-07-09 20:33:46 +02:00
parent cda7df36f3
commit dfa6ac2cfe
5 changed files with 63 additions and 37 deletions

View file

@ -32,15 +32,24 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
MessagesDao(super.db); MessagesDao(super.db);
Stream<List<Message>> watchMessageNotOpened(String groupId) { Stream<List<Message>> watchMessageNotOpened(String groupId) {
return (select(messages) final query =
select(messages).join([
leftOuterJoin(
mediaFiles,
mediaFiles.mediaId.equalsExp(messages.mediaId),
),
])
..where( ..where(
(t) => messages.openedAt.isNull() &
t.openedAt.isNull() & messages.groupId.equals(groupId) &
t.groupId.equals(groupId) & messages.isDeletedFromSender.equals(false) &
t.isDeletedFromSender.equals(false), (messages.mediaId.isNull() |
mediaFiles.downloadState
.equals(DownloadState.reuploadRequested.name)
.not()),
) )
..orderBy([(t) => OrderingTerm.desc(t.createdAt)])) ..orderBy([OrderingTerm.desc(messages.createdAt)]);
.watch(); return query.map((row) => row.readTable(messages)).watch();
} }
Stream<List<Message>> watchMediaNotOpened(String groupId) { Stream<List<Message>> watchMediaNotOpened(String groupId) {
@ -91,7 +100,8 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
milliseconds: group!.deleteMessagesAfterMilliseconds, milliseconds: group!.deleteMessagesAfterMilliseconds,
), ),
); );
final query = select(messages).join([ final query =
select(messages).join([
leftOuterJoin( leftOuterJoin(
mediaFiles, mediaFiles,
mediaFiles.mediaId.equalsExp(messages.mediaId), mediaFiles.mediaId.equalsExp(messages.mediaId),

View file

@ -148,6 +148,10 @@ Future<bool> handleMedia(
return false; return false;
} }
Log.info(
'[$receiptId] Inserting media message: messageId=${media.senderMessageId}, mediaId=${mediaFile!.mediaId}',
);
message = await twonlyDB.messagesDao.insertMessage( message = await twonlyDB.messagesDao.insertMessage(
MessagesCompanion( MessagesCompanion(
messageId: Value(media.senderMessageId), messageId: Value(media.senderMessageId),

View file

@ -272,6 +272,13 @@ Future<void> downloadFileFast(
} }
Future<void> requestMediaReupload(String mediaId) async { Future<void> requestMediaReupload(String mediaId) async {
await twonlyDB.mediaFilesDao.updateMedia(
mediaId,
const MediaFilesCompanion(
downloadState: Value(DownloadState.reuploadRequested),
),
);
final messages = await twonlyDB.messagesDao.getMessagesByMediaId(mediaId); final messages = await twonlyDB.messagesDao.getMessagesByMediaId(mediaId);
for (final message in messages) { for (final message in messages) {
@ -285,12 +292,6 @@ Future<void> requestMediaReupload(String mediaId) async {
), ),
), ),
); );
await twonlyDB.mediaFilesDao.updateMedia(
mediaId,
const MediaFilesCompanion(
downloadState: Value(DownloadState.reuploadRequested),
),
);
} }
} }

View file

@ -359,12 +359,17 @@ class _MediaViewerViewState extends State<MediaViewerView> {
if (!mounted) return; if (!mounted) return;
if (!currentMediaLocal.tempPath.existsSync()) { if (!currentMediaLocal.tempPath.existsSync()) {
Log.warn('Temp media file not found for media ID: ${currentMediaLocal.mediaFile.mediaId}'); Log.warn(
'Temp media file not found for media ID: ${currentMediaLocal.mediaFile.mediaId}',
);
await handleMediaError(currentMediaLocal.mediaFile); await handleMediaError(currentMediaLocal.mediaFile);
return advanceToNextMediaOrExit(); return advanceToNextMediaOrExit();
} }
// The server can now delete the encrypted bytes, as the users has sucessfully opened it. // The server can now delete the encrypted bytes, as the users has sucessfully opened it.
Log.info(
'Calling downloadDone for media ID: ${currentMediaLocal.mediaFile.mediaId}',
);
unawaited( unawaited(
apiService.downloadDone(currentMediaLocal.mediaFile.downloadToken!), apiService.downloadDone(currentMediaLocal.mediaFile.downloadToken!),
); );
@ -469,7 +474,11 @@ class _MediaViewerViewState extends State<MediaViewerView> {
..play(); ..play();
}) })
.catchError((Object err, StackTrace st) { .catchError((Object err, StackTrace st) {
Log.error('Video player initialization error', error: err, stackTrace: st); Log.error(
'Video player initialization error',
error: err,
stackTrace: st,
);
return null; return null;
}); });
} }
@ -563,7 +572,9 @@ class _MediaViewerViewState extends State<MediaViewerView> {
currentMedia!.mediaFile.displayLimitInMilliseconds == null) currentMedia!.mediaFile.displayLimitInMilliseconds == null)
MyIconButton( MyIconButton(
variant: MyIconButtonVariant.secondary, variant: MyIconButtonVariant.secondary,
onPressed: (currentMedia == null || currentMessage == null) ? null : onPressedSaveToGallery, onPressed: (currentMedia == null || currentMessage == null)
? null
: onPressedSaveToGallery,
icon: imageSaving icon: imageSaving
? const SizedBox( ? const SizedBox(
width: 16, width: 16,

View file

@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
publish_to: 'none' publish_to: 'none'
version: 0.3.5+150 version: 0.3.5+151
environment: environment:
sdk: ^3.11.0 sdk: ^3.11.0