forked from ReVanced/revanced-patches
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(Tiktok - Playback speed): Remember playback speed (ReVanced#2506)
Co-authored-by: oSumAtrIX <[email protected]>
- Loading branch information
Showing
6 changed files
with
90 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 56 additions & 23 deletions
79
src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,49 +1,82 @@ | ||
package app.revanced.patches.tiktok.interaction.speed | ||
|
||
import app.revanced.patcher.data.BytecodeContext | ||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction | ||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions | ||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction | ||
import app.revanced.patcher.patch.BytecodePatch | ||
import app.revanced.patcher.patch.PatchException | ||
import app.revanced.patcher.patch.annotation.CompatiblePackage | ||
import app.revanced.patcher.patch.annotation.Patch | ||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod | ||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.SpeedControlParentFingerprint | ||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.GetSpeedFingerprint | ||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.OnRenderFirstFrameFingerprint | ||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.SetSpeedFingerprint | ||
import app.revanced.util.exception | ||
import app.revanced.util.getReference | ||
import app.revanced.util.indexOfFirstInstruction | ||
import com.android.tools.smali.dexlib2.Opcode | ||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c | ||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11x | ||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference | ||
|
||
@Patch( | ||
name = "Playback speed", | ||
description = "Enables the playback speed option for all videos.", | ||
description = "Enables the playback speed option for all videos and " + | ||
"retains the speed configurations in between videos.", | ||
compatiblePackages = [ | ||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]), | ||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"]) | ||
] | ||
) | ||
@Suppress("unused") | ||
object PlaybackSpeedPatch : BytecodePatch(setOf(SpeedControlParentFingerprint)) { | ||
object PlaybackSpeedPatch : BytecodePatch( | ||
setOf( | ||
GetSpeedFingerprint, | ||
OnRenderFirstFrameFingerprint, | ||
SetSpeedFingerprint | ||
) | ||
) { | ||
override fun execute(context: BytecodeContext) { | ||
SpeedControlParentFingerprint.result?.mutableMethod?.apply { | ||
val targetMethodCallIndex = indexOfFirstInstruction { | ||
if (opcode == Opcode.INVOKE_STATIC) { | ||
val paramsTypes = ((this as Instruction35c).reference as MethodReference).parameterTypes | ||
paramsTypes.size == 1 && paramsTypes[0].contains("/Aweme;") | ||
} else false | ||
} | ||
SetSpeedFingerprint.result?.let { onVideoSwiped -> | ||
// Remember the playback speed of the current video. | ||
GetSpeedFingerprint.result?.mutableMethod?.apply { | ||
val injectIndex = indexOfFirstInstruction { getReference<MethodReference>()?.returnType == "F" } + 2 | ||
val register = getInstruction<Instruction11x>(injectIndex - 1).registerA | ||
|
||
val isSpeedEnableMethod = context | ||
.toMethodWalker(this) | ||
.nextMethod(targetMethodCallIndex, true) | ||
.getMethod() as MutableMethod | ||
addInstruction( | ||
injectIndex, | ||
"invoke-static { v$register }," + | ||
" Lapp/revanced/tiktok/speed/SpeedPatch;->rememberPlaybackSpeed(F)V" | ||
) | ||
} ?: throw GetSpeedFingerprint.exception | ||
|
||
isSpeedEnableMethod.addInstructions( | ||
// By default, the playback speed will reset to 1.0 at the start of each video. | ||
// Instead, override it with the desired playback speed. | ||
OnRenderFirstFrameFingerprint.result?.mutableMethod?.addInstructions( | ||
0, | ||
""" | ||
const/4 v0, 0x1 | ||
return v0 | ||
# Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method. | ||
const/4 v0, 0x1 | ||
invoke-virtual {p0, v0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getEnterFrom(Z)Ljava/lang/String; | ||
move-result-object v0 | ||
# Model of current video retrieved using getCurrentAweme method. | ||
invoke-virtual {p0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme; | ||
move-result-object v1 | ||
# Desired playback speed retrieved using getPlaybackSpeed method. | ||
invoke-static {}, Lapp/revanced/tiktok/speed/SpeedPatch;->getPlaybackSpeed()F | ||
move-result-object v2 | ||
invoke-static { v0, v1, v2 }, ${onVideoSwiped.method} | ||
""" | ||
) ?: throw OnRenderFirstFrameFingerprint.exception | ||
|
||
// Force enable the playback speed option for all videos. | ||
onVideoSwiped.mutableClass.methods.find { method -> method.returnType == "Z" }?.addInstructions( | ||
0, | ||
""" | ||
) | ||
} ?: throw SpeedControlParentFingerprint.exception | ||
const/4 v0, 0x1 | ||
return v0 | ||
""" | ||
) ?: throw PatchException("Failed to force enable the playback speed option.") | ||
} ?: throw SetSpeedFingerprint.exception | ||
} | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
.../kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/GetSpeedFingerprint.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package app.revanced.patches.tiktok.interaction.speed.fingerprints | ||
|
||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
|
||
internal object GetSpeedFingerprint : MethodFingerprint( | ||
customFingerprint = { methodDef, _ -> | ||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onFeedSpeedSelectedEvent" | ||
} | ||
) |
9 changes: 9 additions & 0 deletions
9
...p/revanced/patches/tiktok/interaction/speed/fingerprints/OnRenderFirstFrameFingerprint.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package app.revanced.patches.tiktok.interaction.speed.fingerprints | ||
|
||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
|
||
internal object OnRenderFirstFrameFingerprint : MethodFingerprint( | ||
customFingerprint = { methodDef, _ -> | ||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onRenderFirstFrame" | ||
} | ||
) |
16 changes: 16 additions & 0 deletions
16
.../kotlin/app/revanced/patches/tiktok/interaction/speed/fingerprints/SetSpeedFingerprint.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package app.revanced.patches.tiktok.interaction.speed.fingerprints | ||
|
||
import app.revanced.patcher.extensions.or | ||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
import com.android.tools.smali.dexlib2.AccessFlags | ||
|
||
internal object SetSpeedFingerprint : MethodFingerprint( | ||
returnType = "V", | ||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, | ||
parameters = listOf( | ||
"Ljava/lang/String;", | ||
"Lcom/ss/android/ugc/aweme/feed/model/Aweme;", | ||
"F" | ||
), | ||
strings = listOf("enterFrom") | ||
) |
13 changes: 0 additions & 13 deletions
13
...p/revanced/patches/tiktok/interaction/speed/fingerprints/SpeedControlParentFingerprint.kt
This file was deleted.
Oops, something went wrong.