From 36d3723fa914eda66a2f6781106338889ffebb63 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 15:53:01 +0000 Subject: [PATCH 01/28] fix: correct variable names --- .github/workflows/build-module.yml | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index ccce6f9..f0cbaee 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -6,7 +6,7 @@ name: Build Custom Boot Animation Module # 3. Run this workflow manually # 4. Download the ready-to-flash module -run-name: "Build: ${{ inputs.source == 'template' && format('{0}/{1}', inputs.device, inputs.system) || 'upload' }} → ${{ inputs.target_location }}" +run-name: "Build: ${{ inputs.source == 'template' && format('{0}/{1}', inputs.device, inputs.theme) || 'upload' }} → ${{ inputs.target_location }}" on: workflow_dispatch: @@ -26,8 +26,8 @@ on: type: choice options: - 'liuqin' - system: - description: 'System type (only used when source is template)' + theme: + description: 'Theme (only used when source is template)' required: false default: 'HyperOS' type: choice @@ -122,17 +122,17 @@ jobs: echo "Source: $SOURCE" if [ "$SOURCE" = "template" ]; then - # Build template path from device and system inputs + # Build template path from device and theme inputs DEVICE="${{ github.event.inputs.device }}" - SYSTEM="${{ github.event.inputs.system }}" + THEME="${{ github.event.inputs.theme }}" # Use defaults if not specified DEVICE="${DEVICE:-liuqin}" - SYSTEM="${SYSTEM:-HyperOS}" + THEME="${THEME:-HyperOS}" - TEMPLATE_DIR="templates/$DEVICE/$SYSTEM" + TEMPLATE_DIR="templates/$DEVICE/$THEME" - echo "Using template: $DEVICE/$SYSTEM" + echo "Using template: $DEVICE/$THEME" if [ ! -d "$TEMPLATE_DIR" ]; then echo "Error: Template directory not found: $TEMPLATE_DIR" @@ -343,7 +343,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: ${{ steps.create_zip.outputs.zip_name }} - path: build/${{ steps.create_zip.outputs.zip_name }} + path: build/module retention-days: 90 compression-level: 0 @@ -357,8 +357,8 @@ jobs: # Build source description if [ "$SOURCE" = "template" ]; then DEVICE="${{ github.event.inputs.device }}" - SYSTEM="${{ github.event.inputs.system }}" - SOURCE_DESC="template: $DEVICE/$SYSTEM" + THEME="${{ github.event.inputs.theme }}" + SOURCE_DESC="template: $DEVICE/$THEME" else SOURCE_DESC="upload" fi @@ -397,16 +397,14 @@ jobs: 1. Scroll down to the **Artifacts** section below 2. Click on the module ZIP file to download - 3. The download will be a ZIP containing the module ## Installation - 1. Extract the downloaded artifact (if needed) - 2. Flash the module ZIP using: + 1. Flash the downloaded module ZIP using: - **Magisk Manager** → Modules → Install from storage - **KernelSU** → Module → Install - **APatch** → Module → Install - 3. Reboot your device + 2. Reboot your device ## Notes From 003ad58b6aba83489b82a85af543ef1e34a0aaf2 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 15:58:35 +0000 Subject: [PATCH 02/28] fix: update boot animation paths in documentation --- .github/workflows/build-module.yml | 1 - RELEASE_NOTES.md | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index f0cbaee..9f0f74a 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -1,6 +1,5 @@ name: Build Custom Boot Animation Module -# This workflow allows users to: # 1. Fork this repo # 2. Choose a device template OR add custom bootanimation.zip files to the 'upload' folder # 3. Run this workflow manually diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 742d641..c8dea3f 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -14,7 +14,7 @@ ### Supported Paths The module now supports these boot animation locations: -- `/product/media` (default, most common) +- `/system/product/media` (default, most common) - `/system/media` (legacy) - `/system_ext/media` -- `/product/media/theme/default` +- `/system/product/media/theme/default` From be31bfa50fa1cb53b64c2e07adc94b2890508b5d Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 16:40:25 +0000 Subject: [PATCH 03/28] fix: resolve module installation failure --- module/customize.sh | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/module/customize.sh b/module/customize.sh index ba5a5df..de90cd0 100644 --- a/module/customize.sh +++ b/module/customize.sh @@ -104,32 +104,39 @@ select_boot_dir() { ui_print "*********************************************" # Available locations - local locations=("/product/media" "/system/media" "/system_ext/media" "/product/media/theme/default") - local descriptions=("Product Media (Default)" "System Media (Legacy)" "System Ext Media" "Theme Default") local current_index=0 - local total=${#locations[@]} + local total=4 # Find if detected location matches any option - for i in "${!locations[@]}"; do - if [ "${locations[$i]}" = "$BOOT_DIR" ]; then - current_index=$i - break - fi - done + case "$BOOT_DIR" in + "/product/media") current_index=0 ;; + "/system/media") current_index=1 ;; + "/system_ext/media") current_index=2 ;; + "/product/media/theme/default") current_index=3 ;; + esac while true; do ui_print "" - ui_print " >> ${descriptions[$current_index]}" - ui_print " Path: ${locations[$current_index]}" + case $current_index in + 0) ui_print " >> Product Media (Default)"; ui_print " Path: /product/media" ;; + 1) ui_print " >> System Media (Legacy)"; ui_print " Path: /system/media" ;; + 2) ui_print " >> System Ext Media"; ui_print " Path: /system_ext/media" ;; + 3) ui_print " >> Theme Default"; ui_print " Path: /product/media/theme/default" ;; + esac key_check - if [[ "$keycheck" == "KEY_VOLUMEUP" ]]; then + if [ "$keycheck" = "KEY_VOLUMEUP" ]; then # Next option current_index=$(( (current_index + 1) % total )) else # Confirm selection - BOOT_DIR="${locations[$current_index]}" + case $current_index in + 0) BOOT_DIR="/product/media" ;; + 1) BOOT_DIR="/system/media" ;; + 2) BOOT_DIR="/system_ext/media" ;; + 3) BOOT_DIR="/product/media/theme/default" ;; + esac ui_print "" ui_print "- Selected: $BOOT_DIR" break From a7e374811a754afeb35a53ce802fb3209af4738e Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:20:02 +0000 Subject: [PATCH 04/28] fix: update default boot animation paths and remove obsolete options --- .github/workflows/build-module.yml | 9 ++++----- module/customize.sh | 15 +++------------ 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index 9f0f74a..6cfb9cf 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -37,13 +37,12 @@ on: target_location: description: 'Where to place bootanimation files in the module' required: true - default: 'system/product/media' + default: '/product/media' type: choice options: - - 'system/product/media' - - 'system/media' - - 'system/system_ext/media' - - 'system/product/media/theme/default' + - '/product/media' + - '/system/media' + - '/system_ext/media' jobs: build-module: diff --git a/module/customize.sh b/module/customize.sh index de90cd0..819caf6 100644 --- a/module/customize.sh +++ b/module/customize.sh @@ -66,10 +66,8 @@ detect_boot_dir() { module_boot_dir="/product/media" elif [ -f "$MODPATH/system/media/bootanimation.zip" ]; then module_boot_dir="/system/media" - elif [ -f "$MODPATH/system/system_ext/media/bootanimation.zip" ]; then + elif [ -f "$MODPATH/system_ext/media/bootanimation.zip" ]; then module_boot_dir="/system_ext/media" - elif [ -f "$MODPATH/system/product/media/theme/default/bootanimation.zip" ]; then - module_boot_dir="/product/media/theme/default" fi if [ -n "$module_boot_dir" ]; then @@ -83,12 +81,8 @@ detect_boot_dir() { BOOT_DIR="/product/media" elif [ -f "/system/media/bootanimation.zip" ]; then BOOT_DIR="/system/media" - elif [ -f "/system/product/media/bootanimation.zip" ]; then - BOOT_DIR="/system/product/media" elif [ -f "/system_ext/media/bootanimation.zip" ]; then BOOT_DIR="/system_ext/media" - elif [ -f "/product/media/theme/default/bootanimation.zip" ]; then - BOOT_DIR="/product/media/theme/default" else BOOT_DIR="/product/media" fi @@ -103,16 +97,15 @@ select_boot_dir() { ui_print " Volume [-]: Confirm selection" ui_print "*********************************************" - # Available locations + # Available locations (3 options) local current_index=0 - local total=4 + local total=3 # Find if detected location matches any option case "$BOOT_DIR" in "/product/media") current_index=0 ;; "/system/media") current_index=1 ;; "/system_ext/media") current_index=2 ;; - "/product/media/theme/default") current_index=3 ;; esac while true; do @@ -121,7 +114,6 @@ select_boot_dir() { 0) ui_print " >> Product Media (Default)"; ui_print " Path: /product/media" ;; 1) ui_print " >> System Media (Legacy)"; ui_print " Path: /system/media" ;; 2) ui_print " >> System Ext Media"; ui_print " Path: /system_ext/media" ;; - 3) ui_print " >> Theme Default"; ui_print " Path: /product/media/theme/default" ;; esac key_check @@ -135,7 +127,6 @@ select_boot_dir() { 0) BOOT_DIR="/product/media" ;; 1) BOOT_DIR="/system/media" ;; 2) BOOT_DIR="/system_ext/media" ;; - 3) BOOT_DIR="/product/media/theme/default" ;; esac ui_print "" ui_print "- Selected: $BOOT_DIR" From 27ba7c25063284fb58e6337e430da37bce5f3bad Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:20:11 +0000 Subject: [PATCH 05/28] fix: update media file paths --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d4800eb..531f89b 100644 --- a/README.md +++ b/README.md @@ -85,10 +85,9 @@ You can use GitHub Actions to build a custom boot animation module without any l | Location | Description | |----------|-------------| -| `system/product/media` | Default location (most devices) | -| `system/media` | Legacy location | -| `system/system_ext/media` | System extension media | -| `system/product/media/theme/default` | Theme default location | +| `/product/media` | Default location (most devices) | +| `/system/media` | Legacy location | +| `/system_ext/media` | System extension media | ### File Naming Convention From dfa9279192b3b2ab2807d4a928f23648435c3403 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:21:24 +0000 Subject: [PATCH 06/28] update --- upload/.gitkeep | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/upload/.gitkeep b/upload/.gitkeep index 6e88d03..e69de29 100644 --- a/upload/.gitkeep +++ b/upload/.gitkeep @@ -1,27 +0,0 @@ -# Upload Folder - -Place your custom `bootanimation.zip` files here to build a module with your own animations. - -## WARNING - -**DO NOT submit pull requests with changes to this folder!** - -The `upload/` folder is for **personal use in your own fork only**. Any PR that modifies this folder will be automatically closed. - -## How to Use - -1. **Fork** this repository to your own account -2. Add your bootanimation files to this folder in your fork -3. Commit and push your changes to your fork -4. Go to **Actions** → **Build Custom Boot Animation Module** in your fork -5. Select `upload` as the source -6. Choose the target location -7. Run the workflow -8. Download the built module from Artifacts - -## File Naming - -- `bootanimation.zip` - Main boot animation -- `bootanimation01.zip` - Alternative 1 (e.g., different rotation) -- `bootanimation02.zip` - Alternative 2 -- ... and so on From 859b3356b9c179c2888981a1b43b78ce6f6069d3 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:29:54 +0000 Subject: [PATCH 07/28] fix: update version to v1.1.1 --- RELEASE_NOTES.md | 24 ++++++------------------ module/module.prop | 4 ++-- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index c8dea3f..b6f5b27 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,20 +1,8 @@ -### New Features +## Stable release -- **Dynamic boot animation path detection**: The module now automatically detects the bootanimation path from the module structure during installation -- **Interactive location selector**: Added user prompt to select or confirm the boot animation backup location during installation - - Auto-detects from multiple common paths - - Users can cycle through options using volume keys - - Shows warning when changing from pre-configured path +### Bug Fixes -### Improvements - -- **Smarter path detection**: Installation script checks the module's own structure first, falling back to device detection if not found -- **Better user feedback**: Clearer prompts showing whether the path was detected from the module or from the device - -### Supported Paths - -The module now supports these boot animation locations: -- `/system/product/media` (default, most common) -- `/system/media` (legacy) -- `/system_ext/media` -- `/system/product/media/theme/default` +- **Major Fix: Resolved module installation failure** + - Fixed critical issue that caused the module to fail during installation + - Improved installation script stability and error handling + - Enhanced compatibility with various Magisk/KernelSU/APatch versions diff --git a/module/module.prop b/module/module.prop index 1c240ac..4faaae3 100644 --- a/module/module.prop +++ b/module/module.prop @@ -1,7 +1,7 @@ id=mipad-custom-boot name=mipad-custom-boot -version=v1.1.10 -versionCode=110 +version=v1.1.1 +versionCode=111 author=Veutexus description=A module that can custom boot animation for tablet devices. (GitHub: https://github.com/G0246/mipad-custom-boot) updateJson=https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/update.json From de07e1992266dcca40df978ff3174cbb9cf4741b Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:31:24 +0000 Subject: [PATCH 08/28] fix: update comments --- .github/workflows/package-release.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/package-release.yml b/.github/workflows/package-release.yml index e2d0a07..4a6dc47 100644 --- a/.github/workflows/package-release.yml +++ b/.github/workflows/package-release.yml @@ -1,12 +1,11 @@ name: "NodeJs with Release" # This workflow is for maintainers/developers only -# It packages the module, creates a GitHub release, and updates update.json # # Before running: # 1. Update module/module.prop with the new version -# 2. Edit RELEASE_NOTES.md with your changelog -# 3. Run this workflow +# 2. Edit RELEASE_NOTES.md +# 3. Run run-name: "Release: v${{ inputs.version }} (${{ inputs.release_type }})" From fcba734308887ec322c49035035f73088431b5e3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 29 Nov 2025 17:32:58 +0000 Subject: [PATCH 09/28] chore: update JSON for release v1.1.1 --- update.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update.json b/update.json index 0acd12b..915ba1d 100644 --- a/update.json +++ b/update.json @@ -1,6 +1,6 @@ { - "version": "v1.1.0", - "versionCode": 110, - "zipUrl": "https://github.com/G0246/mipad-custom-boot/releases/latest/download/mipad-custom-boot-1.1.0.zip", + "version": "v1.1.1", + "versionCode": 111, + "zipUrl": "https://github.com/G0246/mipad-custom-boot/releases/latest/download/mipad-custom-boot-1.1.1.zip", "changelog": "https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/README.md" } From 7e2b6637bed8a98cf9aad5b4ae2ef037cf1398d8 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 01:34:31 +0800 Subject: [PATCH 10/28] update --- update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.json b/update.json index 915ba1d..fff4f8a 100644 --- a/update.json +++ b/update.json @@ -2,5 +2,5 @@ "version": "v1.1.1", "versionCode": 111, "zipUrl": "https://github.com/G0246/mipad-custom-boot/releases/latest/download/mipad-custom-boot-1.1.1.zip", - "changelog": "https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/README.md" + "changelog": "https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/RELEASE_NOTES.md" } From 560435cdc7b8d5ea92a0a29f26620c65b0c0b518 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:42:53 +0000 Subject: [PATCH 11/28] fix: correct desc.txt format in README files --- README.md | 9 ++++----- README_zh-CN.md | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 531f89b..abc0979 100644 --- a/README.md +++ b/README.md @@ -116,19 +116,18 @@ bootanimation.zip #### desc.txt Format ``` - + ... ``` Example: ``` -1080 1920 60 -c 1 0 part0 -c 0 0 part1 +1880 2880 60 +p 0 5 part0 ``` -- `c` = Play complete (or `p` = play and repeat) +- `c` = play complete, `p` = play and repeat - First number = loop count (0 = infinite) - Second number = pause after loop (in frames) - Path = folder containing the frames diff --git a/README_zh-CN.md b/README_zh-CN.md index 823f697..2e764b1 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -117,16 +117,15 @@ bootanimation.zip #### desc.txt 格式 ``` -<宽度> <高度> <帧率> +<高度> <宽度> <帧率> <类型> <循环次数> <暂停帧数> <路径> ... ``` 示例: ``` -1080 1920 60 -c 1 0 part0 -c 0 0 part1 +1880 2880 60 +p 0 5 part0 ``` - `c` = 完整播放(或 `p` = 播放并重复) From c4dd9ef242254edaffcdece64567525619f68907 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 17:54:15 +0000 Subject: [PATCH 12/28] update --- .github/workflows/build-module.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index 6cfb9cf..681b7c5 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -5,7 +5,7 @@ name: Build Custom Boot Animation Module # 3. Run this workflow manually # 4. Download the ready-to-flash module -run-name: "Build: ${{ inputs.source == 'template' && format('{0}/{1}', inputs.device, inputs.theme) || 'upload' }} → ${{ inputs.target_location }}" +run-name: "Build: ${{ inputs.source == 'template' && format('{0}/{1}', inputs.device, inputs.theme) || 'upload' }} > ${{ inputs.target_location }}" on: workflow_dispatch: From d175f63a2a591cd2a6c6cb481817dd48d8659db6 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 18:09:38 +0000 Subject: [PATCH 13/28] fix: update target location handling in build-module workflow --- .github/workflows/build-module.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index 681b7c5..c8e99fa 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -235,16 +235,21 @@ jobs: # Determine target location (use input or default) TARGET_LOCATION="${{ github.event.inputs.target_location }}" if [ -z "$TARGET_LOCATION" ]; then - TARGET_LOCATION="system/product/media" + TARGET_LOCATION="/product/media" fi + MODULE_TARGET="system$TARGET_LOCATION" + + echo "Target location: $TARGET_LOCATION" + echo "Module path: $MODULE_TARGET" + # Remove all existing media directories to avoid conflicts # Only keep the one we're targeting echo "Cleaning up existing media directories..." MEDIA_DIRS=( "build/module/system/product/media" - "build/module/system/media" + "build/module/system/system/media" "build/module/system/system_ext/media" "build/module/system/product/media/theme/default" ) @@ -252,7 +257,7 @@ jobs: for dir in "${MEDIA_DIRS[@]}"; do if [ -d "$dir" ]; then # Check if this is the target or a parent of the target - TARGET_DIR_FULL="build/module/$TARGET_LOCATION" + TARGET_DIR_FULL="build/module/$MODULE_TARGET" if [[ "$TARGET_DIR_FULL" != "$dir"* ]]; then echo " Removing: $dir" rm -rf "$dir" @@ -260,8 +265,8 @@ jobs: fi done - # Create target directory - TARGET_DIR="build/module/$TARGET_LOCATION" + # Create target directory with system/ prefix for Magisk + TARGET_DIR="build/module/$MODULE_TARGET" mkdir -p "$TARGET_DIR" # Clean any existing bootanimation files from the downloaded module From dac6d24d79f5162bf952b5a89cdb4d33cf66f666 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sat, 29 Nov 2025 18:20:15 +0000 Subject: [PATCH 14/28] fix: improve artifact naming in build-module workflow --- .github/workflows/build-module.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-module.yml b/.github/workflows/build-module.yml index c8e99fa..ec9e1e2 100644 --- a/.github/workflows/build-module.yml +++ b/.github/workflows/build-module.yml @@ -323,9 +323,13 @@ jobs: MODULE_VERSION="${{ steps.module_info.outputs.module_version }}" # Create a unique zip name with target location indicator - TARGET_SHORT=$(echo "${{ env.target_location }}" | sed 's/system\///g' | tr '/' '-') + # Remove leading slash and convert remaining slashes to dashes + TARGET_SHORT=$(echo "${{ env.target_location }}" | sed 's|^/||' | tr '/' '-') ZIP_NAME="${MODULE_ID}-${MODULE_VERSION}-${TARGET_SHORT}.zip" + # Artifact name without .zip (GitHub adds it automatically on download) + ARTIFACT_NAME="${MODULE_ID}-${MODULE_VERSION}-${TARGET_SHORT}" + # Create ZIP with stored (no compression) mode for bootanimation compatibility echo "Creating ZIP with stored (no compression) mode..." zip -r -0 "../$ZIP_NAME" . -x "*.git*" @@ -334,6 +338,7 @@ jobs: ZIP_SIZE=$(du -h "../$ZIP_NAME" | cut -f1) echo "zip_name=$ZIP_NAME" >> $GITHUB_OUTPUT + echo "artifact_name=$ARTIFACT_NAME" >> $GITHUB_OUTPUT echo "zip_size=$ZIP_SIZE" >> $GITHUB_OUTPUT echo "" @@ -345,7 +350,7 @@ jobs: - name: Upload module artifact uses: actions/upload-artifact@v4 with: - name: ${{ steps.create_zip.outputs.zip_name }} + name: ${{ steps.create_zip.outputs.artifact_name }} path: build/module retention-days: 90 compression-level: 0 From 0c01ecd7832f3b7310626d414ad03bfda7104627 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 02:30:32 +0800 Subject: [PATCH 15/28] fix: update files --- templates/liuqin/MIUI/bootanimation.zip | Bin 36201 -> 73074 bytes templates/liuqin/MIUI/bootanimation01.zip | Bin 171844 -> 171476 bytes templates/liuqin/MIUI/bootanimation02.zip | Bin 177793 -> 177425 bytes templates/liuqin/MIUI/bootanimation03.zip | Bin 171382 -> 171014 bytes templates/liuqin/MIUI/bootanimation04.zip | Bin 176816 -> 176448 bytes .../liuqin/MIUI_inverted/bootanimation.zip | Bin 36710 -> 36374 bytes .../liuqin/MIUI_inverted/bootanimation01.zip | Bin 178637 -> 178269 bytes .../liuqin/MIUI_inverted/bootanimation02.zip | Bin 178634 -> 178266 bytes .../liuqin/MIUI_inverted/bootanimation03.zip | Bin 178481 -> 178113 bytes .../liuqin/MIUI_inverted/bootanimation04.zip | Bin 178557 -> 178189 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/liuqin/MIUI/bootanimation.zip b/templates/liuqin/MIUI/bootanimation.zip index fd33be8e0dd8d14bec6ed93425e7fc31e15ea341..e0f76915a31ffd2cd37378970d29ec87da7a208e 100644 GIT binary patch literal 73074 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 Kw5Q^vL;VZ>gsm$8 literal 36201 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 X-Zz)Yf{%lNgCUBUf#J$*CZHz)bnT`1 diff --git a/templates/liuqin/MIUI/bootanimation02.zip b/templates/liuqin/MIUI/bootanimation02.zip index e05786664361710f41bb4d77c64b14e86789d692..6bf70eb4b33d28267f25f7e928358506699fcb15 100644 GIT binary patch delta 349 zcmZpC%Qf*8*F-%j77hjmhKVtDENmcpodORJkS<6pDlyPEFx#@0Mi&soy?RlyO5Bgc-Yl@n9#iYEzKv*E!o&r!#$$*5CpvXJBv?t&J8qAss9O zWP>mVg9=C(2o%611H<%*x=#lNgsPgmT+ zWFoitqsyJnE(Qh=Mpf?x6q){U3zLr!s`y_KMuzF}TQS5p&IgL0#S|~oWMY_Zy^YC& SkDY;?p@WHmp?DLJU;qF#H%HF^ delta 628 zcmbREimUN0mtKH3Gm8iV2snz?MuQnpLI6l7<>!|q=4Iw4mSpDV85rqLkP?x=B0N#f zPDBiwc!GkA3>NW%#G(=deFMYI1zm4)Hdo}nkrBbBY;#7}`Yx<8+oeSrH{g&uKcDen zCq8RUf!4mx+1@^l>67&I%bS?Q6a^SmfUX1qkf%Wa&EwNHGnwiMoRAI%ITM5>;5rn5 zJUt*r)1g0o;U*>zB{8@UE-dcYxS7cZOqx1*F-%j77hjmhKVtDENmcpodOFFkly&{bqkoW`C+R@E10!imYb0a%Cw%q z_yHon-CmUGY|He#SxjP591JQztstNPCK(t~Qj3%IN-9dGC(L2entlVQNQe!tNC2qF z35cf)%w}>E;(?2UG^c^YD`qqKNTG^{wlXjjBo>tz=o=VKZ!|q=4Iw4mSpDV85rwNkP?x=B0N#f zPDBiwc!Gk63>NW?Ew5W-ut^jo7L^$28yHROiQ0U%^;ip5-P`ALF>p7Iz^v_BB8)I*>O96f5c%z)>P#QoHMoFE85kTzYoi5DNC(RR*&xippaK#G0tGP1 zz%c#6dL|DcHn_L|P}~WKr+aN+a+BkMi-Xjs0Wr)~dIfpu(*rgznaBy$Twr7DVqgGa zRQ1W7Kywr}GWiIhiuVaKGEDEo6yG@)DE0|qJru9r>N&*ZjKzD%v$eSR5?$zlx)-h>Kk6O>fr6+JgIvC_Y5SD;zQ~>hy zfEYvLg>_6GN@8$zAPX9>snc4|Njj@Y? z0fbTYAMC{9o(Johe3Vet{Sjuwbhq6G40Y!7u&A4ZsZL#;3Ddk^8<;HkI2bq>qL>*N K9M&@d{RRLhY@)*e diff --git a/templates/liuqin/MIUI_inverted/bootanimation.zip b/templates/liuqin/MIUI_inverted/bootanimation.zip index 41c4cfb6149485564cc22923a28e4a5c42dd613e..75e14f4dea58697550725caf39530af856bde831 100644 GIT binary patch delta 303 zcmaDhk7?Q*rinUIEF26B3=<>lSlB@H3I!G(AieR{0ckK}^BS42(mWucg2bW{1APPI z%?CnEST?`6*)9%Iup{I&iUL!Jf{P{A;u8(Tq&OHy=cLOg_-3 zHTg=9m=GIWi2zWE6A(}4>U9(1feV9lrh$YDdVSD@wPb+8cQAyNEr7xveLhmChDe3L n{b4dWpwDFThdu!`17GF?bt?2*@Ub(nGjuR9FjRB{ZDs%fNkKY& delta 635 zcmbO>hw0foCY=CpW)=|!5O5H!jRrHI1Rs!2%Fi!J%*)J8EXmBz)1M$EB!(e4QO-^X zWB{tti3ti)QW&BIiA5y_`UZxZ17u8CHXmSV5f{Q#wAn-Et28!oM~lx`#VtZkOXIf8 z6k?fkiM6;HE|01JT?zsM5DLvNlNEYRCUHsmSr&Cgkll4j}N`M-) zCg125QxJh`0GV8apept0%-2fEI`*V`9iM+9|r>mgBLRc K16vQ!e+&RZdZGXT diff --git a/templates/liuqin/MIUI_inverted/bootanimation01.zip b/templates/liuqin/MIUI_inverted/bootanimation01.zip index addd2e5bb0a92bb8fdceb2f723ecc4bad441d7dc..b264e01c81ea1e924a2107ad211250f81b29519a 100644 GIT binary patch delta 265 zcmX^6nd|Ncu8De5EF26B3=?DQSlB@HIt3OUAieR?sxB~N^MdYm5Z3l2F~%iOrqn{l zO;F|oZKmd~=|{IQi3xEqr~tKsfC89gV3_`Q83xL IZv_$z00qG=X#fBK delta 593 zcmccnf$QvNE|vgqW|ryl+nB^e1Q-|?lJfIQ67w>16H7Al^9&62CrF7%U=f}uXD1?t zO*}zCL^3H#9{`DTpA$uy zc?hw=#RY)kPCz_8Wjm9b5D#1&q&^KKer7w951RP9E}*#84h(S%F-C^zD=@`d7Xrn_ fc4Daism;VNy=5np1s^*DJ3|K(1H+!JK!O1PA>K8C delta 655 zcmcchf$P*~F1-M6W)=|!5O5T&jRrHIgaD9E%Fi!J%*)J8EXmBzGceMhASEJ!MR=l| zoroAV@dO1K87$%jiA5y_`UZyE<#m|s88@G1wCxnZrfxG&w_7(p6O17yY@aL6$kc^T zp$SN#1LOABix@Sq+qGR>hiP@EJFc)$0eS-jK%oKx=pn1Vbw@hC|!!1RJt=m9ah-s!KlGI=P8!PSB6Xuzh>0PO)nStA)ZhYYWMFUmV zg9=C(2o%611H<&hZA>0QY;bV_ptutdPd~kl$xVm{E)G(k1`;>k&g6q8{;mrsz7SJ< svM3|Nbp9O}>SY!H#cMIeS7|XZOn<$D$%2oaft{g)iGe|RE0ACS0L5K4+5i9m delta 607 zcmX^3o@?VLF1-M6W)=|!5O5T&jRrHIgaD9E%Fi!J%*)J8EXmBzGceYlASEJ!MR=l| zoroAV@dO1K87$%jiA5y_`UZyEFK98@Gj2Z3Xxk}*P2Fam?uA`gWwvh=Wo*SEWwn5@ z3y0JREvCe->CIc2#FPXWRDdo60gy*Q0Nu0GBeybXO~1XBiAzu5gmf^-fgmga*QfyG z=>ai@#=xyi9!g?xbs!5Gu&G2Chy4sAdZ`bwE&Ac+3gtiT4*z2npeG@$%2oAfrBB6nStTpRwkey0RJ+X)&Kwi diff --git a/templates/liuqin/MIUI_inverted/bootanimation04.zip b/templates/liuqin/MIUI_inverted/bootanimation04.zip index 9e9d9c71169826b88d12c238c7e445f3e9548a84..54b9e64d3423781dd1889473106aae506e20fbce 100644 GIT binary patch delta 322 zcmezSiL3Vm*F-%j77hjmhKVtDENmcpodORJkS<6pDlyPEFx)P~}xb|xP*@mpO$@wb@bvSN%3)1!A_ ssE=I;6h8?RmqIoFq&5>Q1Wc!2+`*(J!U_r;26iCqU}9j%-wGrc07+>)R{#J2 delta 602 zcmeDE!1ebN7fXOQGt2bzTbaZ}1Q-|?lJfIQ67w>16H7Al^9)S%CrF7%U=f}uXD1?t zO*}zCMh1&`L1Iyffxdy^rfz%2&8HbPJ4LXm+We!-z8kB|c55+48yr&A3mG%I@Y!k# zvUR(jE|Yr)*rSR93@Si3f&j?NAb{rW>3_B|nNF|Y%EY520avR4RHuijR)6~3txO(D zVsLdJGaIm}`@WUQO-Tl>P64Q93pREB+n9XN)LC?6xKV%lT1<7_VvOj1(Vxz}9mBla u3$dun1gg_Qbzis+6NY)vxHO$!xSdH$gq02G1qKcvjACYB;N8Xq Date: Sun, 30 Nov 2025 03:37:23 +0800 Subject: [PATCH 16/28] update --- README_zh-CN.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README_zh-CN.md b/README_zh-CN.md index 2e764b1..1f1396c 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -2,7 +2,13 @@ [English](/README.md) | 简体中文 ## 介绍 -专为平板设备打造的修改开机动画模块。平板与其他设备略有不同,其动画会根据设备的方向而更改。 +专为平板设备打造的修改开机动画模块。平板与其他设备略有不同,会根据设备的方向而改变。 + +## 要求 +- Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ +- Android 11+ (API 30+) +> [!WARNING] +> 此模块专为 Magisk 设计。不会为 KernelSU 和 APatch 提供支持,有可能会出现错误。 ## 已测试设备 @@ -30,12 +36,6 @@ > [!NOTE] > 此模块应该可以在其他平板型号、品牌和系统上运行,但仍需进一步测试。欢迎反馈您的测试结果! -## 要求 -- Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ -- Android 11+ (API 30+) -> [!WARNING] -> 此模块专为 Magisk 设计。不会为 KernelSU 和 APatch 提供支持,有可能会出现错误。 - ## 安装 > [!CAUTION] From 598af3cf99d3411ff91d8a7ccdb7f5cf22552e75 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 03:43:06 +0800 Subject: [PATCH 17/28] update --- README_zh-CN.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README_zh-CN.md b/README_zh-CN.md index 1f1396c..9422e80 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -63,7 +63,7 @@ 3. 点击 **"Run workflow"** 4. 将 **Source** 设置为 `template` 5. 选择您的**设备型号**(例如 `liuqin`) -6. 选择**系统类型**(例如 `HyperOS`) +6. 选择**模板**(例如 `HyperOS`) 7. 选择**目标位置** 8. 从 **Artifacts** 下载构建好的模块 @@ -85,10 +85,9 @@ | 位置 | 描述 | |------|------| -| `system/product/media` | 默认位置(大多数设备) | -| `system/media` | 传统位置 | -| `system/system_ext/media` | 系统扩展媒体 | -| `system/product/media/theme/default` | 主题默认位置 | +| `/product/media` | 默认位置(大多数设备) | +| `/system/media` | 传统位置 | +| `/system_ext/media` | 系统扩展媒体 | ### 文件命名规范 From a603fd88098c61e1202e4b39400676e4f6142d92 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 03:44:25 +0800 Subject: [PATCH 18/28] update instructions for selecting system type to template --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index abc0979..992eb3e 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ You can use GitHub Actions to build a custom boot animation module without any l 3. Click **"Run workflow"** 4. Set **Source** to `template` 5. Select your **Device model** (e.g., `liuqin`) -6. Select the **System type** (e.g., `HyperOS`) +6. Select the **Template** (e.g., `HyperOS`) 7. Select the **Target location** 8. Download the built module from **Artifacts** From b9932e8b4bbdebf9affffe23f06118c08280ce3c Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:51:56 +0000 Subject: [PATCH 19/28] fix: update README for clarity and consistency --- README.md | 176 ++++++++++++++++++++++++++++++++++++++++++--- README_zh-CN.md | 188 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 337 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 992eb3e..6699772 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# MiPad Custom Boot Animation +# Xiaomi Custom Boot Animation English | [简体中文](/README_zh-CN.md) ## Introduction -A simple module designed exclusively for tablet devices, replacing the boot animations with custom ones. Unlike phones, tablets often adapt their animations based on device orientation. +A simple module designed to replace the boot animations with custom ones. This module is also compatible with tablets since, in contrast to phones, tablets frequently modify their animations according to the orientation of the device. ## Requirements - Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ -- Android 11+ (API 30+) +- Android 11+ (API 30+) running MIUI/HyperOS > [!WARNING] > This module is designed for Magisk. KernelSU and APatch are not fully supported and unexpected bugs may occur. @@ -23,18 +23,170 @@ A simple module designed exclusively for tablet devices, replacing the boot anim | Code | Device Name | |------|-------------| +| myron | Redmi K90 Pro Max / POCO F8 Ultra | +| annibale | Redmi K90 / POCO F8 Pro | +| popsicle | Xiaomi 17 Pro Max | +| pandora | Xiaomi 17 Pro | +| pudding | Xiaomi 17 | +| piano | Xiaomi Pad 8 Pro | +| yupei | Xiaomi Pad 8 | +| klimt | Xiaomi 15T Pro | +| goya | Xiaomi 15T | +| organ | Redmi Pad 2 Pro 5G | +| flute | Redmi Pad 2 Pro / POCO Pad M1 | +| dew | Redmi 15C / POCO C85 | +| tornado | Redmi 15C 5G / Redmi 15R 5G | +| kunzite | Redmi Note 15 5G | +| lapis | Redmi Note 15 Pro | +| flourite | Redmi Note 15 Pro+ | +| creek | Redmi 15 4G | +| spring | Redmi Note 15R / Redmi 15 5G / POCO M7 Plus 5G | +| dali | Redmi K80 Ultra | +| bixi | Xiaomi MIX Flip 2 | +| turner | Redmi K Pad / Xiaomi Pad Mini | +| violin | Xiaomi Pad 7S Pro 12.5 | +| taiko | Redmi Pad 2 | +| koto | Redmi Pad 2 4G | +| dijun | Xiaomi 15S Pro | +| jinghu | Xiaomi Pad 7 Ultra | +| luming | Xiaomi Civi 5 Pro | +| onyx | Redmi Turbo 4 Pro / POCO F7 | +| serenity | POCO C71 / Redmi A5 | +| emerald | Redmi Note 14S | +| xuanyuan | Xiaomi 15 Ultra | +| obsidian | Redmi Note 14 Pro 4G | +| tanzanite | Redmi Note 14 4G | +| rodin | Redmi Turbo 4 / POCO X7 Pro | +| miro | Redmi K80 Pro / POCO F7 Ultra | +| zorn | Redmi K80 / POCO F7 Pro | +| warm | POCO C75 5G / Redmi A4 5G | +| haotian | Xiaomi 15 Pro | +| dada | Xiaomi 15 | +| muyu | Xiaomi Pad 7 Pro | +| uke | Xiaomi Pad 7 / POCO Pad X1 | +| degas | Xiaomi 14T | +| amethyst | Redmi Note 14 Pro+ | +| malachite | Redmi Note 14 Pro / POCO X7 | +| beryl | Redmi Note 14 5G / POCO M7 Pro 5G | +| flame | Redmi 14R 5G / POCO M7 5G | +| lake | Redmi 14C / Redmi A3 Pro / POCO C75 | +| flare | Redmi Pad SE 8.7 WiFi | +| spark | Redmi Pad SE 8.7 4G | +| breeze | Redmi 13 5G / Redmi Note 13R / POCO M6 Plus 5G | +| ruyi | Xiaomi MIX Flip | +| goku | Xiaomi MIX Fold 4 | +| rothko | Redmi K70 Ultra / Xiaomi 14T Pro | +| klein | Redmi A3x | +| peridot | Redmi Turbo 3 / POCO F6 | +| ruan | Redmi Pad Pro 5G / POCO Pad 5G | +| dizi | Redmi Pad Pro | +| chenfeng | Xiaomi Civi 4 Pro / Xiaomi 14 Civi | +| blue | Redmi A3 / POCO C61 | +| aurora | Xiaomi 14 Ultra | +| shennong_t | Xiaomi 14 Pro Titanium | +| sheng | Xiaomi Pad 6S Pro 12.4 | +| sapphiren | Redmi Note 13 4G NFC | +| sapphire | Redmi Note 13 4G | +| moon | Redmi 13 / POCO M6 | +| air | Redmi 13R 5G / Redmi 13C 5G | +| duchamp | Redmi K70E / POCO X6 Pro 5G | +| manet | Redmi K70 Pro | +| vermeer | Redmi K70 / POCO F6 Pro | +| gale | Redmi 13C / POCO C65 | +| shennong | Xiaomi 14 Pro | +| houji | Xiaomi 14 | +| aristotle | Xiaomi 13T | +| garnet | Redmi Note 13 Pro 5G / POCO X6 | +| gold | Redmi Note 13 5G / Redmi 13R Pro | +| zircon | Redmi Note 13 Pro+ 5G | +| xun | Redmi Pad SE | +| babylon | Xiaomi MIX Fold 3 | +| corot | Redmi K60 Ultra / Xiaomi 13T Pro | +| yudi | Xiaomi Pad 6 Max | +| sky | Redmi Note 12R / POCO M6 Pro 5G / Redmi 12 5G | +| fire | Redmi 12 | +| pearl | Redmi Note 12T Pro | +| yuechu | Xiaomi Civi 3 | +| sea | Redmi Note 12S | +| ishtar | Xiaomi 13 Ultra | | liuqin | Xiaomi Pad 6 Pro | | pipa | Xiaomi Pad 6 | -| yudi | Xiaomi Pad 6 Max | -| nabu | Xiaomi Pad 5 | -| elish | Xiaomi Pad 5 Pro | -| enuma | Xiaomi Pad 5 Pro 5G | +| sweet_k6a | Redmi Note 12 Pro 4G | +| topaz | Redmi Note 12 4G NFC | +| tapas | Redmi Note 12 4G | +| marble | Redmi Note 12 Turbo / POCO F5 5G | +| water | POCO C51 / Redmi A2 / A2+ | +| earth | Redmi 12C / POCO C55 | +| redwood | Redmi Note 12 Pro Speed / POCO X5 Pro 5G | +| rembrandt | Redmi K60E | +| socrates | Redmi K60 Pro | +| mondrian | Redmi K60 / POCO F5 Pro | +| nuwa | Xiaomi 13 Pro | +| fuxi | Xiaomi 13 | +| moonstone | POCO X5 5G | +| sunstone | Redmi Note 12 5G / Redmi Note 12R Pro | +| ruby | Redmi Note 12 Pro+ | +| plato | Xiaomi 12T | +| yunluo | Redmi Pad | +| ziyi | Xiaomi Civi 2 / Xiaomi 13 Lite | +| ice | POCO C50 / Redmi A1 | +| rosemary_p | POCO M5S | +| rock | POCO M5 / Redmi 11 Prime 4G | | dagu | Xiaomi Pad 5 Pro 12.4 | +| diting | Redmi K50 Ultra / Xiaomi 12T Pro | +| zizhan | Xiaomi MIX Fold 2 | +| mayfly | Xiaomi 12S | +| thor | Xiaomi 12S Ultra | +| unicorn | Xiaomi 12S Pro | +| daumier | Xiaomi 12 Pro Dimensity | +| taoyao | Xiaomi 12 Lite | +| frost | POCO C40 | +| xaga | Redmi Note 11T Pro / Pro+ / POCO X4 GT / Pro / Redmi K50i / Pro | +| zijin | Xiaomi Civi 1S | +| lilac | Redmi Note 10T | +| dandelion | Redmi 10A | +| fog | Redmi 10C | +| rubens | Redmi K50 | +| matisse | Redmi K50 Pro | +| munch | Redmi K40S / POCO F4 | +| viva | Redmi Note 11 Pro | +| lightcm | Redmi Note 11R | +| light | Redmi Note 11E / POCO M4 5G / Redmi 10 Prime+ 5G | +| ingres | Redmi K50 Gaming / POCO F4 GT | +| spesn | Redmi Note 11 NFC | +| spes | Redmi Note 11 | +| veux | Redmi Note 11E Pro / Redmi Note 11 Pro 5G | +| opal | Redmi Note 11S 5G | +| fleur | Redmi Note 11S / POCO M4 Pro 4G | +| zeus | Xiaomi 12 Pro | +| psyche | Xiaomi 12X | +| cupid | Xiaomi 12 | +| evergreen | POCO M4 Pro 5G | +| pissarro | Redmi Note 11 Pro / Pro+ | +| evergo | Redmi Note 11 5G | +| selenes | Redmi Note 11 4G | +| mona | Xiaomi Civi | +| lisa | Xiaomi 11 Lite 5G NE | +| agate | Xiaomi 11T | +| vili | Xiaomi 11T Pro | +| selene | Redmi 10 | +| odin | Xiaomi MIX 4 | +| elish | Xiaomi Pad 5 Pro (WiFi) | +| enuma | Xiaomi Pad 5 Pro (5G) | +| nabu | Xiaomi Pad 5 | +| chopin | Redmi Note 10 Pro (China) / POCO X3 GT | +| camellia | Redmi Note 10 (China) / POCO M3 Pro / Redmi Note 11 SE | +| biloba | Redmi Note 8 (2021) | +| ares | Redmi K40 Gaming / POCO F3 GT | +| cetus | Xiaomi MIX Fold | +| renoir | Xiaomi 11 Lite | +| star | Xiaomi 11 Pro / Ultra | +| courbet | Xiaomi 11 Lite 4G | > [!NOTE] -> This module should work on other tablet models, brands, and systems, but further testing is needed. Feel free to report your results! +> This module should work on other models, brands, and systems, but further testing is needed. Feel free to report your results! ## Installation @@ -67,6 +219,9 @@ You can use GitHub Actions to build a custom boot animation module without any l 7. Select the **Target location** 8. Download the built module from **Artifacts** +> [!NOTE] +> If there is no available template for your device, you must use Method 2 and upload your own bootanimation files. + ### Method 2: Upload Custom Files 1. **Fork** this repository @@ -78,6 +233,9 @@ You can use GitHub Actions to build a custom boot animation module without any l 7. Select the **Target location** 8. Download the built module from **Artifacts** +> [!TIP] +> If your device is a phone, you only need one `bootanimation.zip` file. Multiple animation files are only needed for tablets that change animations based on device orientation. + > [!WARNING] > The `upload/` folder is for personal use in your fork only. Do not submit pull requests with changes to this folder - they will be automatically closed. @@ -136,7 +294,7 @@ p 0 5 part0 > Bootanimation ZIP files **must** use STORE compression (no compression). The workflow handles this automatically. ## Disclaimer -**Flashing this module may cause your device to bootloop, a bootloop saver module is highly recommended. I am not responsible for any damages caused to your device or data by using this module. Use at your own risk.** +**A bootloop saver module is strongly advised even if there is little possibility that flashing this module would cause your device to bootloop. I am not responsible for any damages caused to your device or data by using this module. Use at your own risk.** ## License This program is free software: you can redistribute it and/or modify diff --git a/README_zh-CN.md b/README_zh-CN.md index 9422e80..372ba1e 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -1,14 +1,8 @@ -# 小米平板自定义开机动画 +# 小米自定义开机动画 [English](/README.md) | 简体中文 ## 介绍 -专为平板设备打造的修改开机动画模块。平板与其他设备略有不同,会根据设备的方向而改变。 - -## 要求 -- Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ -- Android 11+ (API 30+) -> [!WARNING] -> 此模块专为 Magisk 设计。不会为 KernelSU 和 APatch 提供支持,有可能会出现错误。 +一个简单的模块,用于将开机动画替换为自定义动画。此模块也兼容平板设备,因为与手机不同,平板设备通常会根据设备方向调整其动画。 ## 已测试设备 @@ -23,18 +17,170 @@ | 代码 | 设备名称 | |------|----------| -| liuqin | 小米平板 6 Pro | -| pipa | 小米平板 6 | -| yudi | 小米平板 6 Max | -| nabu | 小米平板 5 | -| elish | 小米平板 5 Pro | -| enuma | 小米平板 5 Pro 5G | -| dagu | 小米平板 5 Pro 12.4 | +| myron | 红米K90 Pro Max / POCO F8 Ultra | +| annibale | 红米K90 / POCO F8 Pro | +| popsicle | 小米17 Pro Max | +| pandora | 小米17 Pro | +| pudding | 小米17 | +| piano | 小米平板8 Pro | +| yupei | 小米平板8 | +| klimt | 小米15T Pro | +| goya | 小米15T | +| organ | 红米平板2 Pro 5G | +| flute | 红米平板2 Pro / POCO Pad M1 | +| dew | 红米15C / POCO C85 | +| tornado | 红米15C 5G / 红米15R 5G | +| kunzite | 红米Note15 5G | +| lapis | 红米Note15 Pro | +| flourite | 红米Note15 Pro+ | +| creek | 红米15 4G | +| spring | 红米Note15R / 红米15 5G / POCO M7 Plus 5G | +| dali | 红米K80 至尊版 | +| bixi | 小米MIX Flip 2 | +| turner | 红米K平板 / 小米平板Mini | +| violin | 小米平板7S Pro 12.5 | +| taiko | 红米平板2 | +| koto | 红米平板2 4G | +| dijun | 小米15S Pro | +| jinghu | 小米平板7 Ultra | +| luming | 小米Civi5 Pro | +| onyx | 红米Turbo 4 Pro / POCO F7 | +| serenity | POCO C71 / 红米A5 | +| emerald | 红米Note 14S | +| xuanyuan | 小米15 Ultra | +| obsidian | 红米Note 14 Pro 4G | +| tanzanite | 红米Note 14 4G | +| rodin | 红米Turbo 4 / POCO X7 Pro | +| miro | 红米K80 Pro / POCO F7 Ultra | +| zorn | 红米K80 / POCO F7 Pro | +| warm | POCO C75 5G / 红米A4 5G | +| haotian | 小米15 Pro | +| dada | 小米15 | +| muyu | 小米平板7 Pro | +| uke | 小米平板7 / POCO Pad X1 | +| degas | 小米14T | +| amethyst | 红米Note14 Pro+ | +| malachite | 红米Note14 Pro / POCO X7 | +| beryl | 红米Note14 5G / POCO M7 Pro 5G | +| flame | 红米14R 5G / POCO M7 5G | +| lake | 红米14C / 红米A3 Pro / POCO C75 | +| flare | 红米平板SE 8.7 WiFi | +| spark | 红米平板SE 8.7 4G | +| breeze | 红米13 5G / 红米Note 13R / POCO M6 Plus 5G | +| ruyi | 小米MIX Flip | +| goku | 小米MIX Fold 4 | +| rothko | 红米K70 至尊版 / 小米14T Pro | +| klein | 红米A3x | +| peridot | 红米Turbo 3 / POCO F6 | +| ruan | 红米平板 Pro 5G / POCO Pad 5G | +| dizi | 红米平板 Pro | +| chenfeng | 小米CIVI 4 Pro / 小米14 Civi | +| blue | 红米A3 / POCO C61 | +| aurora | 小米14 Ultra | +| shennong_t | 小米14 Pro 钛金属版 | +| sheng | 小米平板6S Pro 12.4 | +| sapphiren | 红米Note13 4G NFC | +| sapphire | 红米Note13 4G | +| moon | 红米13 / POCO M6 | +| air | 红米13R 5G / 红米13C 5G | +| duchamp | 红米K70E / POCO X6 Pro 5G | +| manet | 红米K70 Pro | +| vermeer | 红米K70 / POCO F6 Pro | +| gale | 红米13C / POCO C65 | +| shennong | 小米14 Pro | +| houji | 小米14 | +| aristotle | 小米13T | +| garnet | 红米Note13 Pro 5G / POCO X6 | +| gold | 红米Note13 5G / 13R Pro | +| zircon | 红米Note13 Pro+ 5G | +| xun | 红米平板SE | +| babylon | 小米MIX Fold 3 | +| corot | 红米K60 至尊版 / 小米13T Pro | +| yudi | 小米平板6 Max | +| sky | 红米Note12R / POCO M6 Pro 5G / 红米12 5G | +| fire | 红米12 | +| pearl | 红米Note12T Pro | +| yuechu | 小米CIVI3 | +| sea | 红米Note12S | +| ishtar | 小米13 Ultra | +| liuqin | 小米平板6 Pro | +| pipa | 小米平板6 | +| sweet_k6a | 红米Note12 Pro 4G | +| topaz | 红米Note12 4G NFC | +| tapas | 红米Note12 4G | +| marble | 红米Note12 Turbo / POCO F5 5G | +| water | POCO C51 / 红米A2 / A2+ | +| earth | 红米12C / POCO C55 | +| redwood | 红米Note12 Pro 极速版 / POCO X5 Pro 5G | +| rembrandt | 红米K60E | +| socrates | 红米K60 Pro | +| mondrian | 红米K60 / POCO F5 Pro | +| nuwa | 小米13 Pro | +| fuxi | 小米13 | +| moonstone | POCO X5 5G | +| sunstone | 红米Note12 5G / 红米Note12R Pro | +| ruby | 红米Note12 Pro+ | +| plato | 小米12T | +| yunluo | 红米平板 | +| ziyi | 小米CIVI 2 / 小米13 Lite | +| ice | POCO C50 / 红米A1 | +| rosemary_p | POCO M5S | +| rock | POCO M5 / 红米11 Prime 4G | +| dagu | 小米平板5 Pro 12.4 | +| diting | 红米K50 至尊版 / 小米12T Pro | +| zizhan | 小米MIX Fold 2 | +| mayfly | 小米12S | +| thor | 小米12S Ultra | +| unicorn | 小米12S Pro | +| daumier | 小米12 Pro 天玑版 | +| taoyao | 小米12 Lite | +| frost | POCO C40 | +| xaga | 红米Note11T Pro / Pro+ / POCO X4 GT / Pro / 红米K50i / Pro | +| zijin | 小米CIVI 1S | +| lilac | 红米Note 10T | +| dandelion | 红米10A | +| fog | 红米10C | +| rubens | 红米K50 | +| matisse | 红米K50 Pro | +| munch | 红米K40S / POCO F4 | +| viva | 红米Note11 Pro | +| lightcm | 红米Note11R | +| light | 红米Note11E / POCO M4 5G / 红米10 Prime+ 5G | +| ingres | 红米K50 电竞版 / POCO F4 GT | +| spesn | 红米Note11 NFC | +| spes | 红米Note11 | +| veux | 红米Note11E Pro / 红米Note11 Pro 5G | +| opal | 红米Note 11S 5G | +| fleur | 红米Note 11S / POCO M4 Pro 4G | +| zeus | 小米12 Pro | +| psyche | 小米12X | +| cupid | 小米12 | +| evergreen | POCO M4 Pro 5G | +| pissarro | 红米Note11 Pro / Pro+ | +| evergo | 红米Note11 5G | +| selenes | 红米Note11 4G | +| mona | 小米CIVI | +| lisa | 小米11青春活力版 | +| agate | 小米11T | +| vili | 小米11T Pro | +| selene | 红米10 | +| odin | 小米MIX4 | +| elish | 小米平板5 Pro (WiFi) | +| enuma | 小米平板5 Pro (5G) | +| nabu | 小米平板5 | +| chopin | 红米Note 10 Pro (China) / POCO X3 GT | +| camellia | 红米Note 10 (China) / POCO M3 Pro / 红米Note 11 SE | +| biloba | 红米Note 8 (21年款) | +| ares | 红米K40 游戏增强版 / POCO F3 GT | +| cetus | 小米MIX Fold | +| renoir | 小米11 青春版 | +| star | 小米11 Pro / Ultra | +| courbet | 小米11 Lite 4G | > [!NOTE] -> 此模块应该可以在其他平板型号、品牌和系统上运行,但仍需进一步测试。欢迎反馈您的测试结果! +> 此模块应该可以在其他型号、品牌和系统上运行,但仍需进一步测试。欢迎反馈您的测试结果! ## 安装 @@ -67,6 +213,9 @@ 7. 选择**目标位置** 8. 从 **Artifacts** 下载构建好的模块 +> [!NOTE] +> 如果没有适用于您设备的模板,您必须使用方法二并上传您自己的开机动画文件。 + ### 方法二:上传自定义文件 1. **Fork** 此仓库 @@ -78,6 +227,9 @@ 7. 选择**目标位置** 8. 从 **Artifacts** 下载构建好的模块 +> [!TIP] +> 如果您的设备是手机,您只需要一个 `bootanimation.zip` 文件。多个动画文件仅适用于会根据设备方向更改动画的平板设备。 + > [!WARNING] > `upload/` 文件夹仅供在您自己的 Fork 中个人使用。请勿提交包含此文件夹更改的 Pull Request,否则将被自动关闭。 @@ -127,7 +279,7 @@ bootanimation.zip p 0 5 part0 ``` -- `c` = 完整播放(或 `p` = 播放并重复) +- `c` = 完整播放, `p` = 播放并重复 - 第一个数字 = 循环次数(0 = 无限) - 第二个数字 = 循环后暂停(以帧为单位) - 路径 = 包含帧的文件夹 @@ -136,7 +288,7 @@ p 0 5 part0 > 开机动画 ZIP 文件**必须**使用 STORE 压缩(无压缩)。工作流程会自动处理此问题。 ## 免责声明 -**刷写此模块可能会导致您的设备进入引导循环,强烈建议使用引导循环保护模块。对于使用此模块对您的设备或数据造成的任何损害,我概不负责。使用风险自负。** +**尽管刷写此模块导致设备进入引导循环的可能性很小,但仍强烈建议使用引导循环保护模块。对于使用此模块对您的设备或数据造成的任何损害,我概不负责。使用风险自负。** ## 许可证 This program is free software: you can redistribute it and/or modify From c01874d738f8b2ddb35eca2241b4288330d80a0d Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:55:47 +0000 Subject: [PATCH 20/28] docs: add clarification on systemless mount usage --- README.md | 2 ++ README_zh-CN.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 6699772..1d9ae73 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ English | [简体中文](/README_zh-CN.md) ## Introduction A simple module designed to replace the boot animations with custom ones. This module is also compatible with tablets since, in contrast to phones, tablets frequently modify their animations according to the orientation of the device. +This module utilizes systemless mount to mount the bootanimation files to the specified location, ensuring no modifications are made to the system partition. + ## Requirements - Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ - Android 11+ (API 30+) running MIUI/HyperOS diff --git a/README_zh-CN.md b/README_zh-CN.md index 372ba1e..81ce5f3 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -4,6 +4,8 @@ ## 介绍 一个简单的模块,用于将开机动画替换为自定义动画。此模块也兼容平板设备,因为与手机不同,平板设备通常会根据设备方向调整其动画。 +此模块使用 systemless 挂载方式将开机动画文件挂载到指定位置,确保不会对系统分区进行任何修改。 + ## 已测试设备 | 设备 | 系统版本 | 状态 | From c22b0e4eb7fb4db66202272ca3fe94c95ead25ec Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:09:40 +0000 Subject: [PATCH 21/28] refactor: update module name and version --- .github/workflows/package-release.yml | 27 +++++++++++++-------------- RELEASE_NOTES.md => CHANGELOG.md | 12 +++++++++++- module/module.prop | 12 ++++++------ 3 files changed, 30 insertions(+), 21 deletions(-) rename RELEASE_NOTES.md => CHANGELOG.md (56%) diff --git a/.github/workflows/package-release.yml b/.github/workflows/package-release.yml index 4a6dc47..b54f8da 100644 --- a/.github/workflows/package-release.yml +++ b/.github/workflows/package-release.yml @@ -1,10 +1,9 @@ name: "NodeJs with Release" # This workflow is for maintainers/developers only -# -# Before running: + # 1. Update module/module.prop with the new version -# 2. Edit RELEASE_NOTES.md +# 2. Edit CHANGELOG.md # 3. Run run-name: "Release: v${{ inputs.version }} (${{ inputs.release_type }})" @@ -58,7 +57,7 @@ jobs: id: create_zip run: | VERSION="${{ github.event.inputs.version }}" - ZIP_NAME="mipad-custom-boot-$VERSION.zip" + ZIP_NAME="mi-boot-replacer-$VERSION.zip" cd module @@ -91,10 +90,10 @@ jobs: RELEASE_TYPE="${{ github.event.inputs.release_type }}" ZIP_NAME="${{ steps.create_zip.outputs.zip_name }}" - # Check if RELEASE_NOTES.md exists - if [ ! -f "RELEASE_NOTES.md" ]; then - echo "Error: RELEASE_NOTES.md not found!" - echo "Please create RELEASE_NOTES.md with your release notes before running this workflow." + # Check if CHANGELOG.md exists + if [ ! -f "CHANGELOG.md" ]; then + echo "Error: CHANGELOG.md not found!" + echo "Please create CHANGELOG.md with your release notes before running this workflow." exit 1 fi @@ -102,13 +101,13 @@ jobs: PREV_TAG=$(gh release list --repo ${{ github.repository }} --exclude-drafts --limit 1 --json tagName -q '.[0].tagName' 2>/dev/null || echo "") # Copy release notes and append changelog link - cp RELEASE_NOTES.md release_notes.md + cp CHANGELOG.md changelog.md if [ -n "$PREV_TAG" ]; then CHANGELOG_URL="https://github.com/${{ github.repository }}/compare/${PREV_TAG}...${TAG}" - echo "" >> release_notes.md - echo "---" >> release_notes.md - echo "**Full Changelog**: ${CHANGELOG_URL}" >> release_notes.md + echo "" >> changelog.md + echo "---" >> changelog.md + echo "**Full Changelog**: ${CHANGELOG_URL}" >> changelog.md fi # Build release flags @@ -130,7 +129,7 @@ jobs: # Create the release with the ZIP attached gh release create "$TAG" "$ZIP_NAME" \ --title "$TITLE" \ - --notes-file release_notes.md \ + --notes-file changelog.md \ $FLAGS echo "Release created successfully!" @@ -155,7 +154,7 @@ jobs: fi VERSION_NO_V="${{ github.event.inputs.version }}" - ZIP_URL="https://github.com/${{ github.repository }}/releases/latest/download/mipad-custom-boot-${VERSION_NO_V}.zip" + ZIP_URL="https://github.com/${{ github.repository }}/releases/latest/download/mi-boot-replacer-${VERSION_NO_V}.zip" CHANGELOG_URL="https://raw.githubusercontent.com/${{ github.repository }}/main/README.md" echo "Updating update.json..." diff --git a/RELEASE_NOTES.md b/CHANGELOG.md similarity index 56% rename from RELEASE_NOTES.md rename to CHANGELOG.md index b6f5b27..b0ede21 100644 --- a/RELEASE_NOTES.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ -## Stable release +## v1.1.2 + +### Module Rebranding + +- **Renamed to "Xiaomi Boot Animation Replacer" (mi-boot-replacer)** + - The module is no longer limited to tablet devices + - Now supports both phones and tablets + +--- + +## v1.1.1 ### Bug Fixes diff --git a/module/module.prop b/module/module.prop index 4faaae3..5ce7299 100644 --- a/module/module.prop +++ b/module/module.prop @@ -1,7 +1,7 @@ -id=mipad-custom-boot -name=mipad-custom-boot -version=v1.1.1 -versionCode=111 +id=mi-boot-replacer +name=Xiaomi Boot Animation Replacer +version=v1.1.2 +versionCode=112 author=Veutexus -description=A module that can custom boot animation for tablet devices. (GitHub: https://github.com/G0246/mipad-custom-boot) -updateJson=https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/update.json +description=A module that can custom boot animation for Xiaomi devices. (GitHub: https://github.com/G0246) +updateJson=https://raw.githubusercontent.com/G0246/mi-boot-replacer/main/update.json From be2aa3a82ff9b5e994ed6383805557cefc1505f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 30 Nov 2025 14:13:10 +0000 Subject: [PATCH 22/28] chore: update JSON for release v1.1.2 --- update.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/update.json b/update.json index fff4f8a..ee52525 100644 --- a/update.json +++ b/update.json @@ -1,6 +1,6 @@ { - "version": "v1.1.1", - "versionCode": 111, - "zipUrl": "https://github.com/G0246/mipad-custom-boot/releases/latest/download/mipad-custom-boot-1.1.1.zip", - "changelog": "https://raw.githubusercontent.com/G0246/mipad-custom-boot/main/RELEASE_NOTES.md" + "version": "v1.1.2", + "versionCode": 112, + "zipUrl": "https://github.com/G0246/mi-boot-replacer/releases/latest/download/mi-boot-replacer-1.1.2.zip", + "changelog": "https://raw.githubusercontent.com/G0246/mi-boot-replacer/main/README.md" } From 60fe5baf82c5e45e6ad015601ae5122daaca1b30 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:22:01 +0000 Subject: [PATCH 23/28] fix: enhance README --- .github/workflows/package-release.yml | 2 +- README.md | 1 + README_zh-CN.md | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/package-release.yml b/.github/workflows/package-release.yml index b54f8da..47fe116 100644 --- a/.github/workflows/package-release.yml +++ b/.github/workflows/package-release.yml @@ -155,7 +155,7 @@ jobs: VERSION_NO_V="${{ github.event.inputs.version }}" ZIP_URL="https://github.com/${{ github.repository }}/releases/latest/download/mi-boot-replacer-${VERSION_NO_V}.zip" - CHANGELOG_URL="https://raw.githubusercontent.com/${{ github.repository }}/main/README.md" + CHANGELOG_URL="https://raw.githubusercontent.com/${{ github.repository }}/main/CHANGELOG.md" echo "Updating update.json..." echo " Version: $VERSION" diff --git a/README.md b/README.md index 1d9ae73..354c87a 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ This module utilizes systemless mount to mount the bootanimation files to the sp ## Requirements - Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ - Android 11+ (API 30+) running MIUI/HyperOS + > [!WARNING] > This module is designed for Magisk. KernelSU and APatch are not fully supported and unexpected bugs may occur. diff --git a/README_zh-CN.md b/README_zh-CN.md index 81ce5f3..f2340a9 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -6,6 +6,13 @@ 此模块使用 systemless 挂载方式将开机动画文件挂载到指定位置,确保不会对系统分区进行任何修改。 +## 要求 +- Magisk v26.1+ / KernelSU v0.8.0+ / APatch 10568+ +- Android 11+ (API 30+) 运行 MIUI/HyperOS + +> [!WARNING] +> 此模块专为 Magisk 设计。KernelSU 和 APatch 未获得完全支持,可能会出现意外错误。 + ## 已测试设备 | 设备 | 系统版本 | 状态 | From 6814b3bb25f615a6e7eea358a58f15a895f1eba5 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:25:49 +0000 Subject: [PATCH 24/28] fix: improve PR closing logic --- .github/workflows/close-upload-pr.yml | 43 ++++++++++++++++----------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/.github/workflows/close-upload-pr.yml b/.github/workflows/close-upload-pr.yml index cbd51e5..b6b3983 100644 --- a/.github/workflows/close-upload-pr.yml +++ b/.github/workflows/close-upload-pr.yml @@ -15,19 +15,29 @@ jobs: pull-requests: write steps: - - name: Close PR + - name: Check and Close PR uses: actions/github-script@v7 with: script: | const prNumber = context.payload.pull_request.number; const prAuthor = context.payload.pull_request.user.login; + const repoOwner = context.repo.owner; + const isOwner = prAuthor.toLowerCase() === repoOwner.toLowerCase(); - // Add comment explaining why - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - body: `Hi @${prAuthor}, + if (isOwner) { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: `⚠️ This PR modifies the \`upload/\` folder.` + }); + console.log(`Warning added to PR #${prNumber}`); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: `Hi @${prAuthor}, This PR has been automatically closed because it modifies the \`upload/\` folder. @@ -42,14 +52,13 @@ jobs: If you have a different contribution (bug fix, new template, etc.), please open a new PR without changes to the \`upload/\` folder. Thank you for your understanding!` - }); + }); - // Close the PR - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - state: 'closed' - }); - - console.log(`Closed PR #${prNumber} - modifies upload folder`); + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + state: 'closed' + }); + console.log(`Closed PR #${prNumber}`); + } From 5b05d749491cd5d77184a1491b78e73c2404bd1a Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:29:36 +0000 Subject: [PATCH 25/28] fix: enhance logic --- .github/workflows/close-upload-pr.yml | 33 +++++++++++++++------------ 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/.github/workflows/close-upload-pr.yml b/.github/workflows/close-upload-pr.yml index b6b3983..b7ce566 100644 --- a/.github/workflows/close-upload-pr.yml +++ b/.github/workflows/close-upload-pr.yml @@ -24,6 +24,8 @@ jobs: const repoOwner = context.repo.owner; const isOwner = prAuthor.toLowerCase() === repoOwner.toLowerCase(); + console.log(`PR Author: ${prAuthor}, Repo Owner: ${repoOwner}, Is Owner: ${isOwner}`); + if (isOwner) { await github.rest.issues.createComment({ owner: context.repo.owner, @@ -32,12 +34,14 @@ jobs: body: `⚠️ This PR modifies the \`upload/\` folder.` }); console.log(`Warning added to PR #${prNumber}`); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - body: `Hi @${prAuthor}, + return; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: `Hi @${prAuthor}, This PR has been automatically closed because it modifies the \`upload/\` folder. @@ -52,13 +56,12 @@ jobs: If you have a different contribution (bug fix, new template, etc.), please open a new PR without changes to the \`upload/\` folder. Thank you for your understanding!` - }); + }); - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - state: 'closed' - }); - console.log(`Closed PR #${prNumber}`); - } + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + state: 'closed' + }); + console.log(`Closed PR #${prNumber}`); From 07793eec8dc59366f75b8c14aa78a24e59150ad7 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:32:34 +0000 Subject: [PATCH 26/28] fix: simplify PR closing logic --- .github/workflows/close-upload-pr.yml | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/.github/workflows/close-upload-pr.yml b/.github/workflows/close-upload-pr.yml index b7ce566..cfe3fe0 100644 --- a/.github/workflows/close-upload-pr.yml +++ b/.github/workflows/close-upload-pr.yml @@ -2,6 +2,7 @@ name: Auto Close Upload PRs # Automatically close PRs that modify the upload folder # The upload folder is for personal use only after forking +# Only applies to PRs from forks, not internal PRs on: pull_request_target: @@ -11,31 +12,18 @@ on: jobs: close-pr: runs-on: ubuntu-latest + # Only run for PRs from forks + if: github.event.pull_request.head.repo.full_name != github.repository permissions: pull-requests: write steps: - - name: Check and Close PR + - name: Close PR uses: actions/github-script@v7 with: script: | const prNumber = context.payload.pull_request.number; const prAuthor = context.payload.pull_request.user.login; - const repoOwner = context.repo.owner; - const isOwner = prAuthor.toLowerCase() === repoOwner.toLowerCase(); - - console.log(`PR Author: ${prAuthor}, Repo Owner: ${repoOwner}, Is Owner: ${isOwner}`); - - if (isOwner) { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - body: `⚠️ This PR modifies the \`upload/\` folder.` - }); - console.log(`Warning added to PR #${prNumber}`); - return; - } await github.rest.issues.createComment({ owner: context.repo.owner, @@ -65,3 +53,5 @@ jobs: state: 'closed' }); console.log(`Closed PR #${prNumber}`); + }); + console.log(`Closed PR #${prNumber}`); From 55430ee573af0cb0ded0a3f5c86b48ae4a9a8cb1 Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:36:50 +0000 Subject: [PATCH 27/28] fix: refine broken logic?? --- .github/workflows/close-upload-pr.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/close-upload-pr.yml b/.github/workflows/close-upload-pr.yml index cfe3fe0..c22f8d9 100644 --- a/.github/workflows/close-upload-pr.yml +++ b/.github/workflows/close-upload-pr.yml @@ -2,7 +2,6 @@ name: Auto Close Upload PRs # Automatically close PRs that modify the upload folder # The upload folder is for personal use only after forking -# Only applies to PRs from forks, not internal PRs on: pull_request_target: @@ -12,8 +11,7 @@ on: jobs: close-pr: runs-on: ubuntu-latest - # Only run for PRs from forks - if: github.event.pull_request.head.repo.full_name != github.repository + if: ${{ github.event.pull_request.head.repo.fork == true }} permissions: pull-requests: write @@ -53,5 +51,3 @@ jobs: state: 'closed' }); console.log(`Closed PR #${prNumber}`); - }); - console.log(`Closed PR #${prNumber}`); From ab430d32a6c57bfc8db4ff943b40daa7a55e380f Mon Sep 17 00:00:00 2001 From: Veutexus <70145360+G0246@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:40:05 +0000 Subject: [PATCH 28/28] fix: update PR closing logic again --- .github/workflows/close-upload-pr.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/close-upload-pr.yml b/.github/workflows/close-upload-pr.yml index c22f8d9..efe16c4 100644 --- a/.github/workflows/close-upload-pr.yml +++ b/.github/workflows/close-upload-pr.yml @@ -5,13 +5,15 @@ name: Auto Close Upload PRs on: pull_request_target: + types: [opened] paths: - 'upload/**' jobs: close-pr: runs-on: ubuntu-latest - if: ${{ github.event.pull_request.head.repo.fork == true }} + # Only run for PRs from forks - check if head repo is different from base repo + if: ${{ github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name }} permissions: pull-requests: write @@ -22,6 +24,10 @@ jobs: script: | const prNumber = context.payload.pull_request.number; const prAuthor = context.payload.pull_request.user.login; + const headRepo = context.payload.pull_request.head.repo.full_name; + const baseRepo = context.payload.pull_request.base.repo.full_name; + + console.log(`Head repo: ${headRepo}, Base repo: ${baseRepo}`); await github.rest.issues.createComment({ owner: context.repo.owner,