Skip to content

feat(Spotify - Spoof Client): Fix issues like songs skipping by spoofing to iOS #5388

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Jul 11, 2025

Conversation

drobotk
Copy link
Contributor

@drobotk drobotk commented Jul 9, 2025

Yet Another Spotify Spoof™

Big thanks to @Nuckyz for the initial WIP work.

TODO:

  • Send to users to test
  • Test for a while longer to see if this isn't a fluke
  • Reduce to bare minimum OR improve to spoof everything
  • Add some device randomization or something, right now we're hardcoding an app version and the device to an iPad.
  • Refactor

@Nuckyz Nuckyz marked this pull request as draft July 9, 2025 11:02
@Nuckyz Nuckyz requested a review from oSumAtrIX July 9, 2025 11:22
@Nuckyz Nuckyz marked this pull request as ready for review July 9, 2025 20:38
@Nuckyz Nuckyz requested a review from LisoUseInAIKyrios July 9, 2025 20:49
@oSumAtrIX oSumAtrIX changed the title feat(Spotify - Spoof Client): Spoof to iOS feat(Spotify - Spoof Client): Fix issues like songs skipping by spoofing to iOS Jul 9, 2025
@Afterlifepro
Copy link

Just tested this on my device and can confirm (with about 30s of testing) that it instantly fixed the issue for me (issue described in #5310)
This is opposed to all my other testing where the app immediately either skips all the songs or doesn't let me play any.

Tl;dr its at least not a per device fluke and doesnt line up with my prior tests so i think it works

@LisoUseInAIKyrios LisoUseInAIKyrios linked an issue Jul 9, 2025 that may be closed by this pull request
3 tasks
@CamperSamu
Copy link

CamperSamu commented Jul 10, 2025

Test for a while longer to see if this isn't a fluke

I've patched the latest APK with this and sent it around to friends and family to test after giving it a shot myself, if anything goes wrong I'll report back

@StevensND
Copy link

Tested for about 20 mins. Working properly.

@prthmm
Copy link

prthmm commented Jul 10, 2025

Tested for an hour, Works like a charm. Login process got much better.

@Afterlifepro
Copy link

13 hours later and its still working
safe to say this isnt a fluke i think

@henmalib
Copy link

While trying to patch with
java -jar revanced-cli.jar patch -p patches-5.31.0-dev.12.rvp -e 'Custom theme' -ObackgroundColor=@android:color/system_background_dark -ObackgroundColorSecondary=@android:color/system_surface_container_high_dark -OaccentColor=@android:color/system_primary_dark -OaccentColorPressed=@android:color/system_primary_light spotify-orig.apk --out spotify-patched-a14+.apk

I'm getting..

SEVERE: "Spoof client" failed:
app.revanced.patcher.patch.PatchException: Failed to match the fingerprint: app.revanced.patcher.Fingerprint@5c36cc
        at app.revanced.patcher.Fingerprint.getException(Fingerprint.kt:254)
        at app.revanced.patcher.Fingerprint.getMatch(Fingerprint.kt:263)
        at app.revanced.patcher.Fingerprint.getClassDef(Fingerprint.kt:380)
        at app.revanced.patches.spotify.misc.fix.SpoofClientPatchKt.spoofClientPatch$lambda$9$lambda$8(SpoofClientPatch.kt:85)
        at app.revanced.patcher.patch.Patch.execute(Patch.kt:71)
        at app.revanced.patcher.patch.BytecodePatch.execute$revanced_patcher(Patch.kt:159)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:109)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)
        at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)
        at app.revanced.cli.command.PatchCommand$run$1$4.invokeSuspend(PatchCommand.kt:315)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
        at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
        at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)
        at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)
        at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
        at app.revanced.cli.command.PatchCommand.run(PatchCommand.kt:314)
        at picocli.CommandLine.executeUserObject(CommandLine.java:2030)
        at picocli.CommandLine.access$1500(CommandLine.java:148)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
        at picocli.CommandLine.execute(CommandLine.java:2174)
        at app.revanced.cli.command.MainCommandKt.main(MainCommand.kt:12)

Have tried using: 9.0.60.607 , 9.0.58.594, 9.0.60.614

