Skip to content

Commit

Permalink
Update: combine kernel and system into one file
Browse files Browse the repository at this point in the history
  • Loading branch information
easterNday committed Jul 15, 2023
1 parent 4a35b8b commit 0619f11
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 79 deletions.
2 changes: 1 addition & 1 deletion Updater/sync.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"thyme": {
"kernel_repo": "ArbitrarilyTong-Devices/Android-Kernel-Builder",
"system_repo": ""
"system_repo": "ArbitrarilyTong-Devices/device_xiaomi_thyme"
}
}
68 changes: 68 additions & 0 deletions Updater/thyme.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[
{
"datetime": 1688685228.0,
"desc": "- 更新了KernelSU内核版本\r\n- 原版没有变更",
"filename": "thyme-kernelsu",
"id": 115940736,
"size": 25300846,
"tag": "kernelsu",
"type": "kernel",
"url": "https://github.com/ArbitrarilyTong-Devices/Android-Kernel-Builder/releases/download/v20230707.2/thyme-kernelsu_20230707.zip",
"version": "v20230707.2"
},
{
"datetime": 1688685981.0,
"desc": "- 更新了KernelSU内核版本\r\n- 原版没有变更",
"filename": "thyme-original",
"id": 115941818,
"size": 24352708,
"tag": "original",
"type": "kernel",
"url": "https://github.com/ArbitrarilyTong-Devices/Android-Kernel-Builder/releases/download/v20230707.2/thyme-original_20230707.zip",
"version": "v20230707.2"
},
{
"datetime": 1688520748.0,
"desc": "- 第一版构建",
"filename": "thyme-kernelsu",
"id": 115644069,
"size": 25301655,
"tag": "kernelsu",
"type": "kernel",
"url": "https://github.com/ArbitrarilyTong-Devices/Android-Kernel-Builder/releases/download/v20230705.1/thyme-kernelsu_20230705.zip",
"version": "v20230705.1"
},
{
"datetime": 1688521518.0,
"desc": "- 第一版构建",
"filename": "thyme-original",
"id": 115645778,
"size": 24357917,
"tag": "original",
"type": "kernel",
"url": "https://github.com/ArbitrarilyTong-Devices/Android-Kernel-Builder/releases/download/v20230705.1/thyme-original_20230705.zip",
"version": "v20230705.1"
},
{
"datetime": 1689374279.0,
"desc": "",
"filename": "ArbitrarilyTong-2.0.0",
"id": 117109574,
"size": 1642814097,
"tag": "UNOFFICIAL",
"type": "system",
"url": "https://github.com/ArbitrarilyTong-Devices/device_xiaomi_thyme/releases/download/Test/ArbitrarilyTong-2.0.0-20230713-UNOFFICIAL-thyme.zip",
"version": "20230713@ArbitrarilyTong-Test"
},
{
"datetime": 1689374903.0,
"desc": "",
"filename": "ArbitrarilyTong-2.0.0",
"id": 117110322,
"size": 1642814097,
"tag": "UNOFFICIAL",
"type": "system",
"url": "https://github.com/ArbitrarilyTong-Devices/device_xiaomi_thyme/releases/download/Test/ArbitrarilyTong-2.0.0-20230714-UNOFFICIAL-thyme.zip",
"version": "20230714@ArbitrarilyTong-Test"
}
]
1 change: 0 additions & 1 deletion Updater/thyme/kernel.json

This file was deleted.

183 changes: 106 additions & 77 deletions Updater/update_sync.py
Original file line number Diff line number Diff line change
@@ -1,122 +1,151 @@
import json
import os
from datetime import datetime

import json
import requests
import sys
from datetime import datetime


def check_and_return(url):
def send_get_request(url):
"""
该函数向指定 URL 发送 GET 请求,如果请求成功,则返回 JSON 响应。
:param url: `url` 参数是您想要向其发送 GET 请求的 API 端点的 URL。
:return: 如果状态代码为 200,则为 JSON 响应。如果状态代码为 403,则打印一条有关超出速率限制的消息。如果请求期间出现错误,则会打印错误消息。
"""
try:
response = requests.get(url)
if response.status_code == 200:
releases = response.json()
return releases
return response.json()
elif response.status_code == 403:
print(
"Rate limit exceeded. Please try again later or provide an access token for authentication.")
return None
else:
print(f"Error occurred during request: {response.text}")
return None
print("Rate limit exceeded. Please try again later or provide an access token for authentication.")
except requests.exceptions.RequestException as e:
print(f"Error occurred during request: {e}")
return None


