commit dc5b91a42ad3a741d59ec010e4eb442a8d8e7800
parent 4e4f77a21323907b612979904495aa93cada7af3
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Fri,  4 Jul 2025 18:57:30 +0200

refactor: remove deprecated transcript api

Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>

Diffstat:
Mcommon/src/main/assets/lang/en_US.json | 8--------
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Experimental.kt | 2--
Dcommon/src/main/kotlin/me/rhunk/snapenhance/common/util/TranscriptApi.kt | 46----------------------------------------------
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/BetterTranscript.kt | 34----------------------------------
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Notifications.kt | 25-------------------------
5 files changed, 0 insertions(+), 115 deletions(-)

diff --git a/common/src/main/assets/lang/en_US.json b/common/src/main/assets/lang/en_US.json @@ -1056,14 +1056,6 @@ "preferred_transcription_lang": { "name": "Preferred Transcription Language", "description": "The preferred language for the voice note transcript (e.g. EN, ES, FR)" - }, - "enhanced_transcript": { - "name": "Enhanced Transcript", - "description": "Improves the voice note transcript using DeepL.\nBefore using this feature, please ensure that you have read their privacy policy." - }, - "enhanced_transcript_in_notifications": { - "name": "Enhanced Transcript in Notifications", - "description": "Transcribes voice notes in notifications using DeepL. This requires the Chat Preview feature to be enabled in Better Notifications" } } }, diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Experimental.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/impl/Experimental.kt @@ -20,8 +20,6 @@ class Experimental : ConfigContainer() { class BetterTranscriptConfig: ConfigContainer(hasGlobalState = true) { val forceTranscription = boolean("force_transcription") { requireRestart() } val preferredTranscriptionLang = string("preferred_transcription_lang") { requireRestart() } - val enhancedTranscript = boolean("enhanced_transcript") { requireRestart(); addNotices(FeatureNotice.UNSTABLE) } - val enhancedTranscriptInNotifications = boolean("enhanced_transcript_in_notifications") { requireRestart(); addNotices(FeatureNotice.UNSTABLE) } } class ComposerHooksConfig: ConfigContainer(hasGlobalState = true) { diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/util/TranscriptApi.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/util/TranscriptApi.kt @@ -1,46 +0,0 @@ -package me.rhunk.snapenhance.common.util - -import com.google.gson.JsonParser -import me.rhunk.snapenhance.common.Constants -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody - - -class TranscriptApi( - private val okHttpClient: OkHttpClient = OkHttpClient.Builder().addInterceptor { - it.proceed(it.request().newBuilder().header("User-Agent", Constants.USER_AGENT).build()) - }.build() -) { - private fun genDlClearance() = okHttpClient.newCall( - Request("https://clearance.deepl.com/token".toHttpUrl()) - ).execute().use { response -> - val cookie = response.headers.firstOrNull { it.first.lowercase() == "set-cookie" && it.second.contains("dl_clearance", ignoreCase = true) } - cookie?.second?.substringBefore(";")?.substringAfter("dl_clearance=") - } - - fun transcribe( - body: RequestBody, - lang: String? = null, - ): String? { - val clearance = genDlClearance() ?: return null - val url = "https://voice-pro.www.deepl.com/sync/transcribe".toHttpUrl().newBuilder() - .apply { - lang?.let { addQueryParameter("lang", it) } - } - .build() - val request = Request(url, headers = Headers.headersOf( - "Cookie", "dl_clearance=$clearance", - "Content-Type", "audio/webm" - ), method = "POST", body = body) - return okHttpClient.newCall(request).execute().use { response -> - if (!response.isSuccessful) return@use null - val jsonObject = JsonParser.parseString(response.body.string()).asJsonObject - jsonObject.getAsJsonArray("segments").fold("") { text, segment -> - text + segment.asJsonObject.getAsJsonPrimitive("text").asString - }.trim() - } - } -} diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/BetterTranscript.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/experiments/BetterTranscript.kt @@ -1,22 +1,15 @@ package me.rhunk.snapenhance.core.features.impl.experiments import me.rhunk.snapenhance.common.data.ContentType -import me.rhunk.snapenhance.common.util.TranscriptApi import me.rhunk.snapenhance.common.util.protobuf.ProtoEditor import me.rhunk.snapenhance.core.event.events.impl.BuildMessageEvent import me.rhunk.snapenhance.core.features.Feature -import me.rhunk.snapenhance.core.util.dataBuilder import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.hook import me.rhunk.snapenhance.core.util.ktx.getObjectFieldOrNull import me.rhunk.snapenhance.core.util.ktx.setObjectField -import okhttp3.RequestBody.Companion.toRequestBody -import java.lang.reflect.Method -import java.nio.ByteBuffer class BetterTranscript: Feature("Better Transcript") { - val transcriptApi by lazy { TranscriptApi() } - override fun init() { if (context.config.experimental.betterTranscript.globalState != true) return @@ -40,33 +33,6 @@ class BetterTranscript: Feature("Better Transcript") { } findClass("com.snapchat.client.voiceml.IVoiceMLSDK\$CppProxy").hook("asrTranscribe", HookStage.BEFORE) { param -> - if (config.enhancedTranscript.get()) { - val buffer = param.arg<ByteBuffer>(2).let { - it.rewind() - ByteArray(it.remaining()).also { it1 -> it.get(it1); it.rewind() } - } - val result = runCatching { - transcriptApi.transcribe( - buffer.toRequestBody(), - lang = config.preferredTranscriptionLang.getNullable()?.takeIf { - it.isNotBlank() - }?.uppercase() - ) - }.onFailure { - context.log.error("Failed to transcribe audio", it) - context.shortToast("Failed to transcribe audio! Check logcat for more details.") - }.getOrNull() - - param.setResult( - (param.method() as Method).returnType.dataBuilder { - set("mError", result == null) - set("mNlpResponses", ArrayList<Any>()) - set("mWordInfo", ArrayList<Any>()) - set("mTranscription", result) - } - ) - return@hook - } preferredTranscriptionLang?.lowercase()?.let { val asrConfig = param.arg<Any>(1) asrConfig.getObjectFieldOrNull("mBaseConfig")?.apply { diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Notifications.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/messaging/Notifications.kt @@ -24,9 +24,7 @@ import me.rhunk.snapenhance.core.event.events.impl.SnapWidgetBroadcastReceiveEve import me.rhunk.snapenhance.core.features.Feature import me.rhunk.snapenhance.core.features.impl.FriendMutationObserver import me.rhunk.snapenhance.core.features.impl.downloader.MediaDownloader -import me.rhunk.snapenhance.core.features.impl.downloader.decoder.AttachmentType import me.rhunk.snapenhance.core.features.impl.downloader.decoder.MessageDecoder -import me.rhunk.snapenhance.core.features.impl.experiments.BetterTranscript import me.rhunk.snapenhance.core.features.impl.spying.StealthMode import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.findRestrictedConstructor @@ -36,7 +34,6 @@ import me.rhunk.snapenhance.core.util.ktx.setObjectField import me.rhunk.snapenhance.core.util.media.PreviewUtils import me.rhunk.snapenhance.core.wrapper.impl.Message import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID -import okhttp3.RequestBody.Companion.toRequestBody import kotlin.coroutines.suspendCoroutine class Notifications : Feature("Notifications") { @@ -390,28 +387,6 @@ class Notifications : Feature("Notifications") { }" } - if (contentType == ContentType.NOTE && context.config.experimental.betterTranscript.takeIf { it.globalState == true }?.enhancedTranscriptInNotifications?.get() == true) { - val transcriptApi = context.feature(BetterTranscript::class).transcriptApi - MessageDecoder.decode(message.messageContent!!).firstOrNull { it.type == AttachmentType.NOTE }?.also { media -> - runCatching { - media.openStream { mediaStream, length -> - if (mediaStream == null || length > 25 * 1024 * 1024) { - context.log.error("Failed to open media stream or media is too large") - return@openStream - } - val text = transcriptApi.transcribe( - mediaStream.readBytes().toRequestBody(), - lang = context.config.experimental.betterTranscript.preferredTranscriptionLang.getNullable()?.takeIf { it.isNotBlank() } - )?.takeIf { it.isNotBlank() } ?: return@openStream - serializedMessage = "\uD83C\uDFA4 $text" - isChatMessage = true - } - }.onFailure { - context.log.error("Failed to transcribe message", it) - } - } - } - if (isChatMessage || config.stackedMediaMessages.get()) { setNotificationText(serializedMessage) } else {