feat(YouTube Music): Add Disable QUIC protocol patch https://github.com/inotia00/ReVanced_Extended/issues/2763

This commit is contained in:
inotia00 2025-02-28 09:18:40 +09:00
parent e4771f558b
commit ef63c8dba7
16 changed files with 99 additions and 70 deletions

View File

@ -1,11 +0,0 @@
package app.revanced.extension.music.patches.misc;
import app.revanced.extension.music.settings.Settings;
@SuppressWarnings("unused")
public class OpusCodecPatch {
public static boolean enableOpusCodec() {
return Settings.ENABLE_OPUS_CODEC.get();
}
}

View File

@ -190,7 +190,6 @@ public class Settings extends BaseSettings {
public static final BooleanSetting DISABLE_DRC_AUDIO = new BooleanSetting("revanced_disable_drc_audio", FALSE, true); public static final BooleanSetting DISABLE_DRC_AUDIO = new BooleanSetting("revanced_disable_drc_audio", FALSE, true);
public static final BooleanSetting DISABLE_MUSIC_VIDEO_IN_ALBUM = new BooleanSetting("revanced_disable_music_video_in_album", FALSE, true); public static final BooleanSetting DISABLE_MUSIC_VIDEO_IN_ALBUM = new BooleanSetting("revanced_disable_music_video_in_album", FALSE, true);
public static final EnumSetting<RedirectType> DISABLE_MUSIC_VIDEO_IN_ALBUM_REDIRECT_TYPE = new EnumSetting<>("revanced_disable_music_video_in_album_redirect_type", RedirectType.REDIRECT, true); public static final EnumSetting<RedirectType> DISABLE_MUSIC_VIDEO_IN_ALBUM_REDIRECT_TYPE = new EnumSetting<>("revanced_disable_music_video_in_album_redirect_type", RedirectType.REDIRECT, true);
public static final BooleanSetting ENABLE_OPUS_CODEC = new BooleanSetting("revanced_enable_opus_codec", FALSE, true);
public static final BooleanSetting SETTINGS_IMPORT_EXPORT = new BooleanSetting("revanced_extended_settings_import_export", FALSE, false); public static final BooleanSetting SETTINGS_IMPORT_EXPORT = new BooleanSetting("revanced_extended_settings_import_export", FALSE, false);
// PreferenceScreen: Return YouTube Dislike // PreferenceScreen: Return YouTube Dislike

View File

@ -0,0 +1,11 @@
package app.revanced.extension.shared.patches;
import app.revanced.extension.shared.settings.BaseSettings;
@SuppressWarnings("unused")
public class OpusCodecPatch {
public static boolean enableOpusCodec() {
return BaseSettings.ENABLE_OPUS_CODEC.get();
}
}

View File

@ -1,4 +1,4 @@
package app.revanced.extension.youtube.patches.misc; package app.revanced.extension.shared.patches;
import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BaseSettings;

View File

@ -56,6 +56,7 @@ public class BaseSettings {
public static final BooleanSetting DISABLE_AUTO_CAPTIONS = new BooleanSetting("revanced_disable_auto_captions", FALSE, true); public static final BooleanSetting DISABLE_AUTO_CAPTIONS = new BooleanSetting("revanced_disable_auto_captions", FALSE, true);
public static final BooleanSetting DISABLE_QUIC_PROTOCOL = new BooleanSetting("revanced_disable_quic_protocol", FALSE, true); public static final BooleanSetting DISABLE_QUIC_PROTOCOL = new BooleanSetting("revanced_disable_quic_protocol", FALSE, true);
public static final BooleanSetting ENABLE_OPUS_CODEC = new BooleanSetting("revanced_enable_opus_codec", FALSE, true);
public static final BooleanSetting BYPASS_IMAGE_REGION_RESTRICTIONS = new BooleanSetting("revanced_bypass_image_region_restrictions", FALSE, true); public static final BooleanSetting BYPASS_IMAGE_REGION_RESTRICTIONS = new BooleanSetting("revanced_bypass_image_region_restrictions", FALSE, true);
public static final EnumSetting<WatchHistoryType> WATCH_HISTORY_TYPE = new EnumSetting<>("revanced_watch_history_type", WatchHistoryType.REPLACE); public static final EnumSetting<WatchHistoryType> WATCH_HISTORY_TYPE = new EnumSetting<>("revanced_watch_history_type", WatchHistoryType.REPLACE);

View File

@ -1,11 +0,0 @@
package app.revanced.extension.youtube.patches.misc;
import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused")
public class OpusCodecPatch {
public static boolean enableOpusCodec() {
return Settings.ENABLE_OPUS_CODEC.get();
}
}

View File

@ -567,7 +567,6 @@ public class Settings extends BaseSettings {
// Experimental Flags // Experimental Flags
public static final BooleanSetting CHANGE_SHARE_SHEET = new BooleanSetting("revanced_change_share_sheet", FALSE, true); public static final BooleanSetting CHANGE_SHARE_SHEET = new BooleanSetting("revanced_change_share_sheet", FALSE, true);
public static final BooleanSetting ENABLE_OPUS_CODEC = new BooleanSetting("revanced_enable_opus_codec", FALSE, true);
/** /**
* @noinspection DeprecatedIsStillUsed * @noinspection DeprecatedIsStillUsed

View File

@ -2,7 +2,6 @@ package app.revanced.patches.music.misc.codecs
import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.music.utils.extension.Constants.MISC_PATH
import app.revanced.patches.music.utils.patch.PatchList.ENABLE_OPUS_CODEC import app.revanced.patches.music.utils.patch.PatchList.ENABLE_OPUS_CODEC
import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.CategoryType
import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
@ -18,10 +17,8 @@ val opusCodecPatch = resourcePatch(
compatibleWith(COMPATIBLE_PACKAGE) compatibleWith(COMPATIBLE_PACKAGE)
dependsOn( dependsOn(
baseOpusCodecsPatch( settingsPatch,
"$MISC_PATH/OpusCodecPatch;->enableOpusCodec()Z" baseOpusCodecsPatch(),
),
settingsPatch
) )
execute { execute {
@ -30,8 +27,6 @@ val opusCodecPatch = resourcePatch(
"revanced_enable_opus_codec", "revanced_enable_opus_codec",
"false" "false"
) )
updatePatchStatus(ENABLE_OPUS_CODEC) updatePatchStatus(ENABLE_OPUS_CODEC)
} }
} }

View File

@ -0,0 +1,34 @@
package app.revanced.patches.music.misc.quic
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.music.utils.patch.PatchList.DISABLE_QUIC_PROTOCOL
import app.revanced.patches.music.utils.settings.CategoryType
import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
import app.revanced.patches.music.utils.settings.addSwitchPreference
import app.revanced.patches.music.utils.settings.settingsPatch
import app.revanced.patches.shared.quic.baseQuicProtocolPatch
@Suppress("unused", "SpellCheckingInspection")
val quicProtocolPatch = bytecodePatch(
DISABLE_QUIC_PROTOCOL.title,
DISABLE_QUIC_PROTOCOL.summary,
) {
compatibleWith(COMPATIBLE_PACKAGE)
dependsOn(
settingsPatch,
baseQuicProtocolPatch(),
)
execute {
addSwitchPreference(
CategoryType.MISC,
"revanced_disable_quic_protocol",
"false"
)
updatePatchStatus(DISABLE_QUIC_PROTOCOL)
}
}

View File

@ -61,6 +61,10 @@ internal enum class PatchList(
"Disable music video in album", "Disable music video in album",
"Adds option to redirect music videos from albums for non-premium users." "Adds option to redirect music videos from albums for non-premium users."
), ),
DISABLE_QUIC_PROTOCOL(
"Disable QUIC protocol",
"Adds an option to disable CronetEngine's QUIC protocol."
),
ENABLE_OPUS_CODEC( ENABLE_OPUS_CODEC(
"Enable OPUS codec", "Enable OPUS codec",
"Adds an option to enable the OPUS audio codec if the player response includes it." "Adds an option to enable the OPUS audio codec if the player response includes it."

View File

@ -4,6 +4,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.extension.Constants.PATCHES_PATH
import app.revanced.util.fingerprint.matchOrThrow import app.revanced.util.fingerprint.matchOrThrow
import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.getReference import app.revanced.util.getReference
@ -13,9 +14,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
fun baseOpusCodecsPatch( private const val EXTENSION_CLASS_DESCRIPTOR =
descriptor: String, "$PATCHES_PATH/OpusCodecPatch;"
) = bytecodePatch(
fun baseOpusCodecsPatch() = bytecodePatch(
description = "baseOpusCodecsPatch" description = "baseOpusCodecsPatch"
) { ) {
execute { execute {
@ -35,7 +37,7 @@ fun baseOpusCodecsPatch(
addInstructionsWithLabels( addInstructionsWithLabels(
targetIndex + 1, """ targetIndex + 1, """
invoke-static {}, $descriptor invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->enableOpusCodec()Z
move-result v$freeRegister move-result v$freeRegister
if-eqz v$freeRegister, :mp4a if-eqz v$freeRegister, :mp4a
invoke-static {}, $opusCodecReference invoke-static {}, $opusCodecReference

View File

@ -0,0 +1,30 @@
@file:Suppress("SpellCheckingInspection")
package app.revanced.patches.shared.quic
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.extension.Constants.PATCHES_PATH
import app.revanced.util.fingerprint.methodOrThrow
private const val EXTENSION_CLASS_DESCRIPTOR =
"$PATCHES_PATH/QUICProtocolPatch;"
fun baseQuicProtocolPatch() = bytecodePatch(
description = "baseQuicProtocolPatch"
) {
execute {
arrayOf(
cronetEngineBuilderFingerprint,
experimentalCronetEngineBuilderFingerprint
).forEach {
it.methodOrThrow().addInstructions(
0, """
invoke-static {p1}, $EXTENSION_CLASS_DESCRIPTOR->disableQUICProtocol(Z)Z
move-result p1
"""
)
}
}
}

View File

@ -1,6 +1,6 @@
@file:Suppress("SpellCheckingInspection") @file:Suppress("SpellCheckingInspection")
package app.revanced.patches.youtube.misc.quic package app.revanced.patches.shared.quic
import app.revanced.util.fingerprint.legacyFingerprint import app.revanced.util.fingerprint.legacyFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags

View File

@ -3,7 +3,6 @@ package app.revanced.patches.youtube.misc.codecs
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.opus.baseOpusCodecsPatch import app.revanced.patches.shared.opus.baseOpusCodecsPatch
import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.extension.Constants.MISC_PATH
import app.revanced.patches.youtube.utils.patch.PatchList.ENABLE_OPUS_CODEC import app.revanced.patches.youtube.utils.patch.PatchList.ENABLE_OPUS_CODEC
import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference
import app.revanced.patches.youtube.utils.settings.settingsPatch import app.revanced.patches.youtube.utils.settings.settingsPatch
@ -16,16 +15,11 @@ val opusCodecPatch = bytecodePatch(
compatibleWith(COMPATIBLE_PACKAGE) compatibleWith(COMPATIBLE_PACKAGE)
dependsOn( dependsOn(
baseOpusCodecsPatch(
"$MISC_PATH/OpusCodecPatch;->enableOpusCodec()Z"
),
settingsPatch, settingsPatch,
baseOpusCodecsPatch(),
) )
execute { execute {
// region add settings
addPreference( addPreference(
arrayOf( arrayOf(
"PREFERENCE_CATEGORY: MISC_EXPERIMENTAL_FLAGS", "PREFERENCE_CATEGORY: MISC_EXPERIMENTAL_FLAGS",
@ -33,8 +27,5 @@ val opusCodecPatch = bytecodePatch(
), ),
ENABLE_OPUS_CODEC ENABLE_OPUS_CODEC
) )
// endregion
} }
} }

View File

@ -1,47 +1,30 @@
package app.revanced.patches.youtube.misc.quic package app.revanced.patches.youtube.misc.quic
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.quic.baseQuicProtocolPatch
import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.extension.Constants.MISC_PATH
import app.revanced.patches.youtube.utils.patch.PatchList.DISABLE_QUIC_PROTOCOL import app.revanced.patches.youtube.utils.patch.PatchList.DISABLE_QUIC_PROTOCOL
import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference
import app.revanced.patches.youtube.utils.settings.settingsPatch import app.revanced.patches.youtube.utils.settings.settingsPatch
import app.revanced.util.fingerprint.methodOrThrow
@Suppress("unused") @Suppress("unused", "SpellCheckingInspection")
val quicProtocolPatch = bytecodePatch( val quicProtocolPatch = bytecodePatch(
DISABLE_QUIC_PROTOCOL.title, DISABLE_QUIC_PROTOCOL.title,
DISABLE_QUIC_PROTOCOL.summary, DISABLE_QUIC_PROTOCOL.summary,
) { ) {
compatibleWith(COMPATIBLE_PACKAGE) compatibleWith(COMPATIBLE_PACKAGE)
dependsOn(settingsPatch) dependsOn(
settingsPatch,
baseQuicProtocolPatch(),
)
execute { execute {
arrayOf(
cronetEngineBuilderFingerprint,
experimentalCronetEngineBuilderFingerprint
).forEach {
it.methodOrThrow().addInstructions(
0, """
invoke-static {p1}, $MISC_PATH/QUICProtocolPatch;->disableQUICProtocol(Z)Z
move-result p1
"""
)
}
// region add settings
addPreference( addPreference(
arrayOf( arrayOf(
"SETTINGS: DISABLE_QUIC_PROTOCOL" "SETTINGS: DISABLE_QUIC_PROTOCOL"
), ),
DISABLE_QUIC_PROTOCOL DISABLE_QUIC_PROTOCOL
) )
// endregion
} }
} }

View File

@ -469,6 +469,8 @@ Click to see how to issue an API key."</string>
Find the official song if a music video is detected playing from an album. Find the official song if a music video is detected playing from an album.
• Powered by Piped Instance API."</string> • Powered by Piped Instance API."</string>
<string name="revanced_disable_quic_protocol_title">Disable QUIC protocol</string>
<string name="revanced_disable_quic_protocol_summary">"Disables CronetEngine's QUIC protocol."</string>
<string name="revanced_disable_music_video_in_album_redirect_type_title">Redirection type</string> <string name="revanced_disable_music_video_in_album_redirect_type_title">Redirection type</string>
<string name="revanced_disable_music_video_in_album_redirect_type_summary">Specifies how to redirect to official song.</string> <string name="revanced_disable_music_video_in_album_redirect_type_summary">Specifies how to redirect to official song.</string>
<string name="revanced_disable_music_video_in_album_redirect_type_entry_redirect">Redirect</string> <string name="revanced_disable_music_video_in_album_redirect_type_entry_redirect">Redirect</string>