commit c070dd5c830f0646d911d3701d5c7085058a8698
parent f95fae197a9fa9c93d9c6ffd34abd1c22b2f9a88
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Fri, 26 May 2023 18:20:01 +0200

feat: disable video length restriction

Diffstat:
Mapp/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt | 6++++++
Aapp/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt | 26++++++++++++++++++++++++++
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt | 2++
Mapp/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt | 2++
Aapp/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt | 28++++++++++++++++++++++++++++
5 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt @@ -173,6 +173,12 @@ enum class ConfigProperty( ConfigCategory.TWEAKS, ConfigStateValue(false) ), + DISABLE_VIDEO_LENGTH_RESTRICTION( + "property.disable_video_length_restriction", + "description.disable_video_length_restriction", + ConfigCategory.TWEAKS, + ConfigStateValue(false) + ), BLOCK_ADS("property.block_ads", "description.block_ads", ConfigCategory.TWEAKS, ConfigStateValue(false)), STREAK_EXPIRATION_INFO( "property.streak_expiration_info", diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/DisableVideoLengthRestriction.kt @@ -0,0 +1,25 @@ +package me.rhunk.snapenhance.features.impl.extras + +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") + + 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) + } + } + } +}+ \ No newline at end of file diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt @@ -10,6 +10,7 @@ import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave import me.rhunk.snapenhance.features.impl.extras.AutoSave +import me.rhunk.snapenhance.features.impl.extras.DisableVideoLengthRestriction import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap import me.rhunk.snapenhance.features.impl.extras.Notifications import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus @@ -66,6 +67,7 @@ class FeatureManager(private val context: ModContext) : Manager { register(ExternalMediaAsSnap::class) register(AntiAutoSave::class) register(UnlimitedSnapViewTime::class) + register(DisableVideoLengthRestriction::class) initializeFeatures() } diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt @@ -14,6 +14,7 @@ import me.rhunk.snapenhance.manager.Manager import me.rhunk.snapenhance.mapping.Mapper 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.OperaPageViewControllerMapper import me.rhunk.snapenhance.mapping.impl.PlusSubscriptionMapper import me.rhunk.snapenhance.util.getObjectField @@ -27,6 +28,7 @@ class MappingManager(private val context: ModContext) : Manager { add(EnumMapper()) add(OperaPageViewControllerMapper()) add(PlusSubscriptionMapper()) + add(GridMediaItemMapper()) } private val mappings = ConcurrentHashMap<String, Any>() diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/GridMediaItemMapper.kt @@ -0,0 +1,27 @@ +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.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"]}") + } + } + } +}+ \ No newline at end of file