Skip to content

Commit 38e0cbd

Browse files
chore: Merge branch dev to main (#5907)
2 parents 2e9c9dc + 0bdebd9 commit 38e0cbd

File tree

106 files changed

+443
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+443
-178
lines changed

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,31 @@
1+
# [5.39.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.39.0-dev.1...v5.39.0-dev.2) (2025-09-17)
2+
3+
4+
### Bug Fixes
5+
6+
* **YouTube - Spoof video streams:** Show Android Studio in spoof stream menu ([c9f741e](https://github.com/ReVanced/revanced-patches/commit/c9f741e616c7acab0cd4558e02b0c4ec18392c10))
7+
8+
# [5.39.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.38.1-dev.2...v5.39.0-dev.1) (2025-09-17)
9+
10+
11+
### Features
12+
13+
* **YouTube - Hide video action buttons:** Add "Hide Shop button" setting ([a84db7b](https://github.com/ReVanced/revanced-patches/commit/a84db7be7fde2e9bb3ac41aec709a1681e845fe1))
14+
15+
## [5.38.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.38.1-dev.1...v5.38.1-dev.2) (2025-09-16)
16+
17+
18+
### Bug Fixes
19+
20+
* **YouTube Music - Spoof video streams:** Remove iPadOS client ([7eeffd3](https://github.com/ReVanced/revanced-patches/commit/7eeffd3392c57555342173103d3a417c038d0970))
21+
22+
## [5.38.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.38.0...v5.38.1-dev.1) (2025-09-16)
23+
24+
25+
### Bug Fixes
26+
27+
* **YouTube - Spoof video streams:** Do not use Android Creator for livestreams ([cbe576b](https://github.com/ReVanced/revanced-patches/commit/cbe576bc384ef5f5ee2fa341147925ed0dff568b))
28+
129
# [5.38.0](https://github.com/ReVanced/revanced-patches/compare/v5.37.0...v5.38.0) (2025-09-16)
230

331

extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package app.revanced.extension.music.patches.spoof;
22

3+
import static app.revanced.extension.music.settings.Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE;
34
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32;
45
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48;
56
import static app.revanced.extension.shared.spoof.ClientType.VISIONOS;
@@ -22,6 +23,8 @@ public static void setClientOrderToUse() {
2223
VISIONOS
2324
);
2425

25-
StreamingDataRequest.setClientOrderToUse(availableClients, ANDROID_VR_1_43_32);
26+
ClientType client = SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
27+
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setPreferredClient(client);
28+
StreamingDataRequest.setClientOrderToUse(availableClients, client);
2629
}
2730
}

extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import static java.lang.Boolean.FALSE;
44
import static java.lang.Boolean.TRUE;
55

6+
import static app.revanced.extension.shared.settings.Setting.parent;
7+
68
import app.revanced.extension.shared.settings.BaseSettings;
79
import app.revanced.extension.shared.settings.BooleanSetting;
10+
import app.revanced.extension.shared.settings.EnumSetting;
11+
import app.revanced.extension.shared.spoof.ClientType;
812

913
public class Settings extends BaseSettings {
1014

@@ -18,4 +22,8 @@ public class Settings extends BaseSettings {
1822

1923
// Player
2024
public static final BooleanSetting PERMANENT_REPEAT = new BooleanSetting("revanced_music_play_permanent_repeat", FALSE, true);
25+
26+
// Miscellaneous
27+
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type",
28+
ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS));
2129
}

extensions/youtube/src/main/java/app/revanced/extension/youtube/ByteTrieSearch.java renamed to extensions/shared/library/src/main/java/app/revanced/extension/shared/ByteTrieSearch.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package app.revanced.extension.youtube;
2-
3-
import androidx.annotation.NonNull;
1+
package app.revanced.extension.shared;
42

53
import java.nio.charset.StandardCharsets;
64

@@ -39,7 +37,7 @@ public static byte[][] convertStringsToBytes(String... strings) {
3937
return replacement;
4038
}
4139

42-
public ByteTrieSearch(@NonNull byte[]... patterns) {
40+
public ByteTrieSearch(byte[]... patterns) {
4341
super(new ByteTrieNode(), patterns);
4442
}
4543
}

extensions/youtube/src/main/java/app/revanced/extension/youtube/StringTrieSearch.java renamed to extensions/shared/library/src/main/java/app/revanced/extension/shared/StringTrieSearch.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package app.revanced.extension.youtube;
2-
3-
import androidx.annotation.NonNull;
1+
package app.revanced.extension.shared;
42

53
/**
64
* Text pattern searching using a prefix tree (trie).
@@ -28,7 +26,7 @@ int getTextLength(String text) {
2826
}
2927
}
3028

31-
public StringTrieSearch(@NonNull String... patterns) {
29+
public StringTrieSearch(String... patterns) {
3230
super(new StringTrieNode(), patterns);
3331
}
3432
}

extensions/youtube/src/main/java/app/revanced/extension/youtube/TrieSearch.java renamed to extensions/shared/library/src/main/java/app/revanced/extension/shared/TrieSearch.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
package app.revanced.extension.youtube;
1+
package app.revanced.extension.shared;
22

3-
import androidx.annotation.NonNull;
43
import androidx.annotation.Nullable;
54

65
import java.util.ArrayList;
76
import java.util.Collections;
87
import java.util.List;
98
import java.util.Objects;
109

11-
/**
12-
* Searches for a group of different patterns using a trie (prefix tree).
10+
/**Searches for a group of different patterns using a trie (prefix tree).
1311
* Can significantly speed up searching for multiple patterns.
1412
*/
1513
public abstract class TrieSearch<T> {
@@ -136,7 +134,7 @@ static abstract class TrieNode<T> {
136134
* @param patternLength Length of the pattern.
137135
* @param callback Callback, where a value of NULL indicates to always accept a pattern match.
138136
*/
139-
private void addPattern(@NonNull T pattern, int patternIndex, int patternLength,
137+
private void addPattern(T pattern, int patternIndex, int patternLength,
140138
@Nullable TriePatternMatchedCallback<T> callback) {
141139
if (patternIndex == patternLength) { // Reached the end of the pattern.
142140
if (endOfPatternCallback == null) {
@@ -308,13 +306,13 @@ private int estimatedNumberOfPointersUsed() {
308306
private final List<T> patterns = new ArrayList<>();
309307

310308
@SafeVarargs
311-
TrieSearch(@NonNull TrieNode<T> root, @NonNull T... patterns) {
309+
TrieSearch(TrieNode<T> root, T... patterns) {
312310
this.root = Objects.requireNonNull(root);
313311
addPatterns(patterns);
314312
}
315313

316314
@SafeVarargs
317-
public final void addPatterns(@NonNull T... patterns) {
315+
public final void addPatterns(T... patterns) {
318316
for (T pattern : patterns) {
319317
addPattern(pattern);
320318
}
@@ -325,39 +323,39 @@ public final void addPatterns(@NonNull T... patterns) {
325323
*
326324
* @param pattern Pattern to add. Calling this with a zero length pattern does nothing.
327325
*/
328-
public void addPattern(@NonNull T pattern) {
326+
public void addPattern(T pattern) {
329327
addPattern(pattern, root.getTextLength(pattern), null);
330328
}
331329

332330
/**
333331
* @param pattern Pattern to add. Calling this with a zero length pattern does nothing.
334332
* @param callback Callback to determine if searching should halt when a match is found.
335333
*/
336-
public void addPattern(@NonNull T pattern, @NonNull TriePatternMatchedCallback<T> callback) {
334+
public void addPattern(T pattern, TriePatternMatchedCallback<T> callback) {
337335
addPattern(pattern, root.getTextLength(pattern), Objects.requireNonNull(callback));
338336
}
339337

340-
void addPattern(@NonNull T pattern, int patternLength, @Nullable TriePatternMatchedCallback<T> callback) {
338+
void addPattern(T pattern, int patternLength, @Nullable TriePatternMatchedCallback<T> callback) {
341339
if (patternLength == 0) return; // Nothing to match
342340

343341
patterns.add(pattern);
344342
root.addPattern(pattern, 0, patternLength, callback);
345343
}
346344

347-
public final boolean matches(@NonNull T textToSearch) {
345+
public final boolean matches(T textToSearch) {
348346
return matches(textToSearch, 0);
349347
}
350348

351-
public boolean matches(@NonNull T textToSearch, @NonNull Object callbackParameter) {
349+
public boolean matches(T textToSearch, Object callbackParameter) {
352350
return matches(textToSearch, 0, root.getTextLength(textToSearch),
353351
Objects.requireNonNull(callbackParameter));
354352
}
355353

356-
public boolean matches(@NonNull T textToSearch, int startIndex) {
354+
public boolean matches(T textToSearch, int startIndex) {
357355
return matches(textToSearch, startIndex, root.getTextLength(textToSearch));
358356
}
359357

360-
public final boolean matches(@NonNull T textToSearch, int startIndex, int endIndex) {
358+
public final boolean matches(T textToSearch, int startIndex, int endIndex) {
361359
return matches(textToSearch, startIndex, endIndex, null);
362360
}
363361

@@ -370,11 +368,11 @@ public final boolean matches(@NonNull T textToSearch, int startIndex, int endInd
370368
* @param callbackParameter Optional parameter passed to the callbacks.
371369
* @return If any pattern matched, and it's callback halted searching.
372370
*/
373-
public boolean matches(@NonNull T textToSearch, int startIndex, int endIndex, @Nullable Object callbackParameter) {
371+
public boolean matches(T textToSearch, int startIndex, int endIndex, @Nullable Object callbackParameter) {
374372
return matches(textToSearch, root.getTextLength(textToSearch), startIndex, endIndex, callbackParameter);
375373
}
376374

377-
private boolean matches(@NonNull T textToSearch, int textToSearchLength, int startIndex, int endIndex,
375+
private boolean matches(T textToSearch, int textToSearchLength, int startIndex, int endIndex,
378376
@Nullable Object callbackParameter) {
379377
if (endIndex > textToSearchLength) {
380378
throw new IllegalArgumentException("endIndex: " + endIndex

extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import static app.revanced.extension.shared.settings.Setting.parent;
66
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
77

8-
import app.revanced.extension.shared.Logger;
9-
import app.revanced.extension.shared.spoof.ClientType;
10-
118
/**
129
* Settings shared across multiple apps.
1310
* <p>
@@ -31,13 +28,4 @@ public class BaseSettings {
3128
public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
3229
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
3330
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
34-
// Client type must be last spoof setting due to cyclic references.
35-
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
36-
37-
static {
38-
if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.IOS_UNPLUGGED) {
39-
Logger.printInfo(() -> "Migrating from iOS Unplugged to iPadOS");
40-
SPOOF_VIDEO_STREAMS_CLIENT_TYPE.save(ClientType.IPADOS);
41-
}
42-
}
4331
}

extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ public enum ClientType {
3131
"132.0.6808.3",
3232
"1.61.48",
3333
false,
34-
false,
3534
"Android VR 1.61"
3635
),
3736
/**
@@ -50,7 +49,6 @@ public enum ClientType {
5049
Objects.requireNonNull(ANDROID_VR_1_61_48.buildId),
5150
"107.0.5284.2",
5251
"1.43.32",
53-
ANDROID_VR_1_61_48.requiresAuth,
5452
ANDROID_VR_1_61_48.useAuth,
5553
"Android VR 1.43"
5654
),
@@ -71,8 +69,7 @@ public enum ClientType {
7169
"132.0.6779.0",
7270
"23.47.101",
7371
true,
74-
true,
75-
"Android Creator"
72+
"Android Studio"
7673
),
7774
/**
7875
* Internal YT client for an unreleased YT client. May stop working at any time.
@@ -86,7 +83,6 @@ public enum ClientType {
8683
"0.1",
8784
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15",
8885
false,
89-
false,
9086
"visionOS"
9187
),
9288
/**
@@ -111,25 +107,7 @@ public enum ClientType {
111107
"19.22.3",
112108
"com.google.ios.youtube/19.22.3 (iPad7,6; U; CPU iPadOS 17_7_10 like Mac OS X; " + Locale.getDefault() + ")",
113109
false,
114-
false,
115110
"iPadOS"
116-
),
117-
/**
118-
* Obsolete and broken client. Here only to migrate data.
119-
*/
120-
@Deprecated
121-
IOS_UNPLUGGED(
122-
33,
123-
"IOS_UNPLUGGED",
124-
"Apple",
125-
"iPhone16,2",
126-
"iOS",
127-
"18.2.22C152",
128-
"8.49",
129-
"dummy user-agent",
130-
true,
131-
true,
132-
"iOS TV"
133111
);
134112

135113
/**
@@ -197,12 +175,6 @@ public enum ClientType {
197175
*/
198176
public final String clientVersion;
199177

200-
/**
201-
* If this client requires authentication and does not work
202-
* if logged out or in incognito mode.
203-
*/
204-
public final boolean requiresAuth;
205-
206178
/**
207179
* If the client should use authentication if available.
208180
*/
@@ -227,7 +199,6 @@ public enum ClientType {
227199
@NonNull String buildId,
228200
@NonNull String cronetVersion,
229201
String clientVersion,
230-
boolean requiresAuth,
231202
boolean useAuth,
232203
String friendlyName) {
233204
this.id = id;
@@ -241,7 +212,6 @@ public enum ClientType {
241212
this.buildId = buildId;
242213
this.cronetVersion = cronetVersion;
243214
this.clientVersion = clientVersion;
244-
this.requiresAuth = requiresAuth;
245215
this.useAuth = useAuth;
246216
this.friendlyName = friendlyName;
247217

@@ -267,7 +237,6 @@ public enum ClientType {
267237
String osVersion,
268238
String clientVersion,
269239
String userAgent,
270-
boolean requiresAuth,
271240
boolean useAuth,
272241
String friendlyName) {
273242
this.id = id;
@@ -278,7 +247,6 @@ public enum ClientType {
278247
this.osVersion = osVersion;
279248
this.clientVersion = clientVersion;
280249
this.userAgent = userAgent;
281-
this.requiresAuth = requiresAuth;
282250
this.useAuth = useAuth;
283251
this.friendlyName = friendlyName;
284252
this.packageName = null;

0 commit comments

Comments
 (0)