Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
e8c520c
chore: Add more permissive header to add resource files that requires…
LisoUseInAIKyrios Oct 22, 2026
0d5663d
chore: Change to patcher implementation of code instead of patches-li…
LisoUseInAIKyrios Oct 22, 2026
18acc41
chore: Update gradle
LisoUseInAIKyrios Oct 22, 2026
0345136
fix(YouTube): Miniplayer covered by the keyboard and empty band above…
0xrxL Oct 22, 2026
b8e1fdd
fix(YouTube - Navigation bar): Translucent navigation bar is not show…
0xrxL Oct 22, 2026
f80398e
fix(YouTube - Hide status bar): Video player is moved below the displ…
0xrxL Oct 22, 2026
01e767c
feat(YouTube - Navigation bar): Add "Disable toolbar navigation tabs"…
0xrxL Oct 23, 2026
7127541
fix(YouTube): Morphe flyout menu items are missing on tablets
0xrxL Oct 23, 2026
fbb628b
feat(YouTube): Add `Search comments` patch (#3942)
RAMiK4 Oct 23, 2026
4599204
bump(YouTube): Add support for `21.23.492`
LisoUseInAIKyrios Oct 23, 2026
666508e
chore: Update translations from Crowdin
crowdin-bot Oct 23, 2026
8601a69
chore: Release v1.49.0-dev.1 [skip ci]
semantic-release-bot Oct 23, 2026
d2accff
fix(YouTube): Morphe flyout menu items are missing in the new popup menu
0xrxL Oct 23, 2026
47f511c
fix(YouTube - Navigation buttons): Create button is not hidden with t…
0xrxL Oct 23, 2026
be733a6
fix(YouTube - Playback speed): Channel speed whitelist does not work …
0xrxL Oct 23, 2026
60efeb5
fix(YouTube - Shorts autoplay): Overlay is out of place when going ba…
0xrxL Oct 23, 2026
e092212
feat(YouTube Music - Third-party lyrics): enhance sync engine, provid…
imannig Oct 23, 2026
7988621
fix(YouTube Music - Downloads): Fix missing metadata in downloaded so…
zappybiby Oct 23, 2026
7259e27
fix(YouTube Music - Downloads): Fix wrong song downloads (#3978)
zappybiby Oct 23, 2026
0115896
fix(YouTube - Navigation bar): System navigation buttons cannot be se…
0xrxL Oct 24, 2026
2576962
fix(YouTube - Navigation bar): No connection and back online bars are…
0xrxL Oct 24, 2026
bac5823
fix(YouTube - Navigation bar): Empty band below the reply bar of the …
0xrxL Oct 24, 2026
60489d8
fix(YouTube - Feed card layout): Horizontal shelves lose the card bac…
0xrxL Oct 24, 2026
bf6fbe0
fix(YouTube - Hide status bar): Status bar covers the top bar or leav…
0xrxL Oct 24, 2026
c0ec5ae
fix(YouTube - Feed card layout): Videos of the horizontal shelves are…
0xrxL Oct 24, 2026
64e3e0e
fix(YouTube - Disable continue watching prompt): Prompt can still app…
zappybiby Oct 24, 2026
6c413e5
bump(YouTube): Add experimental support for `21.43.523`
LisoUseInAIKyrios Oct 24, 2026
3881d65
chore: Release v1.49.0-dev.2 [skip ci]
semantic-release-bot Oct 24, 2026
6707f0e
fix(Reddit - Redgifs audio): Error toast is shown when network reques…
LisoUseInAIKyrios Oct 24, 2026
68b01ca
fix(YouTube): 21.43 navigation tabs cannot be hidden
LisoUseInAIKyrios Oct 24, 2026
a10e596
chore: Release v1.49.0-dev.3 [skip ci]
semantic-release-bot Oct 24, 2026
a9e6562
fix(YouTube - Hide status bar): Status bar scroll color and transluce…
0xrxL Oct 24, 2026
9f0c6d3
chore: Update dependencies
LisoUseInAIKyrios Oct 24, 2026
52fa134
fix(YouTube): Fingerprints are not found on some targets between 21.0…
0xrxL Oct 24, 2026
006a9d4
refactor(Extensions): Inline small methods that are called only once
0xrxL Oct 24, 2026
8554412
fix(YouTube - Miniplayer): "Disable resuming miniplayer" may not work…
LisoUseInAIKyrios Oct 24, 2026
aeb3012
fix(YouTube - Ambient mode): Ambient mode is not disabled with 21.43
0xrxL Oct 24, 2026
eb9cea9
chore: Update translations from Crowdin
crowdin-bot Oct 24, 2026
97f1f2d
fix(YouTube - Feed card layout): Shorts shelves change width and corn…
0xrxL Oct 24, 2026
4ac3613
chore: Release v1.49.0-dev.4 [skip ci]
semantic-release-bot Oct 24, 2026
5cd2eb2
fix(YouTube - Miniplayer): Minimal miniplayer is covered by the keybo…
0xrxL Oct 24, 2026
9cc833f
fix(YouTube - Theme): Custom background colors are not applied with 2…
0xrxL Oct 24, 2026
1669acd
fix: Temporarily change expired PoToken check to log only instead of …
MarcaDian Oct 24, 2026
a38f540
chore: Release v1.49.0-dev.5 [skip ci]
semantic-release-bot Oct 24, 2026
b2688c5
fix(YouTube - Captions): Captions not shown in picture-in-picture on …
sap6 Oct 24, 2026
8b3dd7b
chore(deps): bump cycjimmy/semantic-release-action from 6 to 8 (#4030)
dependabot[bot] Oct 24, 2026
4f108b5
fix(YouTube - Playback speed): Channel speed whitelist is not applied…
0xrxL Oct 25, 2026
db9af37
feat(YouTube - Navigation bar): Add "Navigation bar style" setting
0xrxL Oct 25, 2026
9a0fee9
fix(YouTube - Hide layout components): Fix actions blocked by Hide Sn…
zappybiby Oct 25, 2026
dd97d93
feat(YouTube - Downloads): Add "Quick download on tap" setting (#3883)
RAMiK4 Oct 25, 2026
372eea2
feat(YouTube - Add to queue): Add "Native queue" setting (#3953)
CaptKraken Oct 25, 2026
fcc02f7
bump(Reddit): Add support for `2026.40.0`
LisoUseInAIKyrios Oct 25, 2026
6407d5e
bump(Reddit): Add experimental support for `2026.43.0`
LisoUseInAIKyrios Oct 25, 2026
2b07abb
feat(YouTube - Media notification controls): Add options to seek with…
OolaaPleur Oct 25, 2026
a9bc8b1
chore: Update translations from Crowdin
crowdin-bot Oct 25, 2026
0ac8e87
chore: Release v1.49.0-dev.6 [skip ci]
semantic-release-bot Oct 25, 2026
445194d
feat(YouTube): Show a warning when changing 'Navigation bar style' or…
0xrxL Oct 25, 2026
bb6e0e3
fix(YouTube - Minimal miniplayer): Bar is partly covered by the keybo…
0xrxL Oct 25, 2026
5f96fbe
feat(YouTube): Add `Download post images` patch (#3966)
RAMiK4 Oct 25, 2026
b717a69
feat(YouTube - Playback speed): Add playback speed to the Shorts play…
RAMiK4 Oct 25, 2026
3e15dcd
fix(YouTube - Video quality): Shorts quality menu sets another qualit…
0xrxL Oct 25, 2026
4764483
fix(YouTube - Litho filter): Filtered elements leave empty cells in t…
0xrxL Oct 25, 2026
3b3308b
fix(YouTube - Search comments): Search button is not shown in the Sho…
0xrxL Oct 25, 2026
ed3b48f
chore(YouTube): Cleanup code
LisoUseInAIKyrios Oct 25, 2026
83c0cf0
fix(YouTube - Force fullscreen landscape): Screen rotates before the …
Flarette Oct 25, 2026
e200765
fix(YouTube - Captions): Old caption stays on screen after SponsorBlo…
sap6 Oct 25, 2026
f4c1f84
fix(YouTube - Disable playlist autoplay): fix looping the current vid…
zappybiby Oct 25, 2026
bcf540a
refactor(YouTube): Change extension Kotlin code to Java
LisoUseInAIKyrios Oct 25, 2026
82efbab
fix(YouTube - Video quality): Shorts quality selected in the menu is …
0xrxL Oct 25, 2026
7e665c6
fix(YouTube - Minimal miniplayer): Video title and channel are missin…
0xrxL Oct 25, 2026
5545e3c
fix(YouTube - Add to queue): Feed below the player stutters while scr…
0xrxL Oct 25, 2026
66d9726
refactor(YouTube - Add to queue): Clean up native queue extension code
0xrxL Oct 25, 2026
c5f9f94
fix(YouTube - Add to queue): Native queue index errors crash before A…
0xrxL Oct 25, 2026
efbc9b1
fix(YouTube - Miniplayer): Related videos lists show a black frame af…
0xrxL Oct 26, 2026
e32b05c
fix(YouTube - Litho filter): Filtered elements leave empty cells in t…
0xrxL Oct 26, 2026
e009d8b
fix(YouTube - Add to queue): Fix native queue on experimental version…
CaptKraken Oct 26, 2026
cdaa492
chore: Update translations from Crowdin
crowdin-bot Oct 26, 2026
eadda39
chore: Release v1.49.0-dev.7 [skip ci]
semantic-release-bot Oct 26, 2026
93bd035
feat(YouTube - Channel search): Search the posts of the channel (#4078)
RAMiK4 Oct 26, 2026
5afde69
chore: Sign releases with the signing key
MarcaDian Oct 26, 2026
a4ced15
chore: Update the changelog plugin
MarcaDian Oct 26, 2026
68b8628
fix(YouTube - Player icon style): Add Ionicons picture in picture but…
MarcaDian Oct 26, 2026
ef8dcef
fix(YouTube - Premium-style queue): Play the queue when the player Ne…
abemurica Oct 26, 2026
ef28427
fix(YouTube - Premium-style queue): Fix missing titles and stale now …
abemurica Oct 26, 2026
c710042
fix(YouTube - Playback speed): Use the bold icon for the Shorts playe…
MarcaDian Oct 26, 2026
93c6893
fix(YouTube Music - Downloads): Fix song menu downloads for accounts …
0xrxL Oct 26, 2026
e85aac6
chore(Downloads): Change default setting
LisoUseInAIKyrios Oct 26, 2026
00a4bf4
feat(YouTube Music - Third-party lyrics): Streamline lyrics viewing e…
urroxyz Oct 26, 2026
6d81d58
refactor: Prompt to restart after settings is closed
LisoUseInAIKyrios Oct 26, 2026
456e0db
feat(YouTube - Downloads): Add playlist downloads for accounts withou…
0xrxL Oct 26, 2026
6d43157
fix(YouTube - Litho filter): Crash when scrolling a list after a filt…
0xrxL Oct 27, 2026
5fed7fc
fix(YouTube - Channel whitelists): Flyout menu opens with a delay whi…
0xrxL Oct 27, 2026
5acc298
chore(YouTube - Change form factor): Show `Enable tablet layout in pl…
0xrxL Oct 27, 2026
15a1700
fix(YouTube - Return YouTube Dislike): Feed thumbnail like count is n…
0xrxL Oct 27, 2026
e9f77d7
feat(YouTube): Add Niconico-style live/replay comments (#4080)
david419kr Oct 27, 2026
7159826
feat(YouTube - Downloads): Add download item to the Shorts menu (#4099)
RAMiK4 Oct 27, 2026
e0ea264
chore: Update translations from Crowdin
crowdin-bot Oct 27, 2026
e2ff1ea
chore: Release v1.49.0-dev.8 [skip ci]
semantic-release-bot Oct 27, 2026
04e791d
feat(YouTube): Redirect Watch later saves to a chosen playlist (#4016)
anuraggr Oct 27, 2026
90d011d
fix(YouTube - Downloads): Downloaded videos that work at first may no…
LisoUseInAIKyrios Oct 27, 2026
d4741b9
chore: Add another tablet layout disclaimer
LisoUseInAIKyrios Oct 27, 2026
42697d0
chore: Update translations from Crowdin
crowdin-bot Oct 27, 2026
03ef708
fix(YouTube): Feed thumbnail badges are missing after scrolling up, s…
0xrxL Oct 27, 2026
fbb095d
feat: Validate custom header and icon folders when the option is set
MarcaDian Oct 27, 2026
35e4123
fix(YouTube): Watch page feed lags when scrolling
0xrxL Oct 27, 2026
0e058e8
fix(YouTube - Feed video actions): Watch later button opens the chann…
0xrxL Oct 27, 2026
b012535
fix(YouTube - Feed view count): View count badge covers the duration …
0xrxL Oct 27, 2026
141aa8f
bump(YouTube Music): Add experimental support for `9.43.51`
LisoUseInAIKyrios Oct 27, 2026
1f24e84
feat(YouTube - Theme): Add experimental YT splash screen animation (#…
LisoUseInAIKyrios Oct 27, 2026
de9e6e4
feat(YouTube - Custom branding): Add experimental YouTube launcher ic…
LisoUseInAIKyrios Oct 27, 2026
b54aaec
fix(YouTube): Channel page community posts do not load when feed "Hid…
anuraggr Oct 27, 2026
0ce43f7
fix(YouTube): Remove legacy litho buffer filtering code required for …
LisoUseInAIKyrios Oct 27, 2026
d145e14
chore(YouTube - Custom branding): Rename 'neon' to 'analog'
LisoUseInAIKyrios Oct 27, 2026
fb51b72
feat(YouTube): Hidden a new type of community post
0xrxL Oct 27, 2026
51dfd75
fix(YouTube - Feed video actions): Watch later button is missing afte…
0xrxL Oct 27, 2026
74ae9dd
chore: Update translations from Crowdin
crowdin-bot Oct 27, 2026
71c8c7c
chore: Release v1.49.0-dev.9 [skip ci]
semantic-release-bot Oct 27, 2026
3edf03b
fix(YouTube - Spoof video streams): Patch can be included for root in…
LisoUseInAIKyrios Oct 27, 2026
7532430
fix(YouTube - Ask flyout menu): Ask chat window can be hidden by onsc…
LisoUseInAIKyrios Oct 27, 2026
dae6bb7
chore(YouTube - Custom branding): Log why a custom header or icon fol…
LisoUseInAIKyrios Oct 27, 2026
7faa488
fix(YouTube - Video quality): Selected quality is not applied to the …
0xrxL Oct 28, 2026
9d3b53c
fix(YouTube - Hide status bar): Top bars are covered by a second stat…
0xrxL Oct 28, 2026
9542d24
fix(YouTube): Restore TalkBack access to Shorts comments and descript…
zappybiby Oct 28, 2026
7f1a6b3
fix(YouTube - Theme): Glow startup animation does not extend to fulls…
LisoUseInAIKyrios Oct 28, 2026
1fc1475
chore: Release v1.49.0-dev.10 [skip ci]
semantic-release-bot Oct 28, 2026
16012c9
chore(YouTube - Theme): Glow startup animation can loop if app is sen…
LisoUseInAIKyrios Oct 28, 2026
c000b53
fix(YouTube - Video quality): Video restarts or plays faster after se…
0xrxL Oct 28, 2026
1562880
chore(Reddit): Suppress Lint Error
ILoveOpenSourceApplications Oct 28, 2026
4344fab
fix(YouTube): Feed thumbnail badges disappear while scrolling, are mi…
0xrxL Oct 28, 2026
a4ecfcf
fix(YouTube): Watch history search bar from getting hidden when selec…
ILoveOpenSourceApplications Oct 28, 2026
aeac8c9
fix(YouTube - Ambient mode): Bypass Ambient mode restrictions does no…
0xrxL Oct 28, 2026
a7ce357
feat(YouTube - Hide layout components): Add "Hide 'Unavailable videos…
ILoveOpenSourceApplications Oct 28, 2026
e6fd2c0
refactor(YouTube - Video quality): Use Morphe matching helpers and sh…
0xrxL Oct 28, 2026
328b85a
fix(YouTube - Video quality): Short plays the previous quality segmen…
0xrxL Oct 28, 2026
4c00210
fix(YouTube): Prevent TalkBack crashes caused by Litho hover recursio…
zappybiby Oct 28, 2026
16d4e60
fix(YouTube - Video quality): Quality selected for a regular video is…
0xrxL Oct 28, 2026
e1410e3
fix(YouTube Music - Change miniplayer color): Miniplayer color does n…
ILoveOpenSourceApplications Oct 28, 2026
b22841c
fix(YouTube): Fix TalkBack not reading captions (#4136)
zappybiby Oct 28, 2026
89defd5
bump(YouTube): Add support for `21.30.216`
LisoUseInAIKyrios Oct 28, 2026
a325744
fix(YouTube - Video quality): Short loop restarts with the previous q…
0xrxL Oct 28, 2026
36e3612
fix(YouTube - Video quality): Buffered video is cleared with the plac…
0xrxL Oct 28, 2026
e5cd752
fix(YouTube - Video quality): Regular video returns to the default qu…
0xrxL Oct 28, 2026
26715b1
fix(YouTube - Feed view count): View count badge of a card that enter…
0xrxL Oct 28, 2026
43a9e4c
fix(YouTube - Ambient mode): Ambient mode is replaced by a black back…
0xrxL Oct 28, 2026
f8180da
feat(YouTube - Minimal miniplayer): Swipe the bar up to move it to th…
0xrxL Oct 28, 2026
e11da94
fix(YouTube - Hide layout components): "Visit the community" entry po…
0xrxL Oct 29, 2026
5c6357f
fix(YouTube - Feed card layout): Movies converted to cards are not hi…
0xrxL Oct 29, 2026
394ab97
fix(YouTube): Feed thumbnail badges are shown on the page header of a…
0xrxL Oct 29, 2026
958aa55
fix(YouTube - Video quality): Extend the background resume fix of reg…
0xrxL Oct 29, 2026
a5d943b
feat(YouTube Music - Third-party lyrics): Per-syllable romanization l…
imannig Oct 29, 2026
6dbdf82
feat(YouTube - Theme): Add "Glow Morphe" experimental splash screen t…
LisoUseInAIKyrios Oct 29, 2026
793f044
bump(Reddit): Add experimental support for `2026.44.0`
LisoUseInAIKyrios Oct 29, 2026
9fda3d2
chore: Release v1.49.0-dev.11 [skip ci]
semantic-release-bot Oct 29, 2026
60b7bef
fix(YouTube) Seeking fails for downloaded videos when internet is act…
anuraggr Oct 29, 2026
c596d42
build: Treat breaking changes as major releases
LisoUseInAIKyrios Oct 29, 2026
68cbc78
chore(YouTube - Spoof video streams): App crashes on video open with …
LisoUseInAIKyrios Oct 29, 2026
5f09be0
chore: After changing a restart required setting and exiting the main…
LisoUseInAIKyrios Oct 29, 2026
996bc00
chore(YouTube - Series tracker): Change patch to not depend on `Navig…
LisoUseInAIKyrios Oct 29, 2026
f049c91
bump(YouTube Music): Add support for `9.30.53`
ILoveOpenSourceApplications Oct 29, 2026
69b4632
chore(YouTube - Series tracker): Patching fails when the Navigation b…
LisoUseInAIKyrios Oct 29, 2026
4b3a8dc
chore(YouTube - Miniplayer): Restore 21.30 in-app message of where th…
LisoUseInAIKyrios Oct 29, 2026
136851e
feat(YouTube): Add offline sponsorblock segment support for in-app do…
anuraggr Oct 29, 2026
de2d7e9
chore(YouTube Music): For now keep `9.20.53` and remove a little later
LisoUseInAIKyrios Oct 29, 2026
a3b34d7
feat(YouTube): Highlight new in-app settings (#4162)
LisoUseInAIKyrios Oct 29, 2026
0c5dc17
fix(YouTube - Download post images): Match posts with texts of many l…
RAMiK4 Oct 29, 2026
e003b1a
chore: Update translations from Crowdin
crowdin-bot Oct 29, 2026
cc9b10b
chore: Release v2.0.0-dev.1 [skip ci]
semantic-release-bot Oct 29, 2026
5d571a0
feat(YouTube): Add `Translate posts` patch (#4163)
RAMiK4 Oct 29, 2026
82103d3
fix(YouTube - Navigation bar): Navigation bar transluency not working…
ILoveOpenSourceApplications Oct 29, 2026
b266aee
chore(YouTube - Navigation bar): Remove unnecessary warning
ILoveOpenSourceApplications Oct 29, 2026
ba1ac73
fix(YouTube - Captions): Stabilize automatic captions and restore tra…
itolkien Oct 29, 2026
035718b
feat(YouTube): Show Morphe messages in snackbar instead of a toast (#…
0xrxL Oct 30, 2026
4dc345b
fix(YouTube - Return YouTube Dislike): Feed thumbnail like count blin…
RAMiK4 Oct 30, 2026
54b7371
fix(YouTube - Feed video actions): Watch later button is shown above …
RAMiK4 Oct 30, 2026
d6983da
feat(YouTube): Apply offline SponsorBlock segments to playlist downlo…
anuraggr Oct 30, 2026
86fb1b0
chore: Update translations from Crowdin
crowdin-bot Oct 30, 2026
dc2d6e2
chore: Release v2.0.0-dev.2 [skip ci]
semantic-release-bot Oct 30, 2026
a33a012
chore: Update dependency
LisoUseInAIKyrios Oct 30, 2026
b6e0a64
feat(YouTube Music - Third-party lyrics): UI changes, partial feature…
BingoKingo Oct 30, 2026
ae2887e
chore: Adjust default "what's new" dot from 3 days to 2 days
LisoUseInAIKyrios Oct 30, 2026
65e9661
chore: Release v2.0.0-dev.3 [skip ci]
semantic-release-bot Oct 30, 2026
60daa80
fix(YouTube - Navigation bar): Black band below pages and the Shorts …
0xrxL Oct 30, 2026
b373534
fix(YouTube - Hide layout components): Community posts are shown belo…
0xrxL Oct 30, 2026
9f5237c
chore: Fix string new line encoding
LisoUseInAIKyrios Oct 30, 2026
d3a2609
chore(YouTube): Cleanup the element hooks that slow down the loading …
0xrxL Oct 30, 2026
b6312e8
chore: Fix string escaping
LisoUseInAIKyrios Oct 30, 2026
46a57bc
chore: Update translations from Crowdin
crowdin-bot Oct 30, 2026
24e6abb
chore: Release v2.0.0-dev.4 [skip ci]
semantic-release-bot Oct 30, 2026
3977417
ci: Simplify string check task
LisoUseInAIKyrios Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/build_pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- name: Test
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew :patches:test :extensions:youtube:testDebugUnitTest --no-daemon
run: ./gradlew :patches:test :extensions:youtube:testDebugUnitTest :extensions:music:testDebugUnitTest --no-daemon

# buildAndroid adds DEX to the jar in place. A later JVM task can recreate
# that same archive without DEX, so Android packaging must run last.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/crowdin_pull.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
- name: Check strings on crowdin
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew checkStringResources -PnoProguard
run: ./gradlew checkStringResources

# Step 3: Checkout dev branch to prepare for merging
- name: Checkout dev branch for merge
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,11 @@ jobs:
run: npm install

- name: Release
uses: cycjimmy/semantic-release-action@v6
uses: cycjimmy/semantic-release-action@v8
id: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MORPHE_SIGNING_KEY: ${{ secrets.MORPHE_SIGNING_KEY }}

- name: Attest
if: steps.release.outputs.new_release_published == 'true'
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Private key that signs the patches file
morphe-signing.key

# Gradle files
.gradle/
build/
Expand Down
4 changes: 3 additions & 1 deletion .releaserc
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
[
"@semantic-release/commit-analyzer", {
"releaseRules": [
{ "breaking": true, "release": "major" },
{ "type": "fix", "release": "patch" },
{ "type": "feat", "release": "minor" },
{ "type": "bump", "release": "patch" },
Expand Down Expand Up @@ -37,7 +38,8 @@
"releaseJson": {
"path": "patches-bundle.json",
"downloadUrlTemplate": "https://github.com/${owner}/${repo}/releases/download/v${version}/patches-${version}.mpp",
"signatureUrlTemplate": ""
"signatureUrlTemplate": "",
"publicKeyPath": "morphe-signing.pub"
}
}
],
Expand Down
261 changes: 261 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

26 changes: 15 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,20 @@ All modifications made by Morphe, along with their dates, can be found in the Gi
## 🩹 Patches list

<!-- PATCHES_START -->
> **[v1.48.0](https://github.com/MorpheApp/morphe-patches/releases/tag/v1.48.0)**&nbsp;&nbsp;•&nbsp;&nbsp;`main`&nbsp;&nbsp;•&nbsp;&nbsp;190 patches total
> **[v2.0.0-dev.4](https://github.com/MorpheApp/morphe-patches/releases/tag/v2.0.0-dev.4)**&nbsp;&nbsp;•&nbsp;&nbsp;`dev`&nbsp;&nbsp;•&nbsp;&nbsp;194 patches total
<details>
<summary>📦 YouTube&nbsp;&nbsp;•&nbsp;&nbsp;105 patches</summary>
<summary>📦 YouTube&nbsp;&nbsp;•&nbsp;&nbsp;109 patches</summary>
<br>

**🎯 Supported versions:**

| 🧪&nbsp;21.42.241 | 🧪&nbsp;21.41.525 | 🧪&nbsp;21.28.208 | 🧪&nbsp;21.23.492 | 21.20.405 | 21.16.256 | 20.51.39 | 20.21.37 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 🧪&nbsp;21.43.523 | 🧪&nbsp;21.42.241 | 21.30.216 | 21.28.208 | 21.23.492 | 20.51.39 | 20.26.46 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |

| 💊&nbsp;Patch | 📜&nbsp;Description | ⚙️&nbsp;Options |
|----------|----------------|-----------|
| [AI channel filter](#ai-channel-filter) | Adds options to hide videos from channels flagged as AI-generated by the AiSList community list and to report AI channels from the video menu. | |
| [Add to queue](#add-to-queue) | Overrides the feed flyout 'Play next in queue' with the Morphe video queue. | |
| [Add to queue](#add-to-queue) | Adds a video queue to the feed flyout menu, using either the Morphe queue or a native queue that uses YouTube's playlist interface. | |
| [Ambient mode](#ambient-mode) | Forces Ambient mode on and adds options to bypass power saving restrictions for Ambient mode and disable it entirely or in fullscreen. | |
| [App refresh rate](#app-refresh-rate) | Adds an option to change the app refresh rate. | |
| [Ask flyout menu](#ask-flyout-menu) | Adds a video menu entry that opens Ask for the video and summarizes the video. This patch works with YouTube 21.16.256 and newer. | |
Expand Down Expand Up @@ -83,6 +83,7 @@ All modifications made by Morphe, along with their dates, can be found in the Gi
| [Disable sign in to TV popup](#disable-sign-in-to-tv-popup) | Adds options to disable the popups asking to sign into or connect to a TV on the same local network. | |
| [Disable video codecs](#disable-video-codecs) | Adds options to disable or force HDR, and to disable VP9 or AV1 codecs. | |
| [Double tap to seek](#double-tap-to-seek) | Adds additional double-tap to seek values to the YouTube settings menu. | |
| [Download post images](#download-post-images) | Adds a button and a menu item to download the images and GIFs of posts. | |
| [Downloads](#downloads) | Adds support to download videos with an external downloader app using the in-app download button or a video player action button, and adds an option to download videos in-app. | |
| [Enable debugging](#enable-debugging) | Adds options for debugging and exporting Morphe logs to the clipboard. | |
| [Exit fullscreen mode](#exit-fullscreen-mode) | Adds options to automatically exit fullscreen mode when a video reaches the end. | |
Expand Down Expand Up @@ -110,10 +111,11 @@ All modifications made by Morphe, along with their dates, can be found in the Gi
| [Hide video action buttons](#hide-video-action-buttons) | Adds options to hide video action buttons in fullscreen and portrait modes. | |
| [Loop video](#loop-video) | Adds an option to loop videos and display loop video button in the video player. | |
| [Media notification controls](#media-notification-controls) | Adds options to disable the seekbar and previous/next buttons in the media notification and headphone controls. | |
| [Miniplayer](#miniplayer) | Adds options to change the in-app minimized player. Patching 21.28.206 and lower has more miniplayer types to choose from. | |
| [Miniplayer](#miniplayer) | Adds options to change the in-app minimized player. Patching 21.28.208 and lower has more miniplayer types to choose from. | |
| [Mute button](#mute-button) | Adds an option to show a player button that mutes the video audio. | |
| [Navigation bar](#navigation-bar) | Adds options to hide and change the bottom navigation bar (such as the Shorts button) and the upper navigation toolbar. | • Hide Search app shortcut<br>• Hide Subscriptions app shortcut |
| [Network proxy](#network-proxy) | Adds settings to route supported network requests through an HTTP or HTTPS proxy. Including this patch may cause connectivity problems on certain devices | |
| [Niconico comments](#niconico-comments) | Adds an option to show live chat and chat replay as comments that scroll across the video. | |
| [Open Shorts in regular player](#open-shorts-in-regular-player) | Adds options to open Shorts in the regular video player. | |
| [Open channel of live avatar](#open-channel-of-live-avatar) | Adds an option to prevent a channel's current live video from opening when tapping its avatar. | |
| [Open links externally](#open-links-externally) | Adds an option to always open links in your browser instead of with the in-app browser. | |
Expand All @@ -134,7 +136,8 @@ All modifications made by Morphe, along with their dates, can be found in the Gi
| [Restore original titles](#restore-original-titles) | Adds an option to show the original video titles, video descriptions and channel descriptions instead of the auto-translated ones. | |
| [Return YouTube Dislike](#return-youtube-dislike) | Adds an option to show the dislike count of videos with Return YouTube Dislike, and the like count and like ratio on the thumbnails of feed videos. | |
| [Sanitize sharing links](#sanitize-sharing-links) | Removes the tracking query parameters from shared links. | |
| [Save to Watch later](#save-to-watch-later) | Adds an option to display save to Watch later button in the video player. | |
| [Save to Watch later](#save-to-watch-later) | Adds an option to display save to Watch later button in the video player, and adds a setting to redirect Watch later saves to a playlist of your choice. | |
| [Search comments](#search-comments) | Adds a button to the comments to show only the loaded comments that contain the searched words. | |
| [Seekbar](#seekbar) | Adds options to show old seekbar thumbnails, disable precise seeking when swiping up on the seekbar, slide to seek instead of playing at 2x speed when pressing and holding, tapping the player seekbar to seek, hiding the video player seekbar, enabling seeking in live streams, and expanding the live stream DVR duration. | |
| [Series tracking](#series-tracking) | Adds a series library to History with local progress and episode continuation. This patch works with YouTube 21.02 and newer. | |
| [Settings menu filter](#settings-menu-filter) | Adds an option to hide items on the standard YouTube settings screen by their visible name. | |
Expand All @@ -148,6 +151,7 @@ All modifications made by Morphe, along with their dates, can be found in the Gi
| [Spoof video streams](#spoof-video-streams) | Adds options to spoof the client video streams to fix playback. | |
| [Swipe controls](#swipe-controls) | Adds options to enable and configure volume and brightness swipe controls. | |
| [Theme](#theme) | Adds options for theming, and settings to change the app foreground and background colors. | • Dark theme color<br>• Light theme color |
| [Translate posts](#translate-posts) | Adds a menu item to translate the text of posts. | |
| [Video delay](#video-delay) | Adds an option to delay the video, to keep it in sync with laggy Bluetooth audio. | |
| [Video quality](#video-quality) | Adds options to set default video qualities and always use the advanced video quality menu. | |
| [Voice over translation](#voice-over-translation) | Adds additional voice over languages using text-to-speech synchronized to the video playback. | |
Expand All @@ -161,8 +165,8 @@ All modifications made by Morphe, along with their dates, can be found in the Gi

**🎯 Supported versions:**

| 🧪&nbsp;9.42.52 | 🧪&nbsp;9.41.52 | 🧪&nbsp;9.40.51 | 9.20.53 | 9.15.51 |
| :---: | :---: | :---: | :---: | :---: |
| 🧪&nbsp;9.43.51 | 🧪&nbsp;9.42.52 | 🧪&nbsp;9.41.52 | 9.30.53 | 9.20.53 | 9.15.51 |
| :---: | :---: | :---: | :---: | :---: | :---: |

| 💊&nbsp;Patch | 📜&nbsp;Description | ⚙️&nbsp;Options |
|----------|----------------|-----------|
Expand Down Expand Up @@ -224,8 +228,8 @@ All modifications made by Morphe, along with their dates, can be found in the Gi

**🎯 Supported versions:**

| 🧪&nbsp;2026.42.0 | 🧪&nbsp;2026.41.0 | 🧪&nbsp;2026.40.0 | 2026.24.0 | 2026.10.0 |
| :---: | :---: | :---: | :---: | :---: |
| 🧪&nbsp;2026.44.0 | 🧪&nbsp;2026.43.0 | 🧪&nbsp;2026.42.0 | 2026.40.0 | 2026.24.0 | 2026.10.0 |
| :---: | :---: | :---: | :---: | :---: | :---: |

| 💊&nbsp;Patch | 📜&nbsp;Description | ⚙️&nbsp;Options |
|----------|----------------|-----------|
Expand Down
2 changes: 2 additions & 0 deletions docs/custom-icons/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ named after the icon it replaces. Any icon left out keeps the **Automatic** styl
| `morphe_loop_video_button_range.xml` | Loop video button, loop a range |
| `morphe_mute_video_button_off.xml` | Mute button, sound on |
| `morphe_mute_video_button_on.xml` | Mute button, muted |
| `morphe_niconico_comments_button_off.xml` | Niconico comments button, hidden |
| `morphe_niconico_comments_button_on.xml` | Niconico comments button, shown |
| `morphe_pip_button.xml` | Picture in picture button |
| `morphe_play_all_button.xml` | Play all button |
| `morphe_player_captions_off.xml` | Player captions button, off |
Expand Down
Binary file modified docs/custom-icons/morphe-player-icons-tabler-png.zip
Binary file not shown.
Binary file modified docs/custom-icons/morphe-player-icons-tabler.zip
Binary file not shown.
1 change: 1 addition & 0 deletions extensions/music/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import com.android.build.api.dsl.ApplicationExtension

dependencies {
testImplementation(libs.junit)
compileOnly(libs.morphe.extensions.library)
compileOnly(project(":extensions:shared-youtube:library"))
compileOnly(project(":extensions:shared-youtube:stub"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,8 @@ private static void readSpeedDial(List<BrowseItem> items, ProtoMessage speedDial
}

private static void readTopResult(List<BrowseItem> items, ProtoMessage topResult) {
addTopBrowseResult(items, topResult.messageField(TOP_RESULT_PRIMARY));
addRenderer(items, topResult.messageField(TOP_RESULT_PRIMARY), RESULT_TITLE, RESULT_SUBTITLE, RESULT_IMAGE,
TOP_RESULT_TAP, TOP_RESULT_MENU, true);
for (ProtoMessage row : topResult.repeatedMessageField(TOP_RESULT_RELATED))
addBrowseRow(items, row);
}
Expand Down Expand Up @@ -307,10 +308,6 @@ private static void addBrowseRow(List<BrowseItem> items, ProtoMessage renderer)
addRenderer(items, renderer, RESULT_TITLE, RESULT_SUBTITLE, RESULT_IMAGE, RESULT_TAP, RESULT_MENU, false);
}

private static void addTopBrowseResult(List<BrowseItem> items, ProtoMessage renderer) {
addRenderer(items, renderer, RESULT_TITLE, RESULT_SUBTITLE, RESULT_IMAGE, TOP_RESULT_TAP, TOP_RESULT_MENU, true);
}

/** Grid cards, result rows, and top results differ only in the field numbers of their contents. */
private static void addRenderer(List<BrowseItem> items, ProtoMessage renderer, int titleField, int subtitleField,
int imageField, int tapField, int menuField, boolean topResultCard) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -387,11 +387,13 @@ public static boolean handleBrowseRequest(BrowseRequest request) {
String requestedMediaId = request.patch_getRequestedMediaId();
if (requestedMediaId == null) return false;
if (requestedMediaId.equals(SPEED_DIAL_MEDIA_ID)) {
HomeLoad.forSpeedDial(request).start();
new HomeLoad(request, HomeLoad.Mode.SPEED_DIAL, "", Collections.emptyList()).start();
return true;
}
if (requestedMediaId.startsWith(HOME_SHELF_PREFIX)) {
HomeLoad.forShelf(request, requestedMediaId).start();
// An expanded shelf's media ID contains its title. Fetch phone Home again and select that shelf.
String shelfTitle = Uri.decode(requestedMediaId.substring(HOME_SHELF_PREFIX.length()));
new HomeLoad(request, HomeLoad.Mode.SHELF, shelfTitle, Collections.emptyList()).start();
return true;
}
if (requestedMediaId.equals(libraryMediaId)) {
Expand Down Expand Up @@ -793,7 +795,7 @@ public static synchronized boolean loadHome(BrowseRequest request,
if (phoneBrowseClient == null || homeMediaId == null || nativeItems == null
|| nativeItems instanceof PreparedItems
|| !homeMediaId.equals(request.patch_getRequestedMediaId())) return false;
HomeLoad.forHome(request, nativeItems).start();
new HomeLoad(request, HomeLoad.Mode.HOME, "", new ArrayList<>(nativeItems)).start();
return true;
} catch (RuntimeException ex) {
Logger.printException(() -> "loadHome failure", ex);
Expand Down Expand Up @@ -883,20 +885,6 @@ private HomeLoad(BrowseRequest request, Mode mode, String shelfTitle,
this.podcastFolders = podcastFolders;
}

static HomeLoad forHome(BrowseRequest request, List<MediaBrowserCompat.MediaItem> podcastFolders) {
return new HomeLoad(request, Mode.HOME, "", new ArrayList<>(podcastFolders));
}

static HomeLoad forShelf(BrowseRequest request, String mediaId) {
// An expanded shelf's media ID contains its title. Fetch phone Home again and select that shelf.
String shelfTitle = Uri.decode(mediaId.substring(HOME_SHELF_PREFIX.length()));
return new HomeLoad(request, Mode.SHELF, shelfTitle, Collections.emptyList());
}

static HomeLoad forSpeedDial(BrowseRequest request) {
return new HomeLoad(request, Mode.SPEED_DIAL, "", Collections.emptyList());
}

@Override void load() { requestPage(""); }

private void requestPage(String continuation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,6 @@ public class ChangeMiniplayerColorPatch {
@Nullable
private static volatile Integer lastMiniplayerColor;

/**
* Baseline color from YTM's empty-state callback at app start; every later
* call carrying this value is treated as "back to empty".
*/
@Nullable
private static volatile Integer initialCapturedColor;

private static volatile WeakReference<View> navigationBarRef = new WeakReference<>(null);

@Nullable
Expand All @@ -48,22 +41,8 @@ public static boolean changeMiniplayerColor() {
public static void setLastMiniplayerColor(int color) {
if (SystemClock.uptimeMillis() < dismissWindowUntilMs) return;

final Integer initial = initialCapturedColor;
if (initial == null) {
initialCapturedColor = color;
return;
}

if (color == initial) {
if (lastMiniplayerColor == null) return;
lastMiniplayerColor = null;
final Integer defaultColor = defaultNavigationBarColor;
if (defaultColor != null) postNavigationBarColor(defaultColor);
return;
}

lastMiniplayerColor = color;
applyToNavigationBar(color);
if (Settings.CHANGE_NAVIGATION_BAR_COLOR.get()) postNavigationBarColor(color);
}

/**
Expand Down Expand Up @@ -96,11 +75,6 @@ public static void onMiniplayerDismissed() {
if (defaultColor != null) postNavigationBarColor(defaultColor);
}

private static void applyToNavigationBar(int color) {
if (!Settings.CHANGE_NAVIGATION_BAR_COLOR.get()) return;
postNavigationBarColor(color);
}

private static void postNavigationBarColor(int color) {
View view = navigationBarRef.get();
if (view == null) return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ public enum StartPage {
this.id = id;
this.isBrowseId = isBrowseId;
}

private boolean isBrowseId() {
return TRUE.equals(isBrowseId);
}
}

private static final String SETTINGS_CLASS = "com.google.android.apps.youtube.music.settings.SettingsCompatActivity";
Expand Down Expand Up @@ -102,7 +98,7 @@ public static String overrideBrowseId(@Nullable String original) {
}

StartPage startPage = Settings.CHANGE_START_PAGE.get();
return processBrowseId(original, startPage.isBrowseId(), startPage.id, startPage.name());
return processBrowseId(original, TRUE.equals(startPage.isBrowseId), startPage.id, startPage.name());
}

public static void overrideIntentActionOnCreate(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,10 @@ public static boolean onBeforeStopVideo(Object atadInstance, int reason) {
// change. The old song falls silent within about a second, whatever its buffer reports (#2748).
if (isSabrStream()) {
logDebug(() -> "stopVideo(5): skip, SABR stream");
showSabrToastOnce();
if (!sabrToastShown) {
sabrToastShown = true;
Utils.showToastShort(str("morphe_music_crossfade_sabr_toast"));
}
return false;
}

Expand Down Expand Up @@ -755,12 +758,6 @@ private static boolean isSabrStream() {

private static volatile boolean sabrToastShown = false;

private static void showSabrToastOnce() {
if (sabrToastShown) return;
sabrToastShown = true;
Utils.showToastShort(str("morphe_music_crossfade_sabr_toast"));
}

private static ExoPlayerAccess createNewPlayer(PlayerCoordinatorAccess coordinator) {
try {
SessionAccess session = (SessionAccess) coordinator.patch_getSession();
Expand Down
Loading
Loading