diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 231add2..3bd5cdf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: source utils.sh is_youtube_latest() { - if [[ $YT_PATCHER_ARGS == *"--experimental"* ]]; then + if [ "${YOUTUBE_MODE%/*}" = latest ]; then declare -r cur_yt=$(sed -n 's/.*YouTube: \(.*\)/\1/p' build.md | xargs) [ -z "$cur_yt" ] && return 1 # empty, fail=>dont build declare -r last_ver=$(get_apk_vers "https://www.apkmirror.com/uploads/?appcategory=youtube" | get_largest_ver) diff --git a/build.conf b/build.conf index 1680932..4ce3833 100644 --- a/build.conf +++ b/build.conf @@ -1,20 +1,31 @@ -# ex: for excluding patches: -e patchname -e anotherpatchname -# if you add '--experimental' arg, you get latest version of apps ignoring the versions revanced-patches support -# if you remove '-e microg-support' arg, you get non-root builds -YT_PATCHER_ARGS="-e microg-support" -MUSIC_PATCHER_ARGS="-e music-microg-support" +# patches to exclude (white-space does not matter) +# example: +# YOUTUBE_EXCLUDED_PATCHES=" +# patch1 another-patch +# some-other-patch patch2 patch3 +# " +# NO NEED TO PUT MICROG PATCHES IN THIS LIST. IT IS HANDLED BY THE MODE CONFIGURATION BELOW +YOUTUBE_EXCLUDED_PATCHES="" +MUSIC_EXCLUDED_PATCHES="" -BUILD_YT=true -BUILD_MUSIC_ARM64_V8A=true -BUILD_MUSIC_ARM_V7A=true -BUILD_TWITTER=true -BUILD_REDDIT=true +# MODE: build-mode/version +# options: [module|apk|both|none]/[auto|latest|custom (like 17.36.42)] +# examples: module/auto, both/17.40.41, apk/latest, module/17.36.42, apk/auto, none/none +# 'auto' = selects according to the latest revanced-patches supported version +# 'latest' = always latest +YOUTUBE_MODE=both/auto +MUSIC_ARM64_V8A_MODE=both/auto +MUSIC_ARM_V7A_MODE=both/auto +TWITTER_MODE=apk/latest +REDDIT_MODE=apk/latest +TIKTOK_MODE=apk/latest +SPOTIFY_MODE=apk/latest -BUILD_WARN_WETTER=false -BUILD_TIKTOK=false +WARN_WETTER_MODE=none/latest -BUILD_MINDETACH_MODULE=true -MOUNT_DELAY=1 # some low-end phones *cannot mount apks on boot* without a delay. increase to something like 20 if needed. +MOUNT_DELAY=5 # some low-end phones cannot mount apks on boot without a delay. increase to something like 20 if needed. +COMPRESSION_LEVEL=9 # compression level for module zips. between 1 and 9 ENABLE_MAGISK_UPDATE=true # set this to false if you do not want to receive updates from magisk app +BUILD_MINDETACH_MODULE=false UPDATE_PREBUILTS=true # dont touch this diff --git a/build.sh b/build.sh index 1b08ed7..2e467c5 100755 --- a/build.sh +++ b/build.sh @@ -33,22 +33,31 @@ if [ "$UPDATE_PREBUILTS" = true ]; then get_prebuilts; else set_prebuilts; fi reset_template get_cmpr -if [ "$BUILD_TWITTER" = true ]; then build_twitter; fi -if [ "$BUILD_REDDIT" = true ]; then build_reddit; fi -if [ "$BUILD_WARN_WETTER" = true ]; then build_warn_wetter; fi -if [ "$BUILD_TIKTOK" = true ]; then build_tiktok; fi -if [ "$BUILD_YT" = true ]; then build_yt; fi -if [ "$BUILD_MUSIC_ARM64_V8A" = true ]; then build_music $ARM64_V8A; fi -if [ "$BUILD_MUSIC_ARM_V7A" = true ]; then build_music $ARM_V7A; fi +if ((COMPRESSION_LEVEL > 9)) || ((COMPRESSION_LEVEL < 1)); then + abort "COMPRESSION_LEVEL must be between 1 and 9" +fi + +build_youtube +build_music $ARM64_V8A +build_music $ARM_V7A +build_twitter +build_reddit +build_tiktok +build_spotify +build_warn_wetter + if [ "$BUILD_MINDETACH_MODULE" = true ]; then echo "Building mindetach module" cd mindetach-magisk/mindetach/ : >detach.txt - if [ "$BUILD_YT" = true ]; then echo "com.google.android.youtube" >>detach.txt; fi - if [ "$BUILD_MUSIC_ARM64_V8A" = true ] || [ "$BUILD_MUSIC_ARM_V7A" = true ]; then echo "com.google.android.apps.youtube.music" >>detach.txt; fi + if [ "${YOUTUBE_MODE%/*}" != none ]; then echo "com.google.android.youtube" >>detach.txt; fi + if [ "${MUSIC_ARM64_V8A_MODE%/*}" != none ] || [ "${MUSIC_ARM_V7A_MODE%/*}" != none ]; then + echo "com.google.android.apps.youtube.music" >>detach.txt + fi zip -r ../../build/mindetach.zip . cd ../../ fi + log "\n[revanced-magisk-module](https://github.com/j-hc/revanced-magisk-module)" reset_template diff --git a/utils.sh b/utils.sh index 0c69f48..27c4ad2 100755 --- a/utils.sh +++ b/utils.sh @@ -20,7 +20,7 @@ UNINSTALL_SH=$(cat $MODULE_SCRIPTS_DIR/uninstall.sh) json_get() { local key=$1 grep_for=${2:-} - grep "$key" | if [ "$grep_for" ]; then grep "$grep_for"; else cat; fi | sed -E 's/^[^:]*:\s?"(.*)",?/\1/' + grep -o "\"${key}\":[^\"]*\"[^\"]*\"" | sed -E 's/".*".*"(.*)"/\1/' | if [ "$grep_for" ]; then grep "$grep_for"; else cat; fi } get_prebuilts() { @@ -40,7 +40,7 @@ get_prebuilts() { RV_PATCHES_URL=$(echo "$RV_PATCHES" | json_get 'browser_download_url' 'jar') RV_PATCHES_JAR="${TEMP_DIR}/${RV_PATCHES_URL##*/}" log "Patches: ${RV_PATCHES_URL##*/}" - log "${RV_PATCHES_CHANGELOG//# [/### [}\n" + log "\n${RV_PATCHES_CHANGELOG//# [/### [}\n" dl_if_dne "$RV_CLI_JAR" "$RV_CLI_URL" dl_if_dne "$RV_INTEGRATIONS_APK" "$RV_INTEGRATIONS_URL" @@ -79,7 +79,6 @@ reset_template() { req() { wget -nv -O "$2" --header="$WGET_HEADER" "$1"; } log() { echo -e "$1 " >>build.md; } -get_apk_vers() { req "https://www.apkmirror.com/uploads/?appcategory=${1}" - | sed -n 's;.*Version:\(.*\) .*;\1;p'; } get_largest_ver() { local max=0 while read -r v || [ -n "$v" ]; do @@ -99,20 +98,34 @@ dl_if_dne() { } # if you are here to copy paste this piece of code, acknowledge it:) -dl_apk() { +dl_apkmirror() { local url=$1 regexp=$2 output=$3 - url="https://www.apkmirror.com$(req "$url" - | tr '\n' ' ' | sed -n "s/href=\"/@/g; s;.*${regexp}.*;\1;p")" + resp=$(req "$url" -) || return 1 + url="https://www.apkmirror.com$(echo "$resp" | tr '\n' ' ' | sed -n "s/href=\"/@/g; s;.*${regexp}.*;\1;p")" url="https://www.apkmirror.com$(req "$url" - | tr '\n' ' ' | sed -n 's;.*href="\(.*key=[^"]*\)">.*;\1;p')" url="https://www.apkmirror.com$(req "$url" - | tr '\n' ' ' | sed -n 's;.*href="\(.*key=[^"]*\)">.*;\1;p')" req "$url" "$output" } +get_apkmirror_vers() { + local apkmirror_category=$1 + req "https://www.apkmirror.com/uploads/?appcategory=${apkmirror_category}" - | sed -n 's;.*Version:\(.*\) .*;\1;p' +} +get_uptodown_ver() { + local app_name=$1 + req "https://${app_name}.en.uptodown.com/android/download" - | json_get 'softwareVersion' +} +dl_uptodown() { + local app_name=$1 output=$2 + url=$(req "https://${app_name}.en.uptodown.com/android/download" - | sed -n 's;.*data-url="\(.*\)".*;\1;p') + req "$url" "$output" +} patch_apk() { - local stock_input=$1 patched_output=$2 patcher_args=$3 - if [ -f "$patched_output" ]; then return; fi + local stock_input=$1 patched_apk=$2 patcher_args=$3 + echo "java -jar $RV_CLI_JAR --rip-lib x86 --rip-lib x86_64 -c -a $stock_input -o $patched_apk -b $RV_PATCHES_JAR --keystore=ks.keystore $patcher_args" # shellcheck disable=SC2086 # --rip-lib is only available in my own revanced-cli builds - java -jar "$RV_CLI_JAR" --rip-lib x86 --rip-lib x86_64 -c -a "$stock_input" -o "$patched_output" -b "$RV_PATCHES_JAR" --keystore=ks.keystore $patcher_args + java -jar "$RV_CLI_JAR" --rip-lib x86 --rip-lib x86_64 -c -a "$stock_input" -o "$patched_apk" -b "$RV_PATCHES_JAR" --keystore=ks.keystore $patcher_args } zip_module() { @@ -120,7 +133,7 @@ zip_module() { cp -f "$patched_apk" "${MODULE_TEMPLATE_DIR}/base.apk" cp -f "$stock_apk" "${MODULE_TEMPLATE_DIR}/${pkg_name}.apk" cd "$MODULE_TEMPLATE_DIR" || abort "Module template dir not found" - zip -9 -FSr "../${BUILD_DIR}/${module_name}" . + zip -"$COMPRESSION_LEVEL" -FSr "../${BUILD_DIR}/${module_name}" . cd .. } @@ -129,9 +142,9 @@ select_ver() { last_ver=$(get_patch_last_supported_ver "$pkg_name") if [ "$select_ver_experimental" = true ] || [ -z "$last_ver" ]; then if [ "$pkg_name" = "com.twitter.android" ]; then - last_ver=$(get_apk_vers "$apkmirror_category" | grep "release" | get_largest_ver) + last_ver=$(get_apkmirror_vers "$apkmirror_category" | grep "release" | get_largest_ver) else - last_ver=$(get_apk_vers "$apkmirror_category" | get_largest_ver) + last_ver=$(get_apkmirror_vers "$apkmirror_category" | get_largest_ver) fi fi echo "$last_ver" @@ -139,117 +152,168 @@ select_ver() { build_rv() { local -n args=$1 - local version + local version patcher_args dl_from build_mode_arr + local mode_arg=${args[mode]%/*} version_mode=${args[mode]#*/} + args[arch]=${args[arch]:-all} + if [ "${args[apkmirror_dlurl]:-}" ] && [ "${args[regexp]:-}" ]; then dl_from=apkmirror; else dl_from=uptodown; fi reset_template - echo "Building ${args[app_name]} (${args[arch]})" - if [ "${args[is_module]}" = true ]; then - if [[ ${args[patcher_args]} == *"--experimental"* ]]; then - local select_ver_experimental=true - else - local select_ver_experimental=false - fi - if [[ ${args[patcher_args]} != *-e\ ?(music-)microg-support* ]] && - [[ ${args[patcher_args]} != *"--exclusive"* ]] || - [[ ${args[patcher_args]} == *-i\ ?(music-)microg-support* ]]; then - local is_root=false - else - local is_root=true - fi + if [ "$mode_arg" = none ]; then + return + elif [ "$mode_arg" = module ]; then + build_mode_arr=(module) + elif [ "$mode_arg" = apk ]; then + build_mode_arr=(apk) + elif [ "$mode_arg" = both ]; then + build_mode_arr=(apk module) else - local select_ver_experimental=true - local is_root=false + echo "ERROR: undefined build mode for YouTube: '$mode_arg'" + return fi - if [ $is_root = true ]; then - local output_dir="$TEMP_DIR" - # --unsigned is only available in my revanced-cli builds - if [ "${args[rip_all_libs]}" = true ]; then - # native libraries are already extracted. remove them all to keep apks smol - args[patcher_args]="${args[patcher_args]} --unsigned --rip-lib arm64-v8a --rip-lib armeabi-v7a" - else - args[patcher_args]="${args[patcher_args]} --unsigned" + for build_mode in "${build_mode_arr[@]}"; do + patcher_args="${args[patcher_args]:-}" + printf "Building '%s' (%s) in " "${args[app_name]}" "${args[arch]}" + if [ "$build_mode" = module ]; then echo "'module' mode"; else echo "'APK' mode"; fi + + if [ "${args[microg_patch]:-}" ]; then + if [ "$build_mode" = module ]; then + patcher_args="$patcher_args -e ${args[microg_patch]}" + elif [[ "${args[patcher_args]}" = *"${args[microg_patch]}"* ]]; then + abort "UNREACHABLE $LINENO" + fi fi - else - local output_dir="$BUILD_DIR" - fi + if [ "$version_mode" = auto ] && [ $dl_from = apkmirror ]; then + version=$(select_ver "${args[pkg_name]}" "${args[apkmirror_dlurl]##*/}" false) + elif [ "$version_mode" = latest ]; then + if [ $dl_from = apkmirror ]; then + version=$(select_ver "${args[pkg_name]}" "${args[apkmirror_dlurl]##*/}" true) + elif [ $dl_from = uptodown ]; then + version=$(get_uptodown_ver "${args[app_name],,}") + fi + patcher_args="$patcher_args --experimental" + else + version=$version_mode + patcher_args="$patcher_args --experimental" + fi + echo "Choosing version '${version}'" - version=$(select_ver "${args[pkg_name]}" "${args[apkmirror_dlurl]##*/}" $select_ver_experimental) - echo "Choosing version '${version}'" + if [ "$build_mode" = module ]; then + if [ "${args[rip_all_libs]:-}" = true ]; then + # --unsigned is only available in my revanced-cli builds + # native libraries are already extracted. remove them all to keep apks smol + patcher_args="$patcher_args --unsigned --rip-lib arm64-v8a --rip-lib armeabi-v7a" + else + patcher_args="$patcher_args --unsigned" + fi + fi + + local stock_apk="${TEMP_DIR}/${args[app_name],,}-stock-v${version}-${args[arch]}.apk" + local apk_output="${BUILD_DIR}/${args[app_name],,}-revanced-v${version}-${args[arch]}.apk" + if [ "${args[microg_patch]:-}" ]; then + local patched_apk="${TEMP_DIR}/${args[app_name],,}-revanced-v${version}-${args[arch]}-${build_mode}.apk" + else + local patched_apk="${TEMP_DIR}/${args[app_name],,}-revanced-v${version}-${args[arch]}.apk" + fi + if [ ! -f "$stock_apk" ]; then + if [ $dl_from = apkmirror ]; then + echo "Downloading from APKMirror" + if ! dl_apkmirror "https://www.apkmirror.com/apk/${args[apkmirror_dlurl]}-${version//./-}-release/" \ + "${args[regexp]}" \ + "$stock_apk"; then + echo "ERROR: Could not find version '${version}' for ${args[app_name]}" + return 1 + fi + elif [ $dl_from = uptodown ]; then + echo "Downloading the latest version from Uptodown" + if ! dl_uptodown "${args[app_name],,}" "$stock_apk"; then + echo "ERROR: Could not download ${args[app_name]}" + return 1 + fi + else + abort "UNREACHABLE $LINENO" + fi + fi - local stock_apk="${TEMP_DIR}/${args[app_name],,}-stock-v${version}-${args[arch]}.apk" - local patched_apk="${output_dir}/${args[app_name],,}-revanced-v${version}-${args[arch]}.apk" - if [ ! -f "$stock_apk" ]; then - dl_apk "https://www.apkmirror.com/apk/${args[apkmirror_dlurl]}-${version//./-}-release/" \ - "${args[regexp]}" \ - "$stock_apk" if [ "${args[arch]}" = "all" ]; then log "${args[app_name]}: ${version}" else log "${args[app_name]} (${args[arch]}): ${version}" fi - fi - patch_apk "$stock_apk" "$patched_apk" "${args[patcher_args]}" + if [ ! -f "$patched_apk" ] || [ "${args[microg_patch]:-}" ]; then + patch_apk "$stock_apk" "$patched_apk" "$patcher_args" + fi + if [ ! -f "$patched_apk" ]; then + echo "BUILD FAIL" + return + fi + if [ "$build_mode" = apk ]; then + cp -f "$patched_apk" "${apk_output}" + echo "Built ${args[app_name]} (${args[arch]}) (non-root): '${apk_output}'" + continue + fi - if [ ! -f "$patched_apk" ]; then - echo "BUILD FAIL" - return - fi + uninstall_sh "${args[pkg_name]}" + service_sh "${args[pkg_name]}" + postfsdata_sh "${args[pkg_name]}" + customize_sh "${args[pkg_name]}" "${version}" + module_prop "${args[module_prop_name]}" \ + "${args[app_name]} ReVanced" \ + "${version}" \ + "${args[app_name]} ReVanced Magisk module" \ + "https://raw.githubusercontent.com/${GITHUB_REPOSITORY}/update/${args[module_update_json]}" - if [ $is_root = false ]; then - echo "Built ${args[app_name]} (${args[arch]}) (non-root)" - return - fi + local module_output="${args[app_name],,}-revanced-magisk-v${version}-${args[arch]}.zip" + zip_module "$patched_apk" "$module_output" "$stock_apk" "${args[pkg_name]}" - uninstall_sh "${args[pkg_name]}" - service_sh "${args[pkg_name]}" - postfsdata_sh "${args[pkg_name]}" - customize_sh "${args[pkg_name]}" "${version}" - module_prop "${args[module_prop_name]}" \ - "${args[app_name]} ReVanced" \ - "${version}" \ - "${args[app_name]} ReVanced Magisk module" \ - "https://raw.githubusercontent.com/${GITHUB_REPOSITORY}/update/${args[module_update_json]}" - - local module_output="${args[app_name],,}-revanced-magisk-v${version}-${args[arch]}.zip" - zip_module "$patched_apk" "$module_output" "$stock_apk" "${args[pkg_name]}" - - echo "Built ${args[app_name]}: '${BUILD_DIR}/${module_output}'" + echo "Built ${args[app_name]} (${args[arch]}) (root): '${BUILD_DIR}/${module_output}'" + done } -build_yt() { - declare -A yt_args - yt_args[app_name]="YouTube" - yt_args[is_module]=true - yt_args[patcher_args]="${YT_PATCHER_ARGS} -m ${RV_INTEGRATIONS_APK}" - yt_args[arch]="all" - yt_args[rip_all_libs]=true - yt_args[pkg_name]="com.google.android.youtube" - yt_args[apkmirror_dlurl]="google-inc/youtube/youtube" - yt_args[regexp]="APK[^@]*@\([^#]*\)" - yt_args[module_prop_name]="ytrv-magisk" - #shellcheck disable=SC2034 - yt_args[module_update_json]="yt-update.json" +excluded_patches() { + if [ "$1" ]; then + echo "$1" | tr -d '\t\r' | tr ' ' '\n' | grep -v '^$' | sed 's/^/-e /' | paste -sd " " - + else + echo "" + fi +} - build_rv yt_args +build_youtube() { + declare -A youtube_args + youtube_args[app_name]="YouTube" + youtube_args[patcher_args]="-m ${RV_INTEGRATIONS_APK} $(excluded_patches "${YOUTUBE_EXCLUDED_PATCHES}")" + youtube_args[mode]="$YOUTUBE_MODE" + youtube_args[microg_patch]="microg-support" + youtube_args[pkg_name]="com.google.android.youtube" + youtube_args[rip_all_libs]=true + youtube_args[apkmirror_dlurl]="google-inc/youtube/youtube" + youtube_args[regexp]="APK[^@]*@\([^#]*\)" + youtube_args[module_prop_name]="ytrv-magisk" + # shellcheck disable=SC2034 + youtube_args[module_update_json]="yt-update.json" + + build_rv youtube_args } build_music() { declare -A ytmusic_args local arch=$1 ytmusic_args[app_name]="Music" - ytmusic_args[is_module]=true - ytmusic_args[patcher_args]="${MUSIC_PATCHER_ARGS}" + ytmusic_args[patcher_args]="$(excluded_patches "${MUSIC_EXCLUDED_PATCHES}")" + ytmusic_args[microg_patch]="music-microg-support" ytmusic_args[arch]=$arch - ytmusic_args[rip_all_libs]=false ytmusic_args[pkg_name]="com.google.android.apps.youtube.music" + ytmusic_args[rip_all_libs]=false ytmusic_args[apkmirror_dlurl]="google-inc/youtube-music/youtube-music" if [ "$arch" = "$ARM64_V8A" ]; then ytmusic_args[regexp]='arm64-v8a[^@]*@\([^"]*\)' ytmusic_args[module_prop_name]="ytmusicrv-magisk" + ytmusic_args[mode]="$MUSIC_ARM64_V8A_MODE" + elif [ "$arch" = "$ARM_V7A" ]; then ytmusic_args[regexp]='armeabi-v7a[^@]*@\([^"]*\)' ytmusic_args[module_prop_name]="ytmusicrv-arm-magisk" + ytmusic_args[mode]="$MUSIC_ARM_V7A_MODE" fi #shellcheck disable=SC2034 ytmusic_args[module_update_json]="music-update-${arch}.json" @@ -260,13 +324,13 @@ build_music() { build_twitter() { declare -A tw_args tw_args[app_name]="Twitter" - tw_args[is_module]=false - tw_args[patcher_args]="" - tw_args[arch]="all" + tw_args[mode]="$TWITTER_MODE" tw_args[pkg_name]="com.twitter.android" tw_args[apkmirror_dlurl]="twitter-inc/twitter/twitter" + tw_args[regexp]='APK[^@]*@\([^#]*\)' + tw_args[module_prop_name]="twrv-magisk" #shellcheck disable=SC2034 - tw_args[regexp]="APK[^@]*@\([^#]*\)" + tw_args[module_update_json]="tw-update.json" build_rv tw_args } @@ -274,55 +338,65 @@ build_twitter() { build_reddit() { declare -A reddit_args reddit_args[app_name]="Reddit" - reddit_args[is_module]=false - reddit_args[patcher_args]="" - reddit_args[arch]="all" - reddit_args[pkg_name]="com.reddit.frontpage" + reddit_args[mode]="$REDDIT_MODE" + reddit_args[pkg_name]="om.reddit.frontpage" reddit_args[apkmirror_dlurl]="redditinc/reddit/reddit" + reddit_args[regexp]='APK[^@]*@\([^#]*\)' + reddit_args[module_prop_name]="rditrv-magisk" #shellcheck disable=SC2034 - reddit_args[regexp]="APK[^@]*@\([^#]*\)" + reddit_args[module_update_json]="rdit-update.json" build_rv reddit_args } -build_warn_wetter() { - declare -A warn_wetter_args - warn_wetter_args[app_name]="WarnWetter" - warn_wetter_args[is_module]=false - warn_wetter_args[patcher_args]="" - warn_wetter_args[arch]="all" - warn_wetter_args[pkg_name]="de.dwd.warnapp" - warn_wetter_args[apkmirror_dlurl]="deutscher-wetterdienst/warnwetter/warnwetter" - #shellcheck disable=SC2034 - warn_wetter_args[regexp]="APK[^@]*@\([^#]*\)" - - build_rv warn_wetter_args -} - build_tiktok() { declare -A tiktok_args tiktok_args[app_name]="TikTok" - tiktok_args[is_module]=false tiktok_args[patcher_args]="-m ${RV_INTEGRATIONS_APK}" - tiktok_args[arch]="all" + tiktok_args[mode]="$TIKTOK_MODE" tiktok_args[pkg_name]="com.zhiliaoapp.musically" tiktok_args[apkmirror_dlurl]="tiktok-pte-ltd/tik-tok-including-musical-ly/tik-tok-including-musical-ly" + tiktok_args[regexp]='APK[^@]*@\([^#]*\)' + tiktok_args[module_prop_name]="tt-magisk" #shellcheck disable=SC2034 - tiktok_args[regexp]="APK[^@]*@\([^#]*\)" + tiktok_args[module_update_json]="tt-update.json" build_rv tiktok_args } +build_spotify() { + declare -A spotify_args + spotify_args[app_name]="Spotify" + spotify_args[mode]="$SPOTIFY_MODE" + spotify_args[pkg_name]="com.spotify.music" + spotify_args[module_prop_name]="sp-magisk" + #shellcheck disable=SC2034 + spotify_args[module_update_json]="sp-update.json" + + build_rv spotify_args +} + +build_warn_wetter() { + declare -A warn_wetter_args + warn_wetter_args[app_name]="WarnWetter" + warn_wetter_args[mode]="$WARN_WETTER_MODE" + warn_wetter_args[pkg_name]="de.dwd.warnapp" + warn_wetter_args[apkmirror_dlurl]="deutscher-wetterdienst/warnwetter/warnwetter" + warn_wetter_args[regexp]='APK[^@]*@\([^#]*\)' + warn_wetter_args[module_prop_name]="ww-magisk" + #shellcheck disable=SC2034 + warn_wetter_args[module_update_json]="ww-update.json" + + build_rv warn_wetter_args +} + postfsdata_sh() { echo "${POSTFSDATA_SH//__PKGNAME/$1}" >"${MODULE_TEMPLATE_DIR}/post-fs-data.sh"; } uninstall_sh() { echo "${UNINSTALL_SH//__PKGNAME/$1}" >"${MODULE_TEMPLATE_DIR}/uninstall.sh"; } +customize_sh() { echo "${CUSTOMIZE_SH//__PKGNAME/$1}" >"${MODULE_TEMPLATE_DIR}/customize.sh"; } service_sh() { s="${SERVICE_SH//__MNTDLY/$MOUNT_DELAY}" echo "${s//__PKGNAME/$1}" >"${MODULE_TEMPLATE_DIR}/service.sh" } -customize_sh() { - s="${CUSTOMIZE_SH//__PKGNAME/$1}" - echo "${s//__MDVRSN/$2}" >"${MODULE_TEMPLATE_DIR}/customize.sh" -} module_prop() { echo "id=${1}