commit e144c932808ec9e1ca638d6ce717d55c6fc265cd
parent d3e0c616f8e5388c8aa5ced00fe0bf9ef5ca24f1
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Mon, 28 Aug 2023 18:18:49 +0200

fix(video_length_bypass): story black videos

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/EventDispatcher.kt | 7+++++--
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/SendMessageWithContentEvent.kt | 2++
Mcore/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/DisableVideoLengthRestriction.kt | 33+++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/EventDispatcher.kt b/core/src/main/kotlin/me/rhunk/snapenhance/EventDispatcher.kt @@ -10,6 +10,7 @@ import me.rhunk.snapenhance.core.eventbus.events.impl.OnSnapInteractionEvent import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.core.eventbus.events.impl.SnapWidgetBroadcastReceiveEvent import me.rhunk.snapenhance.data.wrapper.impl.MessageContent +import me.rhunk.snapenhance.data.wrapper.impl.MessageDestinations import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID import me.rhunk.snapenhance.hook.HookStage import me.rhunk.snapenhance.hook.hook @@ -23,8 +24,10 @@ class EventDispatcher( ) : Manager { override fun init() { context.classCache.conversationManager.hook("sendMessageWithContent", HookStage.BEFORE) { param -> - val messageContent = MessageContent(param.arg(1)) - context.event.post(SendMessageWithContentEvent(messageContent).apply { adapter = param })?.also { + context.event.post(SendMessageWithContentEvent( + destinations = MessageDestinations(param.arg(0)), + messageContent = MessageContent(param.arg(1)) + ).apply { adapter = param })?.also { if (it.canceled) { param.setResult(null) } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/SendMessageWithContentEvent.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/eventbus/events/impl/SendMessageWithContentEvent.kt @@ -2,7 +2,9 @@ package me.rhunk.snapenhance.core.eventbus.events.impl import me.rhunk.snapenhance.core.eventbus.events.AbstractHookEvent import me.rhunk.snapenhance.data.wrapper.impl.MessageContent +import me.rhunk.snapenhance.data.wrapper.impl.MessageDestinations class SendMessageWithContentEvent( + val destinations: MessageDestinations, val messageContent: MessageContent ) : AbstractHookEvent() \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/DisableVideoLengthRestriction.kt b/core/src/main/kotlin/me/rhunk/snapenhance/features/impl/tweaks/DisableVideoLengthRestriction.kt @@ -1,15 +1,48 @@ package me.rhunk.snapenhance.features.impl.tweaks +import android.os.Build +import android.os.FileObserver +import com.google.gson.JsonParser +import me.rhunk.snapenhance.Logger +import me.rhunk.snapenhance.core.eventbus.events.impl.SendMessageWithContentEvent import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.FeatureLoadParams import me.rhunk.snapenhance.hook.HookStage import me.rhunk.snapenhance.hook.Hooker +import java.io.File class DisableVideoLengthRestriction : Feature("DisableVideoLengthRestriction", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) { + private lateinit var fileObserver: FileObserver + override fun asyncOnActivityCreate() { val defaultMediaItem = context.mappings.getMappedClass("DefaultMediaItem") val isState by context.config.global.disableVideoLengthRestrictions + //fix black videos when story is posted + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val postedStorySnapFolder = File(context.androidContext.filesDir, "file_manager/posted_story_snap") + + fileObserver = (object : FileObserver(postedStorySnapFolder, MOVED_TO) { + override fun onEvent(event: Int, path: String?) { + if (event != MOVED_TO || path?.endsWith("posted_story_snap.2") != true) return + fileObserver.stopWatching() + + val file = File(postedStorySnapFolder, path) + runCatching { + val fileContent = JsonParser.parseReader(file.reader()).asJsonObject + if (fileContent["timerOrDuration"].asLong < 0) file.delete() + }.onFailure { + Logger.error("Failed to read story metadata file", it) + } + } + }) + + context.event.subscribe(SendMessageWithContentEvent::class) { event -> + if (event.destinations.stories.isEmpty()) return@subscribe + fileObserver.startWatching() + } + } + Hooker.hookConstructor(defaultMediaItem, HookStage.BEFORE, { isState }) { param -> //set the video length argument param.setArg(5, -1L)