def get_releases(repo_owner, repo_name):
"""
函数“get_releases”接受存储库所有者和名称,构造 GitHub API 的 URL,并发送 GET 请求以检索指定存储库的版本。
:param repo_owner: GitHub 上存储库的所有者。这通常是创建存储库的个人或组的用户名或组织名称。
:param repo_name: GitHub 上存储库的名称。
:return: 对 GitHub API 端点发出的 API 请求的响应,用于检索存储库的版本。
"""
url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases"
return check_and_return(url)
return send_get_request(url)


def get_release_files(release):
"""
函数“get_release_files”检索给定版本的版本文件和版本主体。
:param release: “release”参数是一个字典,其中包含有关发布的信息。它可能包括发布版本、发布日期以及与发布相关的资产列表等详细信息。
:return: 两个值:对release_files_url 的 GET 请求的结果和发布的正文。
"""
release_files_url = release['assets_url']
release_body = release['body']
return check_and_return(release_files_url),release_body


def generate_release_dict(release_files, release_name, mode_type, device_name, release_desc):
if release_files is None:
return

release_infos = []
for file_info in release_files:
if mode_type == "kernel":
release_infos.append(generate_kernel_release_dict(file_info, release_name, device_name, release_desc))
elif mode_type == "system":
release_infos.append(generate_system_release_dict(file_info, mode_type))
return release_infos


def generate_kernel_release_dict(file_info, release_name, device_name: str, release_desc):
name = str(file_info["name"]).replace(".zip", "").upper()
# filter device
if device_name.lower() not in name.lower():
return None
tag = "KernelSU" if "KERNELSU" in name else "Original"
return send_get_request(release_files_url), release['body']


def generate_release_info(file_info, name, tag, version, desc, mode_type):
"""
函数“generate_release_info”接受各种参数并返回包含有关发布信息的字典。
:param file_info: `file_info` 参数是一个字典,包含有关文件的信息。它应该具有以下键:
:param name: name参数代表发布文件的文件名。
:param tag: “tag”参数是一个字符串,表示文件的标签或版本名称。它用于标识文件的特定版本或发行版。
:param version: “version”参数是一个字符串,表示版本的版本号。
:param desc: “desc”参数是一个字符串,表示版本的描述。它提供有关该版本的附加信息或详细信息。
:param mode_type: 参数“mode_type”用于指定释放的类型。它可以是表示发布类型的字符串,例如“stable”、“beta”、“alpha”等。
:return: 包含有关发布的信息的字典。
"""
return {
"datetime": datetime.strptime(file_info["updated_at"], '%Y-%m-%dT%H:%M:%SZ').timestamp(),
"filename": name,
"id": file_info["id"],
"tag": tag,
"size": file_info["size"],
"url": file_info['browser_download_url'],
"version": release_name,
"desc": release_desc
"version": version,
"desc": desc,
"type": mode_type
}


# TODO
def generate_system_release_dict(file_info, release_name):
return {
"datetime": datetime.strptime(file_info["updated_at"], '%Y-%m-%dT%H:%M:%SZ').timestamp(),
"filename": file_info["name"],
"id": file_info["id"],
"tag": "Tong",
"size": file_info["size"],
"url": file_info['browser_download_url'],
"version": release_name
}
def generate_release_list(release_files, release_name, mode_type, device_name, release_desc):
"""
函数generate_release_list根据提供的发布文件、发布名称、模式类型、设备名称和发布描述生成发布信息列表。
:param release_files: 包含有关发布文件信息的字典列表。每个字典都应该有一个“name”键,其中包含发布文件的名称。
:param release_name: 发布的名称。
:param mode_type: `mode_type` 参数是一个字符串,指定释放模式的类型。它可以有两个可能的值:“kernel”或“system”。
:param device_name: “device_name”参数是为其生成发布列表的设备的名称。用于根据设备名称过滤发布文件。
:param release_desc: `release_desc` 参数是一个字符串,表示版本的描述或详细信息。它提供有关该版本的其他信息,例如新功能、错误修复或任何其他相关信息。
:return: 发布信息列表。
"""
if release_files is None:
return []

