diff --git a/extensions/baconreader/build.gradle.kts b/extensions/baconreader/build.gradle.kts
new file mode 100644
index 000000000..804e90884
--- /dev/null
+++ b/extensions/baconreader/build.gradle.kts
@@ -0,0 +1,5 @@
+dependencies {
+ compileOnly(project(":extensions:shared:library"))
+ compileOnly(libs.annotation)
+ compileOnly(libs.okhttp)
+}
diff --git a/extensions/baconreader/src/main/AndroidManifest.xml b/extensions/baconreader/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..9b65eb06c
--- /dev/null
+++ b/extensions/baconreader/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java
new file mode 100644
index 000000000..943da63fa
--- /dev/null
+++ b/extensions/baconreader/src/main/java/app/revanced/extension/baconreader/FixRedgifsApiPatch.java
@@ -0,0 +1,22 @@
+package app.revanced.extension.baconreader;
+
+import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch;
+import okhttp3.OkHttpClient;
+
+/**
+ * @noinspection unused
+ */
+public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch {
+ static {
+ INSTANCE = new FixRedgifsApiPatch();
+ }
+
+ public String getDefaultUserAgent() {
+ // BaconReader uses a static user agent for Redgifs API calls
+ return "BaconReader";
+ }
+
+ public static OkHttpClient install(OkHttpClient.Builder builder) {
+ return builder.addInterceptor(INSTANCE).build();
+ }
+}
diff --git a/patches/api/patches.api b/patches/api/patches.api
index 8b275fc72..d57f9cd93 100644
--- a/patches/api/patches.api
+++ b/patches/api/patches.api
@@ -535,6 +535,14 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo
public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
+public final class app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatchKt {
+ public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
+public final class app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatchKt {
+ public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
+}
+
public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatchKt {
public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt
new file mode 100644
index 000000000..524beeea0
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt
@@ -0,0 +1,13 @@
+package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs
+
+import app.revanced.patcher.fingerprint
+import com.android.tools.smali.dexlib2.AccessFlags
+
+
+internal val getOkHttpClientFingerprint = fingerprint {
+ returns("Lokhttp3/OkHttpClient;")
+ parameters()
+ custom { method, classDef ->
+ classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient"
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt
new file mode 100644
index 000000000..4cd9db006
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt
@@ -0,0 +1,53 @@
+package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs
+
+import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
+import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
+import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
+import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
+import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD
+import app.revanced.patches.reddit.customclients.baconreader.misc.extension.sharedExtensionPatch
+import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch
+import app.revanced.util.getReference
+import app.revanced.util.indexOfFirstInstructionOrThrow
+import com.android.tools.smali.dexlib2.Opcode
+import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
+import com.android.tools.smali.dexlib2.iface.reference.MethodReference
+import com.android.tools.smali.dexlib2.iface.reference.TypeReference
+
+internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/baconreader/FixRedgifsApiPatch;"
+
+@Suppress("unused")
+val fixRedgifsApi = fixRedgifsApiPatch(
+ extensionPatch = sharedExtensionPatch
+) {
+ compatibleWith(
+ "com.onelouder.baconreader",
+ "com.onelouder.baconreader.premium",
+ )
+
+ execute {
+ // region Patch Redgifs OkHttp3 client.
+
+ getOkHttpClientFingerprint.method.apply {
+ // Remove conflicting OkHttp interceptors.
+ val originalInterceptorInstallIndex = indexOfFirstInstructionOrThrow {
+ opcode == Opcode.NEW_INSTANCE && getReference()?.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager\$HeaderInterceptor;"
+ }
+ removeInstructions(originalInterceptorInstallIndex, 5)
+
+ val index = indexOfFirstInstructionOrThrow {
+ val reference = getReference()
+ reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;"
+ }
+ val register = getInstruction(index).registerC
+ replaceInstruction(
+ index,
+ """
+ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD
+ """
+ )
+ }
+
+ // endregion
+ }
+}
diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt
new file mode 100644
index 000000000..64291f761
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatch.kt
@@ -0,0 +1,6 @@
+package app.revanced.patches.reddit.customclients.baconreader.misc.extension
+
+import app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks.initHook
+import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
+
+val sharedExtensionPatch = sharedExtensionPatch("baconreader", initHook)
diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt
new file mode 100644
index 000000000..fe644145b
--- /dev/null
+++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt
@@ -0,0 +1,9 @@
+package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks
+
+import app.revanced.patches.shared.misc.extension.extensionHook
+
+internal val initHook = extensionHook {
+ custom { method, _ ->
+ method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate"
+ }
+}