feat: disable video length restriction
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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>()
|
||||
|
||||
@@ -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"]}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user