utilities/get_android_apks.py (69 lines of code) (raw):

import argparse import re from pathlib import Path from bs4 import BeautifulSoup import requests parser = argparse.ArgumentParser("Options for android apk downloader") parser.add_argument('--firefox-version', help="The firefox version to download") args = parser.parse_args() headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept': 'application/json', 'Content-Type': 'application/json', } jobs_filter = ["signing-apk-fenix-debug", "signing-apk-fenix-android-test-debug"] download_ids = {} task_ids = {} path = Path().cwd() final_version = None firefox_version = args.firefox_version.replace(".", "_") hg_url = requests.get("https://hg.mozilla.org/releases/mozilla-release/tags").content soup = BeautifulSoup(hg_url, 'html.parser') versions = soup.find_all('b', string=re.compile("FIREFOX-ANDROID")) beta_versions = sorted([_.get_text() for _ in versions if "b" in _.get_text()]) release_versions = sorted([_.get_text() for _ in versions if "b" not in _.get_text()]) # Filter if they are asking for a beta version or not if "b" in firefox_version: for version in beta_versions: if firefox_version in version: final_version = version elif "latest" in firefox_version: final_version = beta_versions[-1] print(final_version) else: for version in release_versions: if firefox_version in version: final_version = version if not final_version: raise Exception("Firefox Version not found") print(f"https://hg.mozilla.org/releases/mozilla-release/rev/{final_version}") hg_url = requests.get(f"https://hg.mozilla.org/releases/mozilla-release/rev/{final_version}").content soup = BeautifulSoup(hg_url, 'html.parser') treeherder_link = soup.find("a", string='default view') treeherder_link = treeherder_link.get('href') revision = treeherder_link.split('=')[-1] result_id_json = requests.get(f"https://treeherder.mozilla.org/api/project/mozilla-release/push/?full=true&count=10&revision={revision}", headers=headers).json() result_id = result_id_json.get("results")[0].get("id") fenix_jobs = requests.get("https://treeherder.mozilla.org/api/project/mozilla-release/jobs/?job_group_symbol=fenix-debug&count=1000", headers=headers).json() for item in fenix_jobs["results"]: for job in jobs_filter: if item.get("result_set_id") == result_id and job in item.get("job_type_name"): download_ids[job] = item.get("id") if not download_ids: print("Build not found") exit for job, id in download_ids.items(): data = requests.get(f"https://treeherder.mozilla.org/api/project/mozilla-release/jobs/{id}/", headers=headers).json() task_ids[job] = data.get("task_id") test_apk = requests.get( f"https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/{task_ids.get('signing-apk-fenix-android-test-debug')}/runs/0/artifacts/public/build/target.noarch.apk", headers=headers ) fenix_apk = requests.get( f"https://firefox-ci-tc.services.mozilla.com/api/queue/v1/task/{task_ids.get('signing-apk-fenix-debug')}/runs/0/artifacts/public/build/target.x86_64.apk", headers=headers ) with open(path.resolve() / f"android-debug-test-v{args.firefox_version}.apk", "wb") as file: file.write(test_apk.content) with open(path.resolve() / f"fenix-debug-v{args.firefox_version}.apk", "wb") as file: file.write(fenix_apk.content) print("APKS DOWNLOADED SUCCESSFULLY!")