diff --git a/.github/workflows/updatesource.yml b/.github/workflows/updatesource.yml new file mode 100644 index 0000000..6a424fc --- /dev/null +++ b/.github/workflows/updatesource.yml @@ -0,0 +1,78 @@ +name: Update StikJIT Source + +on: + release: + types: [published] + workflow_dispatch: + +# Add permissions block to ensure the workflow can push changes +permissions: + contents: write + +jobs: + update-source: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + + - name: Record job start time + id: job_start_time + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + + - name: Update StikJIT source + id: update_source + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + python update_json.py + git config --global user.name 'GitHub Action' + git config --global user.email 'action@github.com' + git add repo.json + if git diff --staged --quiet; then + echo "changes=false" >> $GITHUB_OUTPUT + else + git commit -m "Updated source with latest StikJIT release" + git push + echo "changes=true" >> $GITHUB_OUTPUT + fi + + - name: Calculate job duration + id: duration + if: always() + run: | + end_time=$(date +%s) + duration=$((end_time - ${{ steps.job_start_time.outputs.start_time }})) + echo "duration=$duration seconds" >> $GITHUB_OUTPUT + + - name: Create job summary + run: | + if [[ "${{ steps.update_source.outputs.changes }}" == "true" ]]; then + echo "## Update StikJIT Source Summary 🚀" >> $GITHUB_STEP_SUMMARY + echo "✅ Changes Detected and Applied" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The repo.json file has been updated with the latest release information." >> $GITHUB_STEP_SUMMARY + else + echo "## Update StikJIT Source Summary 🚀" >> $GITHUB_STEP_SUMMARY + echo "🔍 No Changes Detected" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The repo.json file is up to date. No changes were necessary." >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + echo "🕐 Execution Time" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "This job took ${{ steps.duration.outputs.duration }} to complete." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "📆 Next Scheduled Run" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The next scheduled run will be triggered when a new release is published." >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/update_json.py b/update_json.py new file mode 100644 index 0000000..e9a0638 --- /dev/null +++ b/update_json.py @@ -0,0 +1,143 @@ +import json +import re +import requests +import os +from datetime import datetime + +def prepare_description(text): + text = re.sub('<[^<]+?>', '', text) # Remove HTML tags + text = re.sub(r'#{1,6}\s?', '', text) # Remove markdown header tags + text = re.sub(r'\*{2}', '', text) # Remove all occurrences of two consecutive asterisks + text = re.sub(r'(?<=\r|\n)-', '•', text) # Only replace - with • if it is preceded by \r or \n + text = re.sub(r'`', '"', text) # Replace ` with " + text = re.sub(r'\r\n\r\n', '\r \n', text) # Replace \r\n\r\n with \r \n (avoid incorrect display of the description regarding paragraphs) + return text + +def fetch_latest_release(repo_url): + api_url = f"https://api.github.com/repos/{repo_url}/releases" + headers = { + "Accept": "application/vnd.github+json", + } + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + release = response.json() + return release + except requests.RequestException as e: + print(f"Error fetching releases: {e}") + raise + +def get_file_size(url): + try: + response = requests.head(url) + response.raise_for_status() + return int(response.headers.get('Content-Length', 0)) + except requests.RequestException as e: + print(f"Error getting file size: {e}") + return 0 + +def update_json_file(json_file, latest_release): + if isinstance(latest_release, list) and latest_release: + latest_release = latest_release[0] + else: + print("Error getting latest release") + return + + try: + with open(json_file, "r") as file: + data = json.load(file) + except json.JSONDecodeError as e: + print(f"Error reading JSON file: {e}") + data = {"apps": []} + raise + + app = data["apps"][0] + + full_version = latest_release["tag_name"] + tag = latest_release["tag_name"] + version = re.search(r"(\d+\.\d+\.\d+)", full_version).group(1) + version_date = latest_release["published_at"] + date_obj = datetime.strptime(version_date, "%Y-%m-%dT%H:%M:%SZ") + version_date = date_obj.strftime("%Y-%m-%d") + + description = latest_release["body"] + description = prepare_description(description) + + assets = latest_release.get("assets", []) + download_url = None + size = None + for asset in assets: + if asset["name"].endswith(".ipa"): + download_url = asset["browser_download_url"] + size = asset["size"] + break + + if download_url is None or size is None: + print("Error: IPA file not found in release assets.") + return + + version_entry = { + "version": version, + "date": version_date, + "localizedDescription": description, + "downloadURL": download_url, + "size": size, + "minOSVersion": "17.4" # Adding minOSVersion for StikJIT + } + + duplicate_entries = [item for item in app["versions"] if item["version"] == version] + if duplicate_entries: + app["versions"].remove(duplicate_entries[0]) + + app["versions"].insert(0, version_entry) + + app.update({ + "version": version, + "versionDate": version_date, + "versionDescription": description, + "downloadURL": download_url, + "size": size + }) + + if "news" not in data: + data["news"] = [] + + news_identifier = f"release-{full_version}" + date_string = date_obj.strftime("%d/%m/%y") + news_entry = { + "appID": "com.stik.sj", + "caption": f"Update of StikJIT just got released!", + "date": latest_release["published_at"], + "identifier": news_identifier, + "imageURL": "https://github.com/0-Blu/StikJIT/blob/main/assets/StikJIT.png?raw=true", + "notify": True, + "tintColor": "#293B45", + "title": f"{full_version} - StikJIT {date_string}", + "url": f"https://github.com/0-Blu/StikJIT/releases/tag/{tag}" + } + + news_entry_exists = any(item["identifier"] == news_identifier for item in data["news"]) + if not news_entry_exists: + data["news"].append(news_entry) + + try: + with open(json_file, "w") as file: + json.dump(data, file, indent=2) + print("JSON file updated successfully.") + except IOError as e: + print(f"Error writing to JSON file: {e}") + raise + +def main(): + repo_url = "0-Blu/StikJIT" + json_file = "repo.json" + + try: + fetched_data_latest = fetch_latest_release(repo_url) + update_json_file(json_file, fetched_data_latest) + except Exception as e: + print(f"An error occurred: {e}") + raise + +if __name__ == "__main__": + main() \ No newline at end of file