diff --git a/update_json.py b/update_json.py index b118a81..0087e23 100644 --- a/update_json.py +++ b/update_json.py @@ -14,5 +14,177 @@ def prepare_description(text): 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: + print(f"Fetching releases from: {api_url}") + response = requests.get(api_url, headers=headers) + response.raise_for_status() + releases = response.json() + if not releases: + print("No releases found in the repository") + return None + print(f"Found {len(releases)} releases") + print(f"Latest release: {releases[0]['tag_name']}") + return releases + except requests.RequestException as e: + print(f"Error fetching releases: {e}") + return None +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 False + + try: + print(f"Reading JSON file: {json_file}") + with open(json_file, "r") as file: + data = json.load(file) + except json.JSONDecodeError as e: + print(f"Error reading JSON file: {e}") + return False + except FileNotFoundError: + print(f"File {json_file} not found") + return False + + app = data["apps"][0] + current_version = app.get("version", "unknown") + print(f"Current version in repo.json: {current_version}") + + full_version = latest_release["tag_name"] + tag = latest_release["tag_name"] + version_match = re.search(r"(\d+\.\d+\.\d+)", full_version) + if not version_match: + print(f"Could not extract version from tag: {full_version}") + return False + + version = version_match.group(1) + print(f"Latest release version: {version}") + + # Check if the version is already in the versions list + existing_versions = [v["version"] for v in app["versions"]] + print(f"Existing versions: {existing_versions}") + + if version in existing_versions and version == current_version: + print(f"Version {version} already exists and is current, no update needed") + return False + + 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"] or "No description provided" + description = prepare_description(description) + + assets = latest_release.get("assets", []) + print(f"Found {len(assets)} assets in the release") + for asset in assets: + print(f"Asset: {asset['name']}") + + download_url = None + size = None + for asset in assets: + if asset["name"].endswith(".ipa"): + download_url = asset["browser_download_url"] + size = asset["size"] + print(f"Found IPA file: {asset['name']}, size: {size}") + break + + if download_url is None or size is None: + print("Error: IPA file not found in release assets.") + return False + + version_entry = { + "version": version, + "date": version_date, + "localizedDescription": description, + "downloadURL": download_url, + "size": size, + "minOSVersion": "17.4" # Adding minOSVersion for StikJIT + } + + # Always update with the latest version + print(f"Adding new version entry: {version}") + app["versions"].insert(0, version_entry) + + print(f"Updating app with version {version}") + 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: + print(f"Adding news entry for version {full_version}") + data["news"].append(news_entry) + else: + print(f"News entry for version {full_version} already exists") + + try: + print(f"Writing updated JSON to {json_file}") + with open(json_file, "w") as file: + json.dump(data, file, indent=2) + print("JSON file updated successfully.") + return True + except IOError as e: + print(f"Error writing to JSON file: {e}") + return False + +def main(): + # Use the original repository instead of fork + repo_url = "0-Blu/StikJIT" + json_file = "repo.json" + + print(f"Using repository: {repo_url}") + print(f"Updating file: {json_file}") + + try: + fetched_data_latest = fetch_latest_release(repo_url) + if fetched_data_latest: + success = update_json_file(json_file, fetched_data_latest) + if not success: + print("Failed to update JSON file or no changes were needed") + sys.exit(0) # Exit with success code since no changes needed is not an error + else: + print("No releases found to update") + sys.exit(1) + except Exception as e: + print(f"An error occurred: {e}") + sys.exit(1) + +if __name__ == "__main__": + main()