2022-10-09 17:37:34 -05:00
#!/bin/bash
2022-10-11 22:52:34 -05:00
# Run only one instance of this script at one time
[ " ${ BKLOCKER } " != "running" ] && exec env BKLOCKER = "running" flock -en "/tmp/revanced-builder.lock" " $0 " " $@ " || :
2022-10-11 20:14:42 -05:00
2022-10-11 18:29:50 -05:00
# Get timestamp
timestamp = $( date '+%s' )
2022-10-09 17:37:34 -05:00
# File containing all patches
2022-10-11 18:29:50 -05:00
patch_file = "./patches.txt"
# Set working directory and current directory
2022-10-11 20:25:44 -05:00
if [ -d " $1 " ] ; then
WDIR = " $1 "
else
echo "Working directory not provided"
exit -1
fi
2022-10-12 18:28:44 -05:00
# Make sure to work in the script directory
SDIR = " $( dirname -- " $( readlink -f -- " $0 " ; ) " ; ) "
cd " $SDIR "
2022-10-09 17:37:34 -05:00
# Get line numbers where included & excluded patches start from.
# We rely on the hardcoded messages to get the line numbers using grep
excluded_start = " $( grep -n -m1 'EXCLUDE PATCHES' " $patch_file " | cut -d':' -f1) "
included_start = " $( grep -n -m1 'INCLUDE PATCHES' " $patch_file " | cut -d':' -f1) "
# Get everything but hashes from between the EXCLUDE PATCH & INCLUDE PATCH line
# Note: '^[^#[:blank:]]' ignores starting hashes and/or blank characters i.e, whitespace & tab excluding newline
excluded_patches = " $( tail -n +$excluded_start $patch_file | head -n " $(( included_start - excluded_start )) " | grep '^[^#[:blank:]]' ) "
# Get everything but hashes starting from INCLUDE PATCH line until EOF
included_patches = " $( tail -n +$included_start $patch_file | grep '^[^#[:blank:]]' ) "
# Array for storing patches
declare -a patches
# Artifacts associative array aka dictionary
declare -A artifacts
artifacts[ "revanced-cli.jar" ] = "revanced/revanced-cli revanced-cli .jar"
artifacts[ "revanced-integrations.apk" ] = "revanced/revanced-integrations app-release-unsigned .apk"
artifacts[ "revanced-patches.jar" ] = "revanced/revanced-patches revanced-patches .jar"
artifacts[ "apkeep" ] = "EFForg/apkeep apkeep-x86_64-unknown-linux-gnu"
## Functions
get_artifact_download_url( ) {
# Usage: get_download_url <repo_name> <artifact_name> <file_type>
local api_url result
api_url = " https://api.github.com/repos/ $1 /releases/latest "
# shellcheck disable=SC2086
result = $( curl -s $api_url | jq " .assets[] | select(.name | contains(\" $2 \") and contains(\" $3 \") and (contains(\".sig\") | not)) | .browser_download_url " )
echo " ${ result : 1 :- 1 } "
}
# Function for populating patches array, using a function here reduces redundancy & satisfies DRY principals
populate_patches( ) {
# Note: <<< defines a 'here-string'. Meaning, it allows reading from variables just like from a file
while read -r patch; do
patches += ( " $1 $patch " )
done <<< " $2 "
}
## Main
# cleanup to fetch new revanced on next run
2022-10-11 20:25:44 -05:00
if [ [ " $2 " = = "clean" ] ] ; then
2022-10-09 22:10:11 -05:00
rm -f revanced-cli.jar revanced-integrations.apk revanced-patches.jar
2022-10-09 17:37:34 -05:00
exit
fi
2022-10-11 20:25:44 -05:00
if [ [ " $2 " = = "experimental" ] ] ; then
2022-10-09 17:37:34 -05:00
EXPERIMENTAL = "--experimental"
fi
2022-10-11 18:29:50 -05:00
# Set flag to determine if a build should happen or not
flag = false
2022-10-11 19:42:28 -05:00
# Get inside the working directory
cd " $WDIR "
2022-10-11 19:45:39 -05:00
echo " $( date) | Statring check... " | tee -a build.log
2022-10-11 19:42:28 -05:00
2022-10-09 17:37:34 -05:00
# Fetch all the dependencies
for artifact in " ${ !artifacts[@] } " ; do
2022-10-11 18:29:50 -05:00
#Check for updates
name = $( echo " ${ artifacts [ $artifact ] } " | cut -d" " -f1)
[ [ " $name " = = "EFForg/apkeep" && ! -f ./apkeep ] ] && curl -sLo " $artifact " $( get_artifact_download_url ${ artifacts [ $artifact ] } ) && break
version_present = $( jq -r " .\" $name \" " versions.json)
version = $( curl -s " https://api.github.com/repos/ $name /releases/latest " | grep -Eo '"tag_name": "v(.*)"' | sed -E 's/.*"v([^"]+)".*/\1/' )
if [ [ ${ version_present //[!0-9]/ } -lt ${ version //[!0-9]/ } ] ] ; then
2022-10-11 19:45:39 -05:00
echo " Downloading $artifact " | tee -a build.log
2022-10-09 17:37:34 -05:00
# shellcheck disable=SC2086,SC2046
curl -sLo " $artifact " $( get_artifact_download_url ${ artifacts [ $artifact ] } )
2022-10-11 18:29:50 -05:00
jq " .\" $name \" = \" $version \" " versions.json > versions.json.tmp && mv versions.json.tmp versions.json
flag = true
2022-10-09 17:37:34 -05:00
fi
done
2022-10-11 18:29:50 -05:00
# Exit if no updates happened
2022-10-11 20:30:58 -05:00
if [ [ $flag = = false && " $2 " != "force" ] ] ; then
2022-10-11 19:45:39 -05:00
echo "Nothing to update" | tee -a build.log
2022-10-11 18:29:50 -05:00
exit
fi
# Download required apk files
2022-10-12 18:28:44 -05:00
" $SDIR /download_apkmirror.sh " " $WDIR "
2022-10-11 18:29:50 -05:00
2022-10-09 17:37:34 -05:00
# Fetch microG
chmod +x apkeep
if [ ! -f "vanced-microG.apk" ] ; then
# Vanced microG 0.2.24.220220
VMG_VERSION = "0.2.24.220220"
2022-10-11 19:45:39 -05:00
echo "Downloading Vanced microG" | tee -a build.log
2022-10-09 17:37:34 -05:00
./apkeep -a com.mgoogle.android.gms@$VMG_VERSION .
mv com.mgoogle.android.gms@$VMG_VERSION .apk vanced-microG.apk
2022-10-11 18:29:50 -05:00
jq " .\"vanced-microG\" = \" $VMG_VERSION \" " versions.json > versions.json.tmp && mv versions.json.tmp versions.json
2022-10-09 17:37:34 -05:00
fi
# If the variables are NOT empty, call populate_patches with proper arguments
[ [ ! -z " $excluded_patches " ] ] && populate_patches "-e" " $excluded_patches "
[ [ ! -z " $included_patches " ] ] && populate_patches "-i" " $included_patches "
echo "************************************"
echo "Building YouTube APK"
echo "************************************"
if [ -f "com.google.android.youtube.apk" ] ; then
2022-10-09 17:53:35 -05:00
# echo "Building Root APK"
# java -jar revanced-cli.jar -m revanced-integrations.apk -b revanced-patches.jar --mount \
# -e microg-support ${patches[@]} \
# $EXPERIMENTAL \
2022-10-12 19:00:55 -05:00
# -a com.google.android.youtube.apk -o build/revanced-yt-root.apk
2022-10-11 19:45:39 -05:00
echo "Building Non-root APK" | tee -a build.log
2022-10-09 17:37:34 -05:00
java -jar revanced-cli.jar -m revanced-integrations.apk -b revanced-patches.jar \
${ patches [@] } \
$EXPERIMENTAL \
2022-10-12 19:00:55 -05:00
-a com.google.android.youtube.apk -o revanced-yt-nonroot.apk
2022-10-09 17:37:34 -05:00
else
2022-10-11 19:45:39 -05:00
echo "Cannot find YouTube APK, skipping build" | tee -a build.log
2022-10-09 17:37:34 -05:00
fi
echo ""
echo "************************************"
echo "Building YouTube Music APK"
echo "************************************"
if [ -f "com.google.android.apps.youtube.music.apk" ] ; then
2022-10-09 17:53:35 -05:00
# echo "Building Root APK"
# java -jar revanced-cli.jar -b revanced-patches.jar --mount \
# -e microg-support ${patches[@]} \
# $EXPERIMENTAL \
2022-10-12 19:00:55 -05:00
# -a com.google.android.apps.youtube.music.apk -o build/revanced-ytm-root.apk
2022-10-11 19:45:39 -05:00
echo "Building Non-root APK" | tee -a build.log
2022-10-09 17:37:34 -05:00
java -jar revanced-cli.jar -b revanced-patches.jar \
${ patches [@] } \
$EXPERIMENTAL \
2022-10-12 19:00:55 -05:00
-a com.google.android.apps.youtube.music.apk -o revanced-ytm-nonroot.apk
2022-10-09 17:37:34 -05:00
else
2022-10-11 19:45:39 -05:00
echo "Cannot find YouTube Music APK, skipping build" | tee -a build.log
2022-10-09 17:37:34 -05:00
fi
2022-10-11 18:29:50 -05:00
2022-10-11 20:14:42 -05:00
# Rename files
2022-10-12 19:00:55 -05:00
mv revanced-yt-nonroot.apk YouTube_ReVanced_nonroot_$timestamp .apk
mv revanced-ytm-nonroot.apk YouTube_Music_ReVanced_nonroot_$timestamp .apk
# mv revanced-yt-root.apk YouTube_ReVanced_root_$timestamp.apk
# mv revanced-ytm-root.apk YouTube_Music_ReVanced_root_$timestamp.apk
2022-10-11 20:14:42 -05:00
2022-10-11 18:29:50 -05:00
# Send telegram message about the new build
2022-10-11 19:45:39 -05:00
echo "Sending messages to telegram" | tee -a build.log
2022-10-11 21:08:02 -05:00
# telegram-upload uses personal account, hence bypassing 50 MB max upload limit of bots
2022-10-12 19:08:28 -05:00
channel_address = $( cat channel_address | sed -z '$ s/\n$//' )
2022-10-12 19:46:52 -05:00
telegram-upload YouTube_ReVanced_nonroot_$timestamp .apk YouTube_Music_ReVanced_nonroot_$timestamp .apk --to " $channel_address " --caption ""
2022-10-11 21:08:02 -05:00
# telegram.sh uses bot account, but it supports formatted messages
2022-10-12 18:07:42 -05:00
msg = $( cat versions.json | tail -n+2 | head -n-1 | cut -c3- | sed "s/\"//g" | sed "s/,//g" | sed "s/com.google.android.apps.youtube.music/YouTube Music/" \
| sed "s/com.google.android.youtube/YouTube/" | sed "s/vanced-microG/Vanced microG/" | sed "s/revanced\///g" | awk 1 ORS = $'\n' )
./telegram.sh -T "⚙⚙⚙ Build Details ⚙⚙⚙" -M " $msg " $'\n' "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯"
2022-10-11 18:29:50 -05:00
2022-10-12 19:25:40 -05:00
# Do some cleanup, keep only the last 3 build's worth of files
2022-10-11 18:29:50 -05:00
mkdir -p archive
2022-10-12 19:00:55 -05:00
mv YouTube_ReVanced_nonroot_$timestamp .apk archive/
mv YouTube_Music_ReVanced_nonroot_$timestamp .apk archive/
2022-10-12 18:30:14 -05:00
find ./archive -maxdepth 1 -type f -printf '%Ts\t%P\n' \
2022-10-12 18:19:38 -05:00
| sort -rn \
| tail -n +6 \
| cut -f2- \
| xargs -r r