From 9a9b25cdfee50445440f82ea163386656b8d8d1f Mon Sep 17 00:00:00 2001 From: MSOB7YY Date: Thu, 29 Feb 2024 02:22:32 +0200 Subject: [PATCH] fix: tagger stuck in some scenarios & other tagger fixes --- .../kotlin/com/example/namida/FAudioTagger.kt | 22 +++++++++++++++++-- lib/controller/tagger_controller.dart | 16 ++++++++------ lib/ui/dialogs/edit_tags_dialog.dart | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/android/app/src/main/kotlin/com/example/namida/FAudioTagger.kt b/android/app/src/main/kotlin/com/example/namida/FAudioTagger.kt index bdd42632..74791e9d 100644 --- a/android/app/src/main/kotlin/com/example/namida/FAudioTagger.kt +++ b/android/app/src/main/kotlin/com/example/namida/FAudioTagger.kt @@ -14,6 +14,7 @@ import java.io.File import java.io.FileOutputStream import java.nio.ByteBuffer import java.util.Base64 +import java.util.concurrent.CompletableFuture import kotlin.collections.List import kotlin.collections.Map import kotlinx.coroutines.* @@ -39,6 +40,7 @@ public class FAudioTagger : FlutterPlugin, MethodCallHandler { lateinit var channel: MethodChannel lateinit var binaryMessenger: BinaryMessenger val eventChannels = HashMap() + val streamCompleters = HashMap>() lateinit var context: Context companion object { @@ -110,6 +112,17 @@ public class FAudioTagger : FlutterPlugin, MethodCallHandler { result.error("Failure", "path parameter isn't provided", "") } } + "streamReady" -> { + val streamKey = call.argument("streamKey") ?: 0 + val count = call.argument("count") ?: 0 + val completer = streamCompleters.get(streamKey) + if (completer != null) { + completer.complete(count) + result.success(true) + } else { + result.success(false) + } + } "readAllDataAsStream" -> { val paths = call.argument?>("paths") if (paths != null) { @@ -124,9 +137,14 @@ public class FAudioTagger : FlutterPlugin, MethodCallHandler { BetterEventChannel(binaryMessenger, "faudiotagger/stream/" + streamKey) ) val eventChannel = eventChannels.get(streamKey)!! - result.success(true) - _addLogsUser() + + streamCompleters.set(streamKey, CompletableFuture()) + result.success(streamKey) + CoroutineScope(Dispatchers.IO).launch { + _addLogsUser() + // waiting for confirmation before posting to stream + streamCompleters.get(streamKey)!!.get() for (p in paths) { val map = readAllData( diff --git a/lib/controller/tagger_controller.dart b/lib/controller/tagger_controller.dart index 85148323..0544b8cf 100644 --- a/lib/controller/tagger_controller.dart +++ b/lib/controller/tagger_controller.dart @@ -62,11 +62,13 @@ class FAudioTaggerController { "artworkIdentifiers": _defaultGroupArtworksByAlbum ? _defaultAlbumIdentifier.map((e) => e.index).toList() : null, }); final channelEvent = EventChannel('faudiotagger/stream/$streamKey'); - return channelEvent.receiveBroadcastStream().map((event) { + final stream = channelEvent.receiveBroadcastStream().map((event) { final message = event as Map; final map = message.cast(); return map; }); + _channel.invokeMethod("streamReady", {"streamKey": streamKey, "count": paths.length}); + return stream; } Future writeTags({ @@ -246,7 +248,7 @@ class FAudioTaggerController { editedTags.updateAll((key, value) => value.trimAll()); } - final shouldUpdateArtwork = imagePath != ''; + final imageFile = imagePath != '' ? File(imagePath) : null; String oldComment = ''; if (commentToInsert != '') { @@ -260,7 +262,7 @@ class FAudioTaggerController { ) : FTags( path: '', - artwork: FArtwork(file: shouldUpdateArtwork ? File(imagePath) : null), + artwork: FArtwork(file: imageFile), title: editedTags[TagField.title], album: editedTags[TagField.album], artist: editedTags[TagField.artist], @@ -303,15 +305,13 @@ class FAudioTaggerController { await file.executeAndKeepStats( () async { - bool didUpdate = false; - // -- 1. try tagger error = await FAudioTaggerController.inst.writeTags( path: track.path, tags: newTags, ); - // didUpdate = error == null || error == ''; + bool didUpdate = error == null || error == ''; if (!didUpdate) { // -- 2. try with ffmpeg @@ -347,7 +347,9 @@ class FAudioTaggerController { } if (didUpdate) { final trExt = track.toTrackExt(); - tracksMap[track] = trExt.copyWithTag(tag: newTags); + final newTrExt = trExt.copyWithTag(tag: newTags); + tracksMap[track] = newTrExt; + if (imageFile != null) await imageFile.copy(newTrExt.pathToImage); } printo('Did Update Metadata: $didUpdate', isError: !didUpdate); if (onEdit != null) onEdit(didUpdate, error, track); diff --git a/lib/ui/dialogs/edit_tags_dialog.dart b/lib/ui/dialogs/edit_tags_dialog.dart index 5b3c888e..ab9d15e5 100644 --- a/lib/ui/dialogs/edit_tags_dialog.dart +++ b/lib/ui/dialogs/edit_tags_dialog.dart @@ -494,7 +494,7 @@ Future _editSingleTrackTagsDialog(Track track, Color? colorScheme) async { key: Key(currentImagePath.value), thumbnailSize: Get.width / 3, bytes: currentImagePath.value != '' ? null : artwork?.bytes, - path: currentImagePath.value != '' ? currentImagePath.value : track.pathToImage, + path: currentImagePath.value != '' ? currentImagePath.value : null, onTopWidgets: [ Positioned( bottom: 0,