@Nuckyz
Copy link
Member

Nuckyz commented Jul 10, 2025

While trying to patch with java -jar revanced-cli.jar patch -p patches-5.31.0-dev.12.rvp -e 'Custom theme' -ObackgroundColor=@android:color/system_background_dark -ObackgroundColorSecondary=@android:color/system_surface_container_high_dark -OaccentColor=@android:color/system_primary_dark -OaccentColorPressed=@android:color/system_primary_light spotify-orig.apk --out spotify-patched-a14+.apk

I'm getting..

SEVERE: "Spoof client" failed:
app.revanced.patcher.patch.PatchException: Failed to match the fingerprint: app.revanced.patcher.Fingerprint@5c36cc
        at app.revanced.patcher.Fingerprint.getException(Fingerprint.kt:254)
        at app.revanced.patcher.Fingerprint.getMatch(Fingerprint.kt:263)
        at app.revanced.patcher.Fingerprint.getClassDef(Fingerprint.kt:380)
        at app.revanced.patches.spotify.misc.fix.SpoofClientPatchKt.spoofClientPatch$lambda$9$lambda$8(SpoofClientPatch.kt:85)
        at app.revanced.patcher.patch.Patch.execute(Patch.kt:71)
        at app.revanced.patcher.patch.BytecodePatch.execute$revanced_patcher(Patch.kt:159)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:109)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)
        at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)
        at app.revanced.cli.command.PatchCommand$run$1$4.invokeSuspend(PatchCommand.kt:315)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
        at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
        at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)
        at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)
        at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
        at app.revanced.cli.command.PatchCommand.run(PatchCommand.kt:314)
        at picocli.CommandLine.executeUserObject(CommandLine.java:2030)
        at picocli.CommandLine.access$1500(CommandLine.java:148)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
        at picocli.CommandLine.execute(CommandLine.java:2174)
        at app.revanced.cli.command.MainCommandKt.main(MainCommand.kt:12)

Have tried using: 9.0.60.607 , 9.0.58.594, 9.0.60.614

Latest commit broke the patch

@henmalib
Copy link

While trying to patch with java -jar revanced-cli.jar patch -p patches-5.31.0-dev.12.rvp -e 'Custom theme' -ObackgroundColor=@android:color/system_background_dark -ObackgroundColorSecondary=@android:color/system_surface_container_high_dark -OaccentColor=@android:color/system_primary_dark -OaccentColorPressed=@android:color/system_primary_light spotify-orig.apk --out spotify-patched-a14+.apk
I'm getting..

SEVERE: "Spoof client" failed:
app.revanced.patcher.patch.PatchException: Failed to match the fingerprint: app.revanced.patcher.Fingerprint@5c36cc
        at app.revanced.patcher.Fingerprint.getException(Fingerprint.kt:254)
        at app.revanced.patcher.Fingerprint.getMatch(Fingerprint.kt:263)
        at app.revanced.patcher.Fingerprint.getClassDef(Fingerprint.kt:380)
        at app.revanced.patches.spotify.misc.fix.SpoofClientPatchKt.spoofClientPatch$lambda$9$lambda$8(SpoofClientPatch.kt:85)
        at app.revanced.patcher.patch.Patch.execute(Patch.kt:71)
        at app.revanced.patcher.patch.BytecodePatch.execute$revanced_patcher(Patch.kt:159)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend$execute(Patcher.kt:84)
        at app.revanced.patcher.Patcher$invoke$1.invokeSuspend(Patcher.kt:109)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at app.revanced.patcher.Patcher$invoke$1.invoke(Patcher.kt)
        at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:57)
        at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:226)
        at app.revanced.cli.command.PatchCommand$run$1$4.invokeSuspend(PatchCommand.kt:315)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
        at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
        at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)
        at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
        at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)
        at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
        at app.revanced.cli.command.PatchCommand.run(PatchCommand.kt:314)
        at picocli.CommandLine.executeUserObject(CommandLine.java:2030)
        at picocli.CommandLine.access$1500(CommandLine.java:148)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
        at picocli.CommandLine.execute(CommandLine.java:2174)
        at app.revanced.cli.command.MainCommandKt.main(MainCommand.kt:12)

