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:
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