๐Ÿงฉ 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:

  1. Detects whether the content about to be played is an advertisement.
  2. Blocks the player initialization for that advertisement.
  3. 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
  • p5 is the PlayerDataModel (the metadata of the content about to be played).
  • If shouldBlockAndSkip(...) returns true, return-void is 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 the PlayerDataModel to determine whether the content is an advertisement. It detects ads in two ways:
    • playerDataModel.isAds() returns true, or
    • playerDataModel.getTypeOfContent() equals PlayerDataModel.TYPE_PROMO_AD ("PROMO_AD").
  • If an ad is detected, it calls notifyPlayerEnded(), which dispatches the ended event 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 AdsBlocks advertisements and promotional clips.โ€”

๐Ÿš€ How to use these patches

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 patches module (Kotlin) โ†’ the patch bundle (.rvp).
  • The extensions/extension module (Java) โ†’ the extension.mpe extension 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.