feat(YouTube Music - Spoof client): Limit support version to 7.16.53 and change default client preset

This commit is contained in:
inotia00
2024-12-22 16:20:32 +09:00
parent 132bd5dec7
commit 480d47587d
8 changed files with 93 additions and 74 deletions

View File

@ -2,11 +2,11 @@ package app.revanced.extension.music.patches.misc;
import app.revanced.extension.music.patches.misc.client.AppClient.ClientType; import app.revanced.extension.music.patches.misc.client.AppClient.ClientType;
import app.revanced.extension.music.settings.Settings; import app.revanced.extension.music.settings.Settings;
import app.revanced.extension.shared.patches.BlockRequestPatch;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class SpoofClientPatch extends BlockRequestPatch { public class SpoofClientPatch {
private static final ClientType CLIENT_TYPE = Settings.SPOOF_CLIENT_TYPE.get(); private static final ClientType CLIENT_TYPE = Settings.SPOOF_CLIENT_TYPE.get();
public static final boolean SPOOF_CLIENT = Settings.SPOOF_CLIENT.get();
/** /**
* Injection point. * Injection point.

View File

@ -2,49 +2,78 @@ package app.revanced.extension.music.patches.misc.client;
import android.os.Build; import android.os.Build;
import app.revanced.extension.music.settings.Settings;
public class AppClient { public class AppClient {
private static final String CLIENT_VERSION_ANDROID_MUSIC = Settings.SPOOF_CLIENT_LEGACY.get()
? "4.27.53" // Audio codec is MP4A.
: "5.29.53"; // Audio codec is OPUS.
private static final String OS_VERSION_ANDROID_MUSIC = Build.VERSION.RELEASE;
private static final String USER_AGENT_ANDROID_MUSIC = "com.google.android.apps.youtube.music/" +
CLIENT_VERSION_ANDROID_MUSIC +
" (Linux; U; Android " +
OS_VERSION_ANDROID_MUSIC +
"; GB) gzip";
private static final String CLIENT_VERSION_IOS_MUSIC = Settings.SPOOF_CLIENT_LEGACY.get() // Audio codec is MP4A.
? "4.27" // Audio codec is MP4A. private static final String CLIENT_VERSION_ANDROID_MUSIC_4_27 = "4.27.53";
: "7.31.2"; // Audio codec is OPUS.
// Audio codec is OPUS.
private static final String CLIENT_VERSION_ANDROID_MUSIC_5_29 = "5.29.53";
private static final String PACKAGE_NAME_ANDROID_MUSIC = "com.google.android.apps.youtube.music";
private static final String DEVICE_MODEL_ANDROID_MUSIC = Build.MODEL;
private static final String OS_VERSION_ANDROID_MUSIC = Build.VERSION.RELEASE;
// Audio codec is MP4A.
private static final String CLIENT_VERSION_IOS_MUSIC_6_21 = "6.21";
// Audio codec is OPUS.
private static final String CLIENT_VERSION_IOS_MUSIC_7_04 = "7.04";
private static final String PACKAGE_NAME_IOS_MUSIC = "com.google.ios.youtubemusic";
private static final String DEVICE_MODEL_IOS_MUSIC = "iPhone14,3"; private static final String DEVICE_MODEL_IOS_MUSIC = "iPhone14,3";
private static final String OS_VERSION_IOS_MUSIC = "15.7.1.19H117"; private static final String OS_VERSION_IOS_MUSIC = "15.7.1.19H117";
private static final String USER_AGENT_VERSION_IOS_MUSIC = "15_7_1"; private static final String USER_AGENT_VERSION_IOS_MUSIC = "15_7_1";
private static final String USER_AGENT_IOS_MUSIC = "com.google.ios.youtubemusic/" +
CLIENT_VERSION_IOS_MUSIC +
"(" +
DEVICE_MODEL_IOS_MUSIC +
"; U; CPU iOS " +
USER_AGENT_VERSION_IOS_MUSIC +
" like Mac OS X)";
private AppClient() { private AppClient() {
} }
private static String androidUserAgent(String clientVersion) {
return PACKAGE_NAME_ANDROID_MUSIC +
"/" +
clientVersion +
" (Linux; U; Android " +
OS_VERSION_ANDROID_MUSIC +
"; GB) gzip";
}
private static String iOSUserAgent(String clientVersion) {
return PACKAGE_NAME_IOS_MUSIC +
"/" +
clientVersion +
"(" +
DEVICE_MODEL_IOS_MUSIC +
"; U; CPU iOS " +
USER_AGENT_VERSION_IOS_MUSIC +
" like Mac OS X)";
}
public enum ClientType { public enum ClientType {
ANDROID_MUSIC(21, ANDROID_MUSIC_4_27(21,
Build.MODEL, DEVICE_MODEL_ANDROID_MUSIC,
OS_VERSION_ANDROID_MUSIC, OS_VERSION_ANDROID_MUSIC,
USER_AGENT_ANDROID_MUSIC, androidUserAgent(CLIENT_VERSION_ANDROID_MUSIC_4_27),
CLIENT_VERSION_ANDROID_MUSIC CLIENT_VERSION_ANDROID_MUSIC_4_27
), ),
IOS_MUSIC( ANDROID_MUSIC_5_29(21,
DEVICE_MODEL_ANDROID_MUSIC,
OS_VERSION_ANDROID_MUSIC,
androidUserAgent(CLIENT_VERSION_ANDROID_MUSIC_5_29),
CLIENT_VERSION_ANDROID_MUSIC_5_29
),
IOS_MUSIC_6_21(
26, 26,
DEVICE_MODEL_IOS_MUSIC, DEVICE_MODEL_IOS_MUSIC,
OS_VERSION_IOS_MUSIC, OS_VERSION_IOS_MUSIC,
USER_AGENT_IOS_MUSIC, iOSUserAgent(CLIENT_VERSION_IOS_MUSIC_6_21),
CLIENT_VERSION_IOS_MUSIC CLIENT_VERSION_IOS_MUSIC_6_21
),
IOS_MUSIC_7_04(
26,
DEVICE_MODEL_IOS_MUSIC,
OS_VERSION_IOS_MUSIC,
iOSUserAgent(CLIENT_VERSION_IOS_MUSIC_7_04),
CLIENT_VERSION_IOS_MUSIC_7_04
); );
/** /**

View File

@ -180,8 +180,8 @@ 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 ENABLE_OPUS_CODEC = new BooleanSetting("revanced_enable_opus_codec", FALSE, 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);
public static final BooleanSetting SPOOF_CLIENT_LEGACY = new BooleanSetting("revanced_spoof_client_legacy", FALSE, true); public static final BooleanSetting SPOOF_CLIENT = new BooleanSetting("revanced_spoof_client", FALSE, true);
public static final EnumSetting<ClientType> SPOOF_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_client_type", ClientType.ANDROID_MUSIC, true); public static final EnumSetting<ClientType> SPOOF_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_client_type", ClientType.IOS_MUSIC_6_21, true);
// PreferenceScreen: Return YouTube Dislike // PreferenceScreen: Return YouTube Dislike

View File

@ -12,11 +12,6 @@ public class PatchStatus {
return ClientType.IOS; return ClientType.IOS;
} }
public static boolean SpoofClient() {
// Replace this with true If the Spoof client patch succeeds
return false;
}
public static boolean SpoofStreamingData() { public static boolean SpoofStreamingData() {
// Replace this with true If the Spoof streaming data patch succeeds // Replace this with true If the Spoof streaming data patch succeeds
return false; return false;

View File

@ -36,10 +36,6 @@ public class BaseSettings {
public static final EnumSetting<DisplayFormat> RETURN_YOUTUBE_USERNAME_DISPLAY_FORMAT = new EnumSetting<>("revanced_return_youtube_username_display_format", DisplayFormat.USERNAME_ONLY, true); public static final EnumSetting<DisplayFormat> RETURN_YOUTUBE_USERNAME_DISPLAY_FORMAT = new EnumSetting<>("revanced_return_youtube_username_display_format", DisplayFormat.USERNAME_ONLY, true);
public static final StringSetting RETURN_YOUTUBE_USERNAME_YOUTUBE_DATA_API_V3_DEVELOPER_KEY = new StringSetting("revanced_return_youtube_username_youtube_data_api_v3_developer_key", "", true, false); public static final StringSetting RETURN_YOUTUBE_USERNAME_YOUTUBE_DATA_API_V3_DEVELOPER_KEY = new StringSetting("revanced_return_youtube_username_youtube_data_api_v3_developer_key", "", true, false);
// Used only in YouTube Music.
// Moved to a shared class to prevent YouTube from accessing YouTube Music's extension classes.
public static final BooleanSetting SPOOF_CLIENT = new BooleanSetting("revanced_spoof_client", FALSE, true);
public static final BooleanSetting SPOOF_STREAMING_DATA = new BooleanSetting("revanced_spoof_streaming_data", TRUE, true, "revanced_spoof_streaming_data_user_dialog_message"); public static final BooleanSetting SPOOF_STREAMING_DATA = new BooleanSetting("revanced_spoof_streaming_data", TRUE, true, "revanced_spoof_streaming_data_user_dialog_message");
public static final EnumSetting<ClientType> SPOOF_STREAMING_DATA_TYPE = new EnumSetting<>("revanced_spoof_streaming_data_type", SpoofStreamingDataDefaultClient(), true); public static final EnumSetting<ClientType> SPOOF_STREAMING_DATA_TYPE = new EnumSetting<>("revanced_spoof_streaming_data_type", SpoofStreamingDataDefaultClient(), true);
public static final BooleanSetting SPOOF_STREAMING_DATA_SYNC_VIDEO_LENGTH = new BooleanSetting("revanced_spoof_streaming_data_sync_video_length", TRUE, true); public static final BooleanSetting SPOOF_STREAMING_DATA_SYNC_VIDEO_LENGTH = new BooleanSetting("revanced_spoof_streaming_data_sync_video_length", TRUE, true);

View File

@ -4,24 +4,23 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.compatibility.Constants
import app.revanced.patches.music.utils.extension.Constants.MISC_PATH import app.revanced.patches.music.utils.extension.Constants.MISC_PATH
import app.revanced.patches.music.utils.patch.PatchList.SPOOF_CLIENT import app.revanced.patches.music.utils.patch.PatchList.SPOOF_CLIENT
import app.revanced.patches.music.utils.playbackSpeedBottomSheetFingerprint import app.revanced.patches.music.utils.playbackSpeedBottomSheetFingerprint
import app.revanced.patches.music.utils.playservice.is_7_25_or_greater
import app.revanced.patches.music.utils.playservice.versionCheckPatch
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
import app.revanced.patches.music.utils.settings.addPreferenceWithIntent import app.revanced.patches.music.utils.settings.addPreferenceWithIntent
import app.revanced.patches.music.utils.settings.addSwitchPreference import app.revanced.patches.music.utils.settings.addSwitchPreference
import app.revanced.patches.music.utils.settings.settingsPatch import app.revanced.patches.music.utils.settings.settingsPatch
import app.revanced.patches.shared.blockrequest.blockRequestPatch
import app.revanced.patches.shared.createPlayerRequestBodyWithModelFingerprint import app.revanced.patches.shared.createPlayerRequestBodyWithModelFingerprint
import app.revanced.patches.shared.extension.Constants.PATCHES_PATH
import app.revanced.patches.shared.indexOfModelInstruction import app.revanced.patches.shared.indexOfModelInstruction
import app.revanced.util.findMethodOrThrow import app.revanced.util.Utils.printWarn
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.fingerprint.mutableClassOrThrow import app.revanced.util.fingerprint.mutableClassOrThrow
@ -53,14 +52,26 @@ val spoofClientPatch = bytecodePatch(
SPOOF_CLIENT.summary, SPOOF_CLIENT.summary,
false, false,
) { ) {
dependsOn( compatibleWith(
settingsPatch, Constants.YOUTUBE_MUSIC_PACKAGE_NAME(
blockRequestPatch "6.20.51",
"6.29.59",
"6.42.55",
"6.51.53",
"7.16.53",
),
) )
compatibleWith(COMPATIBLE_PACKAGE) dependsOn(
settingsPatch,
versionCheckPatch,
)
execute { execute {
if (is_7_25_or_greater) {
printWarn("\"${SPOOF_CLIENT.title}\" is not supported in this version. Use YouTube Music 7.24.51 or earlier.")
return@execute
}
// region Get field references to be used below. // region Get field references to be used below.
@ -262,24 +273,11 @@ val spoofClientPatch = bytecodePatch(
// endregion // endregion
findMethodOrThrow("$PATCHES_PATH/PatchStatus;") {
name == "SpoofClient"
}.replaceInstruction(
0,
"const/4 v0, 0x1"
)
addSwitchPreference( addSwitchPreference(
CategoryType.MISC, CategoryType.MISC,
"revanced_spoof_client", "revanced_spoof_client",
"false" "false"
) )
addSwitchPreference(
CategoryType.MISC,
"revanced_spoof_client_legacy",
"false",
"revanced_spoof_client"
)
addPreferenceWithIntent( addPreferenceWithIntent(
CategoryType.MISC, CategoryType.MISC,
"revanced_spoof_client_type", "revanced_spoof_client_type",

View File

@ -56,12 +56,14 @@
<item>4.27.53</item> <item>4.27.53</item>
</string-array> </string-array>
<string-array name="revanced_spoof_client_type_entries"> <string-array name="revanced_spoof_client_type_entries">
<item>@string/revanced_spoof_client_type_entry_android_music</item> <item>@string/revanced_spoof_client_type_entry_ios_music_6_21</item>
<item>@string/revanced_spoof_client_type_entry_ios_music</item> <item>@string/revanced_spoof_client_type_entry_android_music_5_29</item>
<item>@string/revanced_spoof_client_type_entry_android_music_4_27</item>
</string-array> </string-array>
<string-array name="revanced_spoof_client_type_entry_values"> <string-array name="revanced_spoof_client_type_entry_values">
<item>ANDROID_MUSIC</item> <item>IOS_MUSIC_6_21</item>
<item>IOS_MUSIC</item> <item>ANDROID_MUSIC_5_29</item>
<item>ANDROID_MUSIC_4_27</item>
</string-array> </string-array>
<string-array name="revanced_spoof_streaming_data_type_entries"> <string-array name="revanced_spoof_streaming_data_type_entries">
<item>@string/revanced_spoof_streaming_data_type_entry_android_vr</item> <item>@string/revanced_spoof_streaming_data_type_entry_android_vr</item>

View File

@ -452,14 +452,13 @@ Tap the continue button and allow optimization changes."</string>
<string name="revanced_spoof_client_summary">"Spoof the client to prevent playback issues. <string name="revanced_spoof_client_summary">"Spoof the client to prevent playback issues.
※ When used with 'Spoofing streaming data', playback issues may occur."</string> ※ When used with 'Spoofing streaming data', playback issues may occur."</string>
<string name="revanced_spoof_client_legacy_title">Use old client</string>
<string name="revanced_spoof_client_legacy_summary">"Spoofing with version 4.27.53.
OPUS codec may not work."</string>
<string name="revanced_spoof_client_type_title">Default client</string> <string name="revanced_spoof_client_type_title">Default client</string>
<string name="revanced_spoof_client_type_summary">Defines a default client to spoofing.</string> <string name="revanced_spoof_client_type_summary">"Defines a default client to spoofing.
<string name="revanced_spoof_client_type_entry_android_music">Android Music</string>
<string name="revanced_spoof_client_type_entry_ios_music">iOS Music</string> ※ When using the Android client, it is recommended to use it with 'Spoof app version'."</string>
<string name="revanced_spoof_client_type_entry_android_music_4_27">Android Music 4.27.53</string>
<string name="revanced_spoof_client_type_entry_android_music_5_29">Android Music 5.29.53</string>
<string name="revanced_spoof_client_type_entry_ios_music_6_21">iOS Music 6.21</string>
<string name="revanced_spoof_streaming_data_title">Spoof streaming data</string> <string name="revanced_spoof_streaming_data_title">Spoof streaming data</string>
<string name="revanced_spoof_streaming_data_summary">"Spoof the streaming data to prevent playback issues. <string name="revanced_spoof_streaming_data_summary">"Spoof the streaming data to prevent playback issues.