release_list = []
for file_info in release_files:
if mode_type == "kernel":
file_name = str(file_info["name"]).replace(".zip", "").split("_")[0]
device, tag = file_name.split("-")
if device == device_name:
release_list.append(generate_release_info(file_info, file_name, tag, release_name, release_desc, mode_type))
elif mode_type == "system":
file_name = str(file_info["name"]).replace(".zip", "").split("-")
name = "-".join(file_name[:2])
tag = file_name[3]
if file_name[4] == device_name:
release_list.append(generate_release_info(file_info, name, tag, file_name[2] + "@" + release_name, release_desc, mode_type))
return release_list


def get_repo_release_info(repo_owner, repo_name, mode_type, device_name):
"""
函数“get_repo_release_info”检索给定存储库、模式类型和设备名称的发布信息。
:param repo_owner: 存储库的所有者(例如 GitHub 上的用户名或组织名称)。
:param repo_name: `repo_name` 参数是存储库的名称。它是一个字符串,指定要从中获取发布信息的存储库的名称。
:param mode_type: `mode_type` 参数用于指定发布的模式。它可以是特定版本,例如“稳定”或“测试版”,也可以是该版本重点关注的特定特性或功能。
:param device_name: `device_name` 参数是您要检索其版本信息的设备的名称。
:return: 给定存储库、模式类型和设备名称的发布信息列表。
"""
releases = get_releases(repo_owner, repo_name)

download_list = []
release_list = []

if releases is not None:
for release in releases:
release_name = release['name']
release_files, release_desc = get_release_files(release)
download_list.extend(generate_release_dict(
release_files, release_name, mode_type, device_name, release_desc))
release_list.extend(generate_release_list(release_files, release_name, mode_type, device_name, release_desc))

return download_list
return release_list


def generate_save_path(mode_type, device_name):
def generate_save_path(device_name):
"""
该函数根据当前工作目录和设备名称生成 JSON 文件的保存路径。
:param device_name: device_name 参数是一个字符串,表示要为其生成保存路径的设备的名称。
:return: 基于设备名称的 JSON 文件的保存路径。
"""
root_dir = os.getcwd()
combine_path = os.path.join(root_dir, device_name)
os.makedirs(combine_path, exist_ok=True) # mkdir -p
combine_path = os.path.join(combine_path, mode_type + ".json")
return combine_path
save_path = os.path.join(root_dir, device_name + ".json")
return save_path


def generate(owner,repo,mode_type,device_name):
save_path = generate_save_path(mode_type, device_name)
download_list = get_repo_release_info(owner, repo, mode_type, device_name)
with open(save_path, "w", encoding='utf-8') as f:
json.dump(download_list, f, indent=2, sort_keys=True, ensure_ascii=False)

# `if __name__ == '__main__':` 块是一种常见的 Python 习惯用法,它允许脚本作为独立程序执行或作为模块导入。
if __name__ == '__main__':
# Opening JSON file
with open('sync.json',) as f:
with open('sync.json') as f:
sync_list = json.load(f)
for device,repo_list in sync_list.items():
# For kernel
if repo_list["kernel_repo"]:
owner, repo = repo_list["kernel_repo"].split('/')
generate(owner,repo,"kernel",device)
# For system
if repo_list["system_repo"]:
owner, repo = repo_list["system_repo"].split('/')
generate(owner,repo,"system",device)
for device, repo_list in sync_list.items():
release_list = []
if kernel_repo := repo_list.get("kernel_repo"):
owner, repo = kernel_repo.split('/')
release_list.extend(get_repo_release_info(owner, repo, "kernel", device))
if system_repo := repo_list.get("system_repo"):
owner, repo = system_repo.split('/')
release_list.extend(get_repo_release_info(owner, repo, "system", device))
save_path = generate_save_path(device)
with open(save_path, "w", encoding='utf-8') as f:
json.dump(release_list, f, indent=2, sort_keys=True, ensure_ascii=False)

0 comments on commit 0619f11

Please sign in to comment.