fix: video length restriction

This commit is contained in:
rhunk 2023-06-04 17:01:02 +02:00
parent fc94117029
commit fe0b82c75b
4 changed files with 30 additions and 42 deletions

View File

@ -1,25 +1,17 @@
package me.rhunk.snapenhance.features.impl.tweaks
import me.rhunk.snapenhance.config.ConfigProperty
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 me.rhunk.snapenhance.util.getObjectField
import me.rhunk.snapenhance.util.setObjectField
class DisableVideoLengthRestriction : Feature("DisableVideoLengthRestriction", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
override fun asyncOnActivityCreate() {
val gridMediaItem = context.mappings.getMappedClass("GridMediaItem")
val gridMediaItemDurationFieldName = context.mappings.getMappedValue("GridMediaItemDurationField")
val defaultMediaItem = context.mappings.getMappedClass("DefaultMediaItem")
Hooker.hookConstructor(gridMediaItem, HookStage.AFTER, {
context.config.bool(ConfigProperty.DISABLE_VIDEO_LENGTH_RESTRICTION)
}) {param ->
val durationMs = param.thisObject<Any>().getObjectField(gridMediaItemDurationFieldName) as Double
if (durationMs > 60000) {
param.thisObject<Any>().setObjectField(gridMediaItemDurationFieldName, 60000)
}
Hooker.hookConstructor(defaultMediaItem, HookStage.BEFORE) { param ->
//set the video length argument
param.setArg(5, -1L)
}
}
}

View File

@ -15,7 +15,7 @@ import me.rhunk.snapenhance.mapping.Mapper
import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
import me.rhunk.snapenhance.mapping.impl.CallbackMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper
import me.rhunk.snapenhance.mapping.impl.DefaultMediaItemMapper
import me.rhunk.snapenhance.mapping.impl.OperaPageViewControllerMapper
import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper
import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper
@ -30,7 +30,7 @@ class MappingManager(private val context: ModContext) : Manager {
add(EnumMapper())
add(OperaPageViewControllerMapper())
add(PlusSubscriptionMapper())
add(GridMediaItemMapper())
add(DefaultMediaItemMapper())
add(BCryptClassMapper())
add(PlatformAnalyticsCreatorMapper())
}

View File

@ -0,0 +1,24 @@
package me.rhunk.snapenhance.mapping.impl
import android.net.Uri
import me.rhunk.snapenhance.mapping.Mapper
import java.lang.reflect.Modifier
class DefaultMediaItemMapper : Mapper() {
override fun useClasses(
classLoader: ClassLoader,
classes: List<Class<*>>,
mappings: MutableMap<String, Any>
) {
for (clazz in classes) {
if (clazz.superclass == null || !Modifier.isAbstract(clazz.superclass.modifiers)) continue
if (clazz.superclass.interfaces.isEmpty() || clazz.superclass.interfaces[0] != Comparable::class.java) continue
if (clazz.methods.none { it.returnType == Uri::class.java }) continue
val constructorParameters = clazz.constructors[0]?.parameterTypes ?: continue
if (constructorParameters.size < 6 || constructorParameters[5] != Long::class.javaPrimitiveType) continue
mappings["DefaultMediaItem"] = clazz.name
}
}
}

View File

@ -1,28 +0,0 @@
package me.rhunk.snapenhance.mapping.impl
import me.rhunk.snapenhance.Logger
import me.rhunk.snapenhance.mapping.Mapper
class GridMediaItemMapper : Mapper() {
override fun useClasses(
classLoader: ClassLoader,
classes: List<Class<*>>,
mappings: MutableMap<String, Any>
) {
for (clazz in classes) {
if (clazz.isEnum || clazz.isInterface) continue
if (clazz.annotations.isEmpty()) continue
if (!clazz.annotations[0].toString().contains("typeReferences")) continue
clazz.declaredFields.firstOrNull {
it.annotations.isNotEmpty() && it.annotations[0].toString().contains("cameraRollSource")
}?.let {
mappings["GridMediaItem"] = clazz.name
mappings["GridMediaItemDurationField"] = clazz.declaredFields.first {
it.annotations.isNotEmpty() && it.annotations[0].toString().contains("durationMs")
}.name
Logger.debug("Found GridMediaItem: ${clazz.name}, durationMs: ${mappings["GridMediaItemDurationField"]}")
}
}
}
}