Have tried using: 9.0.60.607 , 9.0.58.594, 9.0.60.614

Latest commit broke the patch

yeah, just tried it and it worked
Funny refactor

@0xrxL
Copy link

0xrxL commented Jul 10, 2025

@oSumAtrIX It's not better to understand why iOS spoof works instead? I believe this patch will could be fixed in a minute by Spotify, if it will be used.

Nuckyz
Nuckyz previously approved these changes Jul 10, 2025
@oSumAtrIX
Copy link
Member

oSumAtrIX commented Jul 11, 2025

Open or not has zero difference, but I won't elaborate here.

in private, it may be much harder for spotify to fix

This is false

@Nuckyz Nuckyz dismissed their stale review July 11, 2025 14:16

stale

@oSumAtrIX oSumAtrIX merged commit e36d4c1 into ReVanced:dev Jul 11, 2025
github-actions bot pushed a commit that referenced this pull request Jul 11, 2025
# [5.31.0-dev.16](v5.31.0-dev.15...v5.31.0-dev.16) (2025-07-11)

### Features

* **Spotify - Spoof client:** Fix issues like songs skipping by spoofing to iOS ([#5388](#5388)) ([e36d4c1](e36d4c1))
* **YouTube:** Disable two-finger tap gesture for skipping chapters ([#5374](#5374)) ([71db0a2](71db0a2))
github-actions bot pushed a commit that referenced this pull request Jul 11, 2025
# [5.31.0](v5.30.0...v5.31.0) (2025-07-11)

### Bug Fixes

* **Bacon Reader - Spoof client:** Use www instead of ssl API to fix auth related issues  ([#5402](#5402)) ([72459bb](72459bb))
* Correctly name `Enable ROM signature spoofing` patch ([d85881a](d85881a))
* Fix accidental changes ([e2ac841](e2ac841))
* Fix refactoring typo ([ec0ae42](ec0ae42))
* Handle empty list of announcements ([de9d720](de9d720))
* **SoundCloud:** Constrain patches to last working app target ([e8ea89f](e8ea89f))
* **Spotify - Unlock Premium:** Remove wrongfully hidden non ad browse sections ([#5403](#5403)) ([8633544](8633544))
* **Spotify:** Remove other ads type from the browse screen ([#5333](#5333)) ([c68533a](c68533a))
* **Sync for Reddit - Spoof client:** Use www instead of ssl API to fix auth related issues ([#5392](#5392)) ([47e6b62](47e6b62))
* **YouTube - Hide ads:** Hide new type of general ad ([#5345](#5345)) ([f23716b](f23716b))
* **YouTube - Hide layout components:** Do not hide playlist sort button if 'Hide AI comments summary' is on ([5f3e48e](5f3e48e))
* **YouTube - Playback speed:** Allow custom speeds with 0.01x precision ([#5360](#5360)) ([0eecef0](0eecef0))
* **YouTube - Slide to seek:** Show tap and hold 2x speed overlay when active ([#5398](#5398)) ([dbc9c5f](dbc9c5f))

### Features

* **Cricbuzz - Hide ads:** Hide Cricbuzz11 UI elements ([#5381](#5381)) ([a42c98f](a42c98f))
* **Lightroom:** Constrain patches to last working version ([#5335](#5335)) ([32ce70e](32ce70e))
* **Spotify - Spoof client:** Fix issues like songs skipping by spoofing to iOS ([#5388](#5388)) ([e36d4c1](e36d4c1))
* **Spotify:** Remove support for old versions ([#5404](#5404)) ([9d31238](9d31238))
* **YouTube - Change header:** Add in-app setting to change the app header ([#5346](#5346)) ([9ba45b6](9ba45b6))
* **YouTube - Hide layout components:** Add `Hide channel links preview` and `Hide 'Visit Community' button` in channel page ([#5320](#5320)) ([9d9cce3](9d9cce3))
* **YouTube:** Disable two-finger tap gesture for skipping chapters ([#5374](#5374)) ([71db0a2](71db0a2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

bug(Spotify): Songs skipping / Music playback does not work
10 participants