Skip to content

Build and Release

Build and Release #44

name: Build and Release
on:
workflow_dispatch:
inputs:
SPOTURL:
description: 'Direct URL to Spotify .ipa'
required: true
CHANGEVERSION:
description: 'SpotC++ Version Number'
required: false
EEVEEVERSION:
description: 'EeveeSpotify Version'
required: false
jobs:
build:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up variables
id: setup
run: |
echo "EEVEEVERSION=${{ github.event.inputs.EEVEEVERSION }}" >> $GITHUB_ENV
echo "CHANGEVERSION=${{ github.event.inputs.CHANGEVERSION }}" >> $GITHUB_ENV
echo "SPOTURL=${{ github.event.inputs.SPOTURL }}" >> $GITHUB_ENV
- name: Install Homebrew
run: |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
- name: Install dpkg
run: brew install dpkg
- name: Install Pyzule
run: bash -c "$(curl https://raw.githubusercontent.com/asdfzxcvbn/pyzule/main/install-pyzule.sh)"
- name: Set EEVEEVERSION if not provided
if: ${{ github.event.inputs.EEVEEVERSION == '' || github.event.inputs.EEVEEVERSION == null }}
run: |
echo "EEVEEVERSION not provided, fetching latest release tag..."
export REALEEVEEVERSION=$(curl -s "https://api.github.com/repos/whoeevee/EeveeSpotify/releases/latest" | jq -r '.tag_name')
echo "REALEEVEEVERSION=$REALEEVEEVERSION" >> $GITHUB_ENV
- name: Set REALEEVEEVERSION based on input
if: ${{ github.event.inputs.EEVEEVERSION != '' && github.event.inputs.EEVEEVERSION != null }}
id: find-release
uses: octokit/request-action@v2.x
with:
route: GET /repos/whoeevee/EeveeSpotify/releases
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
env:
EEVEEVERSION: ${{ github.event.inputs.EEVEEVERSION }}
- name: Extract release tag
if: ${{ steps.find-release.outputs.data }}
run: |
RELEASES=$(echo "${{ steps.find-release.outputs.data }}" | jq -r '.[].tag_name')
for tag in $RELEASES; do
if [[ $tag == *"${EEVEEVERSION}"* ]]; then
export REALEEVEEVERSION=$tag
break
fi
done
echo "REALEEVEEVERSION=$REALEEVEEVERSION" >> $GITHUB_ENV
- name: Create Build Components folder
run: mkdir -p "Build Components"
- name: Set VirusTotal key as env variable
run: echo "VIRUSTOTALKEY=${{ secrets.VIRUSTOTALKEY }}" >> $GITHUB_ENV
- name: Download Spotify IPA
run: |
curl -L "${{ github.event.inputs.SPOTURL }}" -o "Build Components/Spotify.ipa"
echo "spotifypath=Build Components/Spotify.ipa" >> $GITHUB_ENV
env:
SPOTURL: ${{ github.event.inputs.SPOTURL }}
- name: Upload Spotify IPA to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-spotify
with:
files: "Build Components/Spotify.ipa"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for Spotify IPA
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTVANILLASPOTIFY=${{ steps.vt-spotify.outputs.analysis }}" >> $GITHUB_ENV
- name: Download EeveeSpotify .deb files
run: |
eevee_asset=$(curl -s https://api.github.com/repos/whoeevee/EeveeSpotify/releases/tags/${{ env.REALEEVEEVERSION }} | jq -r '.assets[] | select(.name | startswith("com.eevee.spotify") and endswith("iphoneos-arm.deb")).browser_download_url')
curl -L "$eevee_asset" -o "Build Components/Eevee-arm"
echo "eevee-arm=Build Components/Eevee-arm" >> $GITHUB_ENV
env:
REALEEVEEVERSION: ${{ env.REALEEVEEVERSION }}
- name: Upload EeveeSpotify to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-eevee
with:
files: "Build Components/Eevee-arm"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for EeveeSpotify
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTEEVEE=${{ steps.vt-eevee.outputs.analysis }}" >> $GITHUB_ENV
- name: Download SwiftProtobuf .deb file
run: |
protobuf_asset=$(curl -s https://api.github.com/repos/whoeevee/EeveeSpotify/releases/tags/${{ env.REALEEVEEVERSION }} | jq -r '.assets[] | select(.name | startswith("org.swift.protobuf.swiftprotobuf") and endswith("iphoneos-arm.deb")).browser_download_url')
curl -L "$protobuf_asset" -o "Build Components/SwiftProtobuf-arm"
echo "swiftprotobuf=Build Components/SwiftProtobuf-arm" >> $GITHUB_ENV
filename=$(basename "${protobuf_asset}")
protobuf_version=$(echo "${filename}" | sed -n 's/org.swift.protobuf.swiftprotobuf_\([^-]*\)_iphoneos-arm.deb/\1/p')
echo "SWIFTPROTOBUFVERSION=${protobuf_version}" >> $GITHUB_ENV
env:
REALEEVEEVERSION: ${{ env.REALEEVEEVERSION }}
- name: Upload SwiftProtobuf to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-swiftprotobuf
with:
files: "Build Components/SwiftProtobuf-arm"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for SwiftProtobuf
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTSWIFTPROTOBUF=${{ steps.vt-swiftprotobuf.outputs.analysis }}" >> $GITHUB_ENV
- name: Download Orion .deb file from Chariz repo
run: |
# Fetch the Packages file from Chariz repo
packages_data=$(curl -s https://repo.chariz.com/Packages)
# Find all entries for Orion package and separate them
orion_entries=$(echo "$packages_data" | awk '/Package: dev.theos.orion14/,/^$/ {print} /^$/' | awk 'BEGIN {RS=""; FS="\n"} {print $0 "\n"}')
highest_version=""
highest_entry=""
# Iterate over each Orion entry
echo "$orion_entries" | while IFS= read -r entry; do
# Check if the entry has Architecture: iphoneos-arm
if echo "$entry" | grep -q "Architecture: iphoneos-arm"; then
# Extract the version of the entry
version=$(echo "$entry" | sed -n 's/^Version: //p')
# Compare versions
if [ -z "$highest_version" ] || dpkg --compare-versions "$version" gt "$highest_version"; then
highest_version="$version"
highest_entry="$entry"
fi
fi
done
# Extract necessary details from the highest version entry using sed
orion_download_url=$(echo "$highest_entry" | sed -n 's/^Filename: //p')
# Download Orion .deb file
echo "Downloading: https://repo.chariz.com/${orion_download_url}"
curl -L "https://repo.chariz.com/${orion_download_url}" -o "Build Components/orion"
# Set environment variables
echo "orion=Build Components/orion" >> $GITHUB_ENV
echo "ORIONVERSION=$highest_version" >> $GITHUB_ENV
- name: Upload Orion to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-orion
with:
files: "Build Components/orion"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for Orion
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTORION=${{ steps.vt-orion.outputs.analysis }}" >> $GITHUB_ENV
- name: Download Sposify .deb file from Dynastic repo
run: |
sposify_url=$(curl -s https://repo.dynastic.co/api/Packages | jq -r '.[] | select(.package=="com.spos").version')
sposify_version=$(echo $sposify_url | jq -r .version)
sposify_download_url=$(echo $sposify_url | jq -r .url)
curl -L "$sposify_download_url" -o "Build Components/sposify"
echo "sposify=Build Components/sposify" >> $GITHUB_ENV
echo "SPOSIFYVERSION=$sposify_version" >> $GITHUB_ENV
- name: Upload Sposify to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-sposify
with:
files: "Build Components/sposify"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for Sposify
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTSPOSIFY=${{ steps.vt-sposify.outputs.analysis }}" >> $GITHUB_ENV
- name: Download SposifyFix .deb file from Level3tjg repo
run: |
sposifyfix_url=$(curl -s https://level3tjg.me/repo/Packages | jq -r '.[] | select(.package=="com.level3tjg.sposifyfix").version')
sposifyfix_version=$(echo $sposifyfix_url | jq -r .version)
sposifyfix_download_url=$(echo $sposifyfix_url | jq -r .url)
curl -L "$sposifyfix_download_url" -o "Build Components/sposifyfix"
echo "sposifyfix=Build Components/sposifyfix" >> $GITHUB_ENV
echo "SPOSIFYFIXVERSION=$sposifyfix_version" >> $GITHUB_ENV
- name: Upload SposifyFix to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-sposifyfix
with:
files: "Build Components/sposifyfix"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for SposifyFix
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTSPOSIFYFIX=${{ steps.vt-sposifyfix.outputs.analysis }}" >> $GITHUB_ENV
- name: Clone OpenSpotifySafariExtension
run: git clone https://github.com/whoeevee/OpenSpotifySafariExtension
- name: Copy OpenSpotifySafariExtension.appex to Build Components
run: |
cp OpenSpotifySafariExtension/OpenSpotifySafariExtension.appex "Build Components/"
echo "EXTCOMMIT=$(git -C OpenSpotifySafariExtension rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Compress OpenSpotifySafariExtension to zip
run: |
cd OpenSpotifySafariExtension
zip -r ../Build\ Components/OpenSpotifySafariExtension.zip ./*
- name: Upload OpenSpotifySafariExtension to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-openspotify
with:
files: "Build Components/OpenSpotifySafariExtension.zip"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for OpenSpotifySafariExtension
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTEXT=${{ steps.vt-openspotify.outputs.analysis }}" >> $GITHUB_ENV
- name: Duplicate and unzip Spotify.ipa
run: |
cp "Build Components/Spotify.ipa" "Build Components/SpotifyAnylises.zip"
unzip "Build Components/SpotifyAnylises.zip" -d payload
- name: Extract info.plist from Spotify
run: |
cp payload/Payload/Spotify.app/Info.plist "Build Components/Info.plist"
echo "VANILLASPOTIFYVERSION=$(defaults read "Build Components/Info.plist" CFBundleVersion)" >> $GITHUB_ENV
- name: Modify Spotify with OpenSpotifySafariExtension.appex
run: |
cp "Build Components/OpenSpotifySafariExtension.appex" payload/Payload/Spotify.app/PlugIns/
cd payload
zip -r ../Build\ Components/SpotifyEXT.zip ./*
cd ../Build\ Components
mv SpotifyEXT.zip SpotifyEXT.ipa
echo "spotifyEXTpath=Build Components/SpotifyEXT.ipa" >> $GITHUB_ENV
rm -rf payload
rm SpotifyAnylises.zip
rm Info.plist
- name: Set Change Version
id: set-change-version
run: |
CHANGEVERSION="${{ github.event.inputs.CHANGEVERSION }}"
if [ -z "$CHANGEVERSION" ]; then
latest_tag=$(curl -s https://api.github.com/repos/SpotCompiled/SpotC-Plus-Plus/releases/latest | jq -r .tag_name)
base_version=${latest_tag#v}
IFS='.' read -ra ADDR <<< "$base_version"
last_number=${ADDR[2]}
new_last_number=$((last_number + 1))
CHANGEVERSION="${ADDR[0]}.${ADDR[1]}.$new_last_number"
fi
echo "CHANGEVERSION=$CHANGEVERSION" >> $GITHUB_ENV
- name: Set Components Path
run: echo "componentspath=Build Components" >> $GITHUB_ENV
- name: Run Pyzule
run: pyzule -i ${{ env.spotifyEXTpath }} -o ${{ env.componentspath }}/SpotifyPatched.ipa -v ${{ env.CHANGEVERSION }} -b com.yodaluca23.SpotCPlusPlus -f ${{ env.sposifyfix }} ${{ env.sposify }} ${{ env.orion }} ${{ env.swiftprotobuf }} ${{ env.eevee-arm }} -u
- name: Upload SpotifyPatched.ipa to VirusTotal
if: ${{ env.VIRUSTOTALKEY }}
uses: crazy-max/ghaction-virustotal@v4
id: vt-spotc
with:
files: "${{ env.componentspath }}/SpotifyPatched.ipa"
vt_api_key: ${{ env.VIRUSTOTALKEY }}
- name: Set VirusTotal Analysis URL for SpotC++
if: ${{ env.VIRUSTOTALKEY }}
run: echo "VTSPOTC=${{ steps.vt-spotc.outputs.analysis }}" >> $GITHUB_ENV
- name: Create GitHub Release
uses: ncipollo/release-action@v1
with:
tag: "v${{ env.CHANGEVERSION }}"
name: "SpotC++ v${{ env.CHANGEVERSION }}"
draft: true
files: ${{ env.componentspath }}/SpotifyPatched.ipa
file_glob: true
body: |
## ChangeLog
- Updated [EeveeSpotify](https://github.com/whoeevee/EeveeSpotify) to ${{ env.REALEEVEEVERSION }}
$(curl -s https://api.github.com/repos/whoeevee/EeveeSpotify/releases/tags/${{ env.REALEEVEEVERSION }} | jq -r '.body' | sed 's/^/- (EeveeSpotify) /')
- Updated Spotify to version ${{ env.VANILLASPOTIFYVERSION }}
***
Vanilla IPA decrypted using [a fork of BagBak](https://github.com/TbhLovers/bagbak), on my personal MacBook Air and Jailbroken iPhone XR running [Dopamine](https://github.com/opa334/Dopamine), feel free to contact me with questions about this environment.
App .ipa modified and tweaks injected using Pyzule with the github Action Workflow.
$(if [ -n "${{ secrets.VIRUSTOTALKEY }}" ]; then
echo "<details>
<summary>Version Details & VirusTotal Results</summary><br>
Spotify Version: v${{ env.VANILLASPOTIFYVERSION }}
[Vanilla Spotify VirusTotal](${{ env.VTVANILLASPOTIFY }})<br>
EeveeSpotify Version: ${{ env.REALEEVEEVERSION }}
[EeveeSpotify .deb VirusTotal](${{ env.VTEEVEE }})<br>
Sposify v${{ env.SPOSIFYVERSION }}
[Sposify VirusTotal](${{ env.VTSPOSIFY }})<br>
OpenSpotifySafariExtension Commit: ${{ env.EXTCOMMIT }}
[OpenSpotifySafariExtension Repo Compressed .zip VirusTotal](${{ env.VTEXT }})<br>
Sposify Fix v${{ env.SPOSIFYFIXVERSION }}
[Sposify Fix VirusTotal](${{ env.VTSPOSIFYFIX }})<br>
Orion Runtime (iOS 14 - 16) v${{ env.ORIONVERSION }}
[Orion Runtime (iOS 14 - 16) .deb VirusTotal](${{ env.VTORION }})<br>
SwiftProtobuf Framework v${{ env.SWIFTPROTOBUFVERSION }}
[SwiftProtobuf Framework .deb VirusTotal](${{ env.VTSWIFTPROTOBUF }})<br>
SpotC++ Version: v${{ env.CHANGEVERSION }}
[SpotC++ VirusTotal](${{ env.VTSPOTC }})
<br>
</details>"; fi)