From c0c395b100e319cd9f0ff73ec2b515618b3fabfd Mon Sep 17 00:00:00 2001 From: DarkKnight2122 <145188583+DarkKnight2122@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:16:02 +0530 Subject: [PATCH] FFmpeg stability fixes --- .../purrfectsnap/bridge/BridgeService.kt | 38 ++++++++++--------- .../purrfectsnap/download/FFMpegProcessor.kt | 12 +++--- .../purrfectsnap/ui/manager/data/Updater.kt | 6 +-- .../ui/manager/pages/home/HomeSettings.kt | 2 +- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/bridge/BridgeService.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/bridge/BridgeService.kt index 00c36f19..88e661b6 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/bridge/BridgeService.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/bridge/BridgeService.kt @@ -231,29 +231,31 @@ class BridgeService : Service() { chunkIndex: Int, totalChunks: Int ) { - if (chunkIndex == 0) { - friendAccumulator.clear() - groupAccumulator.clear() - } + synchronized(friendAccumulator) { + if (chunkIndex == 0) { + friendAccumulator.clear() + groupAccumulator.clear() + } - remoteSideContext.log.verbose("Received chunk $chunkIndex/$totalChunks: ${groups.size} groups, ${friends.size} friends") - friendAccumulator.addAll(friends.mapNotNull { toParcelable(it) }) - groupAccumulator.addAll(groups.mapNotNull { toParcelable(it) }) + remoteSideContext.log.verbose("Received chunk $chunkIndex/$totalChunks: ${groups.size} groups, ${friends.size} friends") + friendAccumulator.addAll(friends.mapNotNull { toParcelable(it) }) + groupAccumulator.addAll(groups.mapNotNull { toParcelable(it) }) - if (chunkIndex == totalChunks - 1) { - val finalFriends = friendAccumulator.toList() - val finalGroups = groupAccumulator.toList() + if (chunkIndex == totalChunks - 1) { + val finalFriends = friendAccumulator.toList() + val finalGroups = groupAccumulator.toList() - friendAccumulator.clear() - groupAccumulator.clear() + friendAccumulator.clear() + groupAccumulator.clear() - remoteSideContext.coroutineScope.launch(Dispatchers.IO) { - pendingSocialSnapshotCallback?.let { callback -> - pendingSocialSnapshotCallback = null - callback(finalFriends, finalGroups) + remoteSideContext.coroutineScope.launch(Dispatchers.IO) { + pendingSocialSnapshotCallback?.let { callback -> + pendingSocialSnapshotCallback = null + callback(finalFriends, finalGroups) + } + remoteSideContext.database.replaceMessagingData(finalFriends, finalGroups) + remoteSideContext.database.messagingDataFlow.tryEmit(finalFriends to finalGroups) } - remoteSideContext.database.replaceMessagingData(finalFriends, finalGroups) - remoteSideContext.database.messagingDataFlow.tryEmit(finalFriends to finalGroups) } } } diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt index 4778968b..25d464f0 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt @@ -211,7 +211,7 @@ class FFMpegProcessor( filterSecondPart.append("[v$index][$index:a]") } else { containsNoSound = true - filterSecondPart.append("[v$index][${filesInfo.size}]") + filterSecondPart.append("[v$index][${filesInfo.size}:a]") } inputArguments += "-i" to file } @@ -228,9 +228,9 @@ class FFMpegProcessor( outputArguments += "-fps_mode" to "vfr" - outputArguments += "-filter_complex" to "\"$filterFirstPart ${filterSecondPart}concat=n=${filesInfo.size}:v=1:a=1[vout][aout]\"" - outputArguments += "-map" to "\"[aout]\"" - outputArguments += "-map" to "\"[vout]\"" + outputArguments += "-filter_complex" to "$filterFirstPart ${filterSecondPart}concat=n=${filesInfo.size}:v=1:a=1[vout][aout]" + outputArguments += "-map" to "[aout]" + outputArguments += "-map" to "[vout]" } finally { filesInfo.forEach { it.second.close() } } @@ -264,8 +264,8 @@ class FFMpegProcessor( filterParts.append("[a$index]") } filterParts.append("amix=inputs=${args.inputs.size}:duration=longest:normalize=0[aout]") - outputArguments += "-filter_complex" to "\"$filterParts\"" - outputArguments += "-map" to "\"[aout]\"" + outputArguments += "-filter_complex" to filterParts.toString() + outputArguments += "-map" to "[aout]" } } outputArguments += args.output.absolutePath diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt index a93096e2..17d439a4 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt @@ -112,11 +112,11 @@ object Updater { private val cache = mutableMapOf() fun getLatestRelease(channel: Channel): LatestRelease? { - return cache.getOrPut(Channel.STABLE) { - if (BuildConfig.DEBUG) { + return cache.getOrPut(channel) { + if (BuildConfig.DEBUG && channel == Channel.STABLE) { fetchLatestDebugCI() ?: fetchLatestRelease(Channel.STABLE) } else { - fetchLatestRelease(Channel.STABLE) + fetchLatestRelease(channel) } } } diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt index a5053061..0df68729 100644 --- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt +++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt @@ -97,7 +97,7 @@ class HomeSettings : Routes.Route() { workManager.enqueueUniquePeriodicWork( "purrfectsnap_update_check", - ExistingPeriodicWorkPolicy.KEEP, + ExistingPeriodicWorkPolicy.REPLACE, workRequest ) } else {