mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-05-18 15:17:10 +02:00
fix: video length restriction
This commit is contained in:
parent
fc94117029
commit
fe0b82c75b
@ -1,25 +1,17 @@
|
|||||||
package me.rhunk.snapenhance.features.impl.tweaks
|
package me.rhunk.snapenhance.features.impl.tweaks
|
||||||
|
|
||||||
import me.rhunk.snapenhance.config.ConfigProperty
|
|
||||||
import me.rhunk.snapenhance.features.Feature
|
import me.rhunk.snapenhance.features.Feature
|
||||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||||
import me.rhunk.snapenhance.hook.HookStage
|
import me.rhunk.snapenhance.hook.HookStage
|
||||||
import me.rhunk.snapenhance.hook.Hooker
|
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) {
|
class DisableVideoLengthRestriction : Feature("DisableVideoLengthRestriction", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||||
override fun asyncOnActivityCreate() {
|
override fun asyncOnActivityCreate() {
|
||||||
val gridMediaItem = context.mappings.getMappedClass("GridMediaItem")
|
val defaultMediaItem = context.mappings.getMappedClass("DefaultMediaItem")
|
||||||
val gridMediaItemDurationFieldName = context.mappings.getMappedValue("GridMediaItemDurationField")
|
|
||||||
|
|
||||||
Hooker.hookConstructor(gridMediaItem, HookStage.AFTER, {
|
Hooker.hookConstructor(defaultMediaItem, HookStage.BEFORE) { param ->
|
||||||
context.config.bool(ConfigProperty.DISABLE_VIDEO_LENGTH_RESTRICTION)
|
//set the video length argument
|
||||||
}) {param ->
|
param.setArg(5, -1L)
|
||||||
val durationMs = param.thisObject<Any>().getObjectField(gridMediaItemDurationFieldName) as Double
|
|
||||||
if (durationMs > 60000) {
|
|
||||||
param.thisObject<Any>().setObjectField(gridMediaItemDurationFieldName, 60000)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ import me.rhunk.snapenhance.mapping.Mapper
|
|||||||
import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
|
import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.CallbackMapper
|
import me.rhunk.snapenhance.mapping.impl.CallbackMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.EnumMapper
|
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.OperaPageViewControllerMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper
|
import me.rhunk.snapenhance.mapping.impl.PlatformAnalyticsCreatorMapper
|
||||||
import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper
|
import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper
|
||||||
@ -30,7 +30,7 @@ class MappingManager(private val context: ModContext) : Manager {
|
|||||||
add(EnumMapper())
|
add(EnumMapper())
|
||||||
add(OperaPageViewControllerMapper())
|
add(OperaPageViewControllerMapper())
|
||||||
add(PlusSubscriptionMapper())
|
add(PlusSubscriptionMapper())
|
||||||
add(GridMediaItemMapper())
|
add(DefaultMediaItemMapper())
|
||||||
add(BCryptClassMapper())
|
add(BCryptClassMapper())
|
||||||
add(PlatformAnalyticsCreatorMapper())
|
add(PlatformAnalyticsCreatorMapper())
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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"]}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user