diff --git a/.github/workflows/build-and-release-swift.yml b/.github/workflows/build-and-release-swift.yml new file mode 100644 index 0000000..8112543 --- /dev/null +++ b/.github/workflows/build-and-release-swift.yml @@ -0,0 +1,223 @@ +name: Build and Release Swift + +on: + workflow_dispatch: + +env: + SWIFTPROTOBUF_VERSION: "1.29.0" + +jobs: + build: + runs-on: macos-latest + env: + THEOS: ${{ github.workspace }}/theos + steps: + - uses: actions/checkout@v4 + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.2.0' + + - name: Setup Theos + uses: actions/checkout@v4 + with: + repository: theos/theos + path: ${{ github.workspace }}/theos + submodules: recursive + + - name: Install Dependencies + run: | + brew install make dpkg ldid + echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH + + - name: Copy SwiftProtobuf (rootful) + run: | + mkdir swiftprotobuf && cd "$_" + wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb + ar -x org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb + tar -xvf data.tar.lzma + cp -r Library/Frameworks/SwiftProtobuf.framework $THEOS/lib + + - name: Copy SwiftProtobuf (rootless) + run: | + mkdir swiftprotobuf-rootless && cd "$_" + wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb + ar -x org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb + tar -xvf data.tar.lzma + cp -r var/jb/Library/Frameworks/SwiftProtobuf.framework $THEOS/lib/iphone/rootless + + - name: Build EeveeSpotify (rootful) + run: | + make package FINALPACKAGE=1 + echo "filename=$(find . -not -name '*debug*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV + - uses: actions/upload-artifact@v4 + with: + name: ${{env.filename}} + path: packages/${{env.filename}} + if-no-files-found: error + + - name: Build EeveeSpotify (rootless) + run: | + make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless + echo "filename=$(find . -name '*arm64*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV + - uses: actions/upload-artifact@v4 + with: + name: ${{env.filename}} + path: packages/${{env.filename}} + if-no-files-found: error + + release: + needs: build + runs-on: macos-latest + defaults: + run: + shell: zsh {0} + steps: + - uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + + - name: Set EeveeSpotify Versions + run: | + EEVEESPOTIFY_ROOTFUL=$(echo *iphoneos-arm.deb) + EEVEESPOTIFY_ROOTLESS=$(echo *iphoneos-arm64.deb) + EEVEESPOTIFY_VERSION=${${(s:_:)EEVEESPOTIFY_ROOTFUL}[2]} + + echo "EEVEESPOTIFY_ROOTFUL=$EEVEESPOTIFY_ROOTFUL" >> $GITHUB_ENV + echo "EEVEESPOTIFY_ROOTLESS=$EEVEESPOTIFY_ROOTLESS" >> $GITHUB_ENV + echo "EEVEESPOTIFY_VERSION=$EEVEESPOTIFY_VERSION" >> $GITHUB_ENV + + - name: Download SwiftProtobuf + run: | + wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb + wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb + + echo "SWIFTPROTOBUF_ROOTFUL=org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb" >> $GITHUB_ENV + echo "SWIFTPROTOBUF_ROOTLESS=org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb" >> $GITHUB_ENV + + - name: Download OpenSpotifySafariExtension + run: | + git clone https://github.com/BillyCurtis/OpenSpotifySafariExtension + echo "OPENSPOTIFYSAFARIEXTENSION=OpenSpotifySafariExtension/OpenSpotifySafariExtension.appex" >> $GITHUB_ENV + + - name: Download Decrypted Spotify Package + run: | + response=$(curl -s 'https://decrypt.whoeevee.com/decrypted?appId=324684580&apiKey=${{ secrets.EEVEEDECRYPTER_API_KEY }}') + link=$(echo "$response" | jq -r '.link') + wget -q $link + echo "SPOTIFY_VERSION=${${(s/-/)link}[2]%.ipa}" >> $GITHUB_ENV + echo "SPOTIFY_PACKAGE=$(echo *.ipa)" >> $GITHUB_ENV + + - name: Setup insert-dylib + run: | + git clone https://github.com/Tyilo/insert_dylib.git + xcrun clang -x c -arch arm64 ./insert_dylib/insert_dylib/main.c -I/usr/include/ -o insert-dylib + sudo mv insert-dylib /usr/local/bin/ + sudo chmod +x /usr/local/bin/insert-dylib + + - name: Setup ivinject + run: | + git clone https://github.com/whoeevee/ivinject.git + cp -r ./ivinject/KnownFrameworks ~/.ivinject + wget https://github.com/whoeevee/ivinject/releases/download/first/ivinject-arm64 + sudo mv ivinject-arm64 /usr/local/bin/ + sudo chmod +x /usr/local/bin/ivinject-arm64 + + - name: Setup ipapatch + run: | + wget https://github.com/asdfzxcvbn/ipapatch/releases/download/v2.0.0/ipapatch.macos-arm64 + sudo mv ipapatch.macos-arm64 /usr/local/bin/ipapatch + sudo chmod +x /usr/local/bin/ipapatch + + - name: Check Version + env: + GH_TOKEN: ${{ github.token }} + run: | + LATEST_EEVEESPOTIFY_VERSION=$(gh release list --limit 1 --json tagName --jq '.[0].tagName[5:]') + echo "LATEST_EEVEESPOTIFY_VERSION=$LATEST_EEVEESPOTIFY_VERSION" >> $GITHUB_ENV + + - name: Create EeveeSpotify Package + run: | + EEVEESPOTIFY_PACKAGE="EeveeSpotify-${EEVEESPOTIFY_VERSION}-${SPOTIFY_VERSION}.ipa" + echo "EEVEESPOTIFY_PACKAGE=$EEVEESPOTIFY_PACKAGE" >> $GITHUB_ENV + + ivinject-arm64 "$SPOTIFY_PACKAGE" "$EEVEESPOTIFY_PACKAGE" \ + -i "$EEVEESPOTIFY_ROOTFUL" "$SWIFTPROTOBUF_ROOTFUL" "$OPENSPOTIFYSAFARIEXTENSION" \ + -s - -d --level Optimal + + - name: Create Patched Package + run: | + EEVEESPOTIFY_PATCHED_PACKAGE="EeveeSpotify-${EEVEESPOTIFY_VERSION}-${SPOTIFY_VERSION}-patched.ipa" + echo "EEVEESPOTIFY_PATCHED_PACKAGE=$EEVEESPOTIFY_PATCHED_PACKAGE" >> $GITHUB_ENV + + ipapatch -input "$EEVEESPOTIFY_PACKAGE" -output "$EEVEESPOTIFY_PATCHED_PACKAGE" + + - name: Compose Changelog + if: env.LATEST_EEVEESPOTIFY_VERSION != env.EEVEESPOTIFY_VERSION + env: + GH_TOKEN: ${{ github.token }} + run: | + last_update_repo_date=$(git log -1 --grep="update: repo" --format=%cI) + CHANGELOG="" + + gh pr list --state merged --search "merged:>${last_update_repo_date}" --json files,author \ + | jq -r ' + .[] + | .author.login as $login + | .files[0].path as $file + | "\($login) \($file)" + ' \ + | tail -r \ + | while read -r login file; do + lang_code=$(echo "$file" | grep -oE '/([a-zA-Z-]+)\.lproj/' | sed -E 's|/([a-zA-Z-]+)\.lproj/|\1|') + lang_name=$(echo "import Foundation; print(Locale.current.localizedString(forIdentifier: \"$lang_code\") ?? \"\")" | swift -) + + if [ -z "$lang_name" ]; then + continue + fi + + CHANGELOG+="* Updated ${lang_name} localization by @${login}"$'\n' + done + + echo "CHANGELOG<> $GITHUB_ENV + echo "$CHANGELOG" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Create Release + if: env.LATEST_EEVEESPOTIFY_VERSION != env.EEVEESPOTIFY_VERSION + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + tag_name: swift${{ env.EEVEESPOTIFY_VERSION }} + release_name: Swift ${{ env.EEVEESPOTIFY_VERSION }} + body: ${{ env.CHANGELOG }} + draft: false + prerelease: false + + - name: Upload Packages + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release upload "swift$EEVEESPOTIFY_VERSION" \ + "$EEVEESPOTIFY_PACKAGE" \ + "$EEVEESPOTIFY_ROOTFUL" "$EEVEESPOTIFY_ROOTLESS" \ + "$SWIFTPROTOBUF_ROOTFUL" "$SWIFTPROTOBUF_ROOTLESS" \ + --clobber + + - name: Upload Packages to Telegram + env: + API_ID: ${{ secrets.API_ID }} + API_HASH: ${{ secrets.API_HASH }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + EEVEESPOTIFY_CHANNEL_ID: ${{ secrets.EEVEESPOTIFY_CHANNEL_ID }} + EEVEESPOTIFY_CHANNEL_ACCESS_HASH: ${{ secrets.EEVEESPOTIFY_CHANNEL_ACCESS_HASH }} + run: ./Tools/TelegramUploadEeveeSpotify + + update-repo: + needs: release + permissions: + contents: write + uses: ./.github/workflows/update-repo.yml diff --git a/.github/workflows/build-swift.yml b/.github/workflows/build-swift.yml deleted file mode 100644 index 9b4bd7f..0000000 --- a/.github/workflows/build-swift.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Build Swift - -on: - pull_request: - branches: [ "swift" ] - workflow_dispatch: - -jobs: - build: - runs-on: macos-14 - env: - THEOS: ${{ github.workspace }}/theos - steps: - - uses: actions/checkout@v4 - - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: '16.2.0' - - - name: Setup Theos - uses: actions/checkout@v4 - with: - repository: theos/theos - path: ${{ github.workspace }}/theos - submodules: recursive - - - name: Install Dependencies - run: | - brew install make dpkg ldid - echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH - - - name: Copy SwiftProtobuf (rootful) - run: | - mkdir swiftprotobuf && cd "$_" - wget https://github.com/whoeevee/swift-protobuf/releases/download/1.29.0/org.swift.protobuf.swiftprotobuf_1.29.0_iphoneos-arm.deb - ar -x org.swift.protobuf.swiftprotobuf_1.29.0_iphoneos-arm.deb - tar -xvf data.tar.lzma - cp -r Library/Frameworks/SwiftProtobuf.framework $THEOS/lib - - - name: Copy SwiftProtobuf (rootless) - run: | - mkdir swiftprotobuf-rootless && cd "$_" - wget https://github.com/whoeevee/swift-protobuf/releases/download/1.29.0/org.swift.protobuf.swiftprotobuf_1.29.0_iphoneos-arm64.deb - ar -x org.swift.protobuf.swiftprotobuf_1.29.0_iphoneos-arm64.deb - tar -xvf data.tar.lzma - cp -r var/jb/Library/Frameworks/SwiftProtobuf.framework $THEOS/lib/iphone/rootless - - - name: Build EeveeSpotify (debug) - run: | - make package - echo "filename=$(find . -name '*debug*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV - - uses: actions/upload-artifact@v4 - with: - name: ${{env.filename}} - path: packages/${{env.filename}} - if-no-files-found: error - - - name: Build EeveeSpotify (rootful) - run: | - make package FINALPACKAGE=1 - echo "filename=$(find . -not -name '*debug*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV - - uses: actions/upload-artifact@v4 - with: - name: ${{env.filename}} - path: packages/${{env.filename}} - if-no-files-found: error - - - name: Build EeveeSpotify (rootless) - run: | - make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless - echo "filename=$(find . -name '*arm64*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV - - uses: actions/upload-artifact@v4 - with: - name: ${{env.filename}} - path: packages/${{env.filename}} - if-no-files-found: error diff --git a/.github/workflows/update-repo.yml b/.github/workflows/update-repo.yml index f47ad33..b5a12c7 100644 --- a/.github/workflows/update-repo.yml +++ b/.github/workflows/update-repo.yml @@ -2,6 +2,7 @@ name: Update Repo on: workflow_dispatch: + workflow_call: jobs: build: diff --git a/Tools/TelegramUploadEeveeSpotify b/Tools/TelegramUploadEeveeSpotify new file mode 100755 index 0000000..8c7f947 Binary files /dev/null and b/Tools/TelegramUploadEeveeSpotify differ