๐งฉ Movistar Plus
July 11, 2026 ยท View on GitHub
A source of patches for Morphe (compatible with the ReVanced ecosystem) that removes ads and promotional clips from the Movistar Plus Android TV app without manually recompiling it. The patcher modifies the original APK's bytecode and injects a small extension.
โ ๏ธ Disclaimer: This project is provided for educational and interoperability purposes only. Apply these patches only to an APK that you have obtained legally, and do so at your own risk.
โ What it does
The Movistar Plus app plays advertisements embedded in the video stream (pre-rolls, promotional content, PROMO_AD clips, etc.). This patch intercepts the exact moment when the player is about to load content, determines whether it is an advertisement, and if so, prevents it from playing and immediately skips to the actual content.
In short, the Block Ads patch:
- Detects whether the content about to be played is an advertisement.
- Blocks the player initialization for that advertisement.
- Automatically skips to the next piece of content (the program or channel the user originally wanted to watch).
โ๏ธ How it works internally
The patch consists of two parts working together: the bytecode patch (Kotlin) and the injected extension (Java).
1. Fingerprint โ locating the target method
Fingerprints.kt defines a fingerprint that locates the player method to modify. Instead of searching for a string (which does not exist in the bytecode), it identifies the method by its name and class:
methodDef.name == "initializePlayer" &&
classDef.type == "Lcom/movistarplus/androidtv/player/PlayerTV;"
The target method is:
PlayerTV.initializePlayer(Uri, long, boolean, PlayerDataModel, String)
2. The bytecode patch โ injecting the check
ExamplePatch.kt (the bytecodePatch named "Block Ads") injects a call to the extension at the beginning of initializePlayer, followed by a conditional return in Smali:
invoke-static {p5}, Lapp/template/extension/extension/ExamplePatch;->shouldBlockAndSkip(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :continue
return-void # If it's an ad -> exit without initializing the player
:continue
nop
p5is thePlayerDataModel(the metadata of the content about to be played).- If
shouldBlockAndSkip(...)returnstrue,return-voidis executed and the player never initializes the advertisement. - If it returns
false, execution continues normally.
The extension is linked using extendWith("extensions/extension.mpe"), and the patch is only applied to the Movistar app through compatibleWith(COMPATIBILITY_MOVISTAR).
3. The extension โ deciding and skipping
extensions/.../ExamplePatch.java contains the runtime logic:
shouldBlockAndSkip(Object playerData)inspects thePlayerDataModelto determine whether the content is an advertisement. It detects ads in two ways:playerDataModel.isAds()returnstrue, orplayerDataModel.getTypeOfContent()equalsPlayerDataModel.TYPE_PROMO_AD("PROMO_AD").
- If an ad is detected, it calls
notifyPlayerEnded(), which dispatches theendedevent to the app's Cordova/JavaScript layer so playback immediately advances to the real content:
Class.forName("com.movistarplus.androidtv.MainActivity")
.getMethod("fireEvent", String.class)
.invoke(null, "ended"); // fireEvent is static
This static invocation is essential: MainActivity.fireEvent(String) is public static and uses the internal cordovaWebView, so no activity instance is required.
๐ฉน Available patches
v1.0.9ย ย โขย ย
mainย ย โขย ย 1 patch available
๐ฆ Movistar Plusย ย โขย ย 1 patch
๐ฏ Supported versions:
| 26.03.100 |
|---|
| ๐ Patch | ๐ Description | โ๏ธ Options |
|---|---|---|
| Block Ads | Blocks advertisements and promotional clips. | โ |
๐ How to use these patches
Option A โ Add this source to Morphe (recommended)
Add this repository as a patch source in Morphe:
https://github.com/Tornillo2/movistar-block-ads-morphe
Then select the Movistar Plus app, enable the Block Ads patch, apply it to the original APK, and install the resulting patched APK.
Option B โ ReVanced CLI
java -jar revanced-cli.jar patch \
-b patches.rvp \
-o movistarplus-patched.apk \
movistarplus-original.apk
Always apply patches to an unmodified original APK, never to one that has already been patched.
๐ ๏ธ Building the project
Requires JDK 17+ and the included Gradle wrapper.
./gradlew build
This builds:
- The
patchesmodule (Kotlin) โ the patch bundle (.rvp). - The
extensions/extensionmodule (Java) โ theextension.mpeextension embedded into the app.
See the Morphe documentation for more details.
Repository structure
patches/ # Bytecode patches (Kotlin)
โโ .../example/
โโ ExamplePatch.kt # "Block Ads" patch: injects the check into initializePlayer
โโ Fingerprints.kt # Locates PlayerTV.initializePlayer
โโ ../shared/Constants.kt # COMPATIBILITY_MOVISTAR (package + supported versions)
extensions/extension/ # Extension injected into the app (Java)
โโ .../ExamplePatch.java # shouldBlockAndSkip() + notifyPlayerEnded()
patches-list.json # Patch list metadata
.github/workflows/ # CI: PR builds and automatic releases (semantic-release)
๐ Verifying that it works
Install the patched APK and monitor the logs:
adb logcat -s MorpheBlockAds
When an advertisement is skipped, you should see:
Ad detected... Blocking playback
fireEvent('ended') dispatched successfully.
๐ License
This project is licensed under the GNU General Public License v3.0.