├── devices.json ├── gen_mirror_json.py └── lineage-build-targets /devices.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "model": "cupid", "oem": "Xiaomi", "name": "12" }, 3 | { "model": "diting", "oem": "Xiaomi", "name": "12T Pro / Redmi K50 Ultra" }, 4 | { "model": "dizi", "oem": "Xiaomi", "name": "Poco Pad / Redmi Pad Pro" }, 5 | { "model": "garnet", "oem": "Xiaomi", "name": "Redmi Note 13 Pro" }, 6 | { "model": "ingres", "oem": "Xiaomi", "name": "POCO F4 GT / Redmi K50 Gaming" }, 7 | { "model": "katyusha", "oem": "Xiaomi", "name": "Black Shark 5 Pro" }, 8 | { "model": "liuqin", "oem": "Xiaomi", "name": "Pad 6 Pro" }, 9 | { "model": "marble", "oem": "Xiaomi", "name": "POCO F5 / Redmi Note 12 Turbo" }, 10 | { "model": "mayfly", "oem": "Xiaomi", "name": "12S" }, 11 | { "model": "mondrian", "oem": "Xiaomi", "name": "POCO F5 Pro / Redmi K60" }, 12 | { "model": "thor", "oem": "Xiaomi", "name": "12S Ultra" }, 13 | { "model": "unicorn", "oem": "Xiaomi", "name": "12S Pro" }, 14 | { "model": "yudi", "oem": "Xiaomi", "name": "Pad 6 Max 14" }, 15 | { "model": "zeus", "oem": "Xiaomi", "name": "12 Pro" }, 16 | { "model": "ziyi", "oem": "Xiaomi", "name": "13 Lite / Civi 2" }, 17 | { "model": "zizhan", "oem": "Xiaomi", "name": "MIX Fold 2" } 18 | ] 19 | -------------------------------------------------------------------------------- /gen_mirror_json.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import hashlib 3 | import json 4 | import os 5 | import shutil 6 | import sys 7 | import zipfile 8 | 9 | from collections import defaultdict 10 | from datetime import datetime 11 | from time import mktime 12 | 13 | if len(sys.argv) < 2: 14 | print("usage python {} /path/to/mirror/base/url".format(sys.argv[0])) 15 | sys.exit() 16 | 17 | FILE_BASE = sys.argv[1] 18 | BUILDS = defaultdict(lambda: []) 19 | 20 | # We serve only full OTAs for now 21 | PREFIX = "full" 22 | # Amount of builds to keep per device 23 | BUILDS_TO_KEEP = 3 24 | 25 | DEVICES = os.listdir(os.path.join(FILE_BASE, PREFIX)) 26 | 27 | for device in DEVICES: 28 | # Each device directory contains a directory with a build date 29 | # Let's delete extraneous builds (i.e. old ones). 30 | builds = os.listdir(os.path.join(FILE_BASE, PREFIX, device)) 31 | # Sorting them like this allows us to have the newer builds last 32 | to_keep = sorted(builds)[-BUILDS_TO_KEEP:] 33 | to_delete = sorted(builds)[::-1][BUILDS_TO_KEEP:] 34 | 35 | for directory in to_delete: 36 | shutil.rmtree(os.path.join(FILE_BASE, PREFIX, device, directory), ignore_errors=True) 37 | 38 | for build in to_keep: 39 | build_dir = os.path.join(FILE_BASE, PREFIX, device, build) 40 | files = os.listdir(build_dir) 41 | otapackage = next(file for file in files if file.endswith('.zip')) 42 | extra_imgs = [file for file in files if file.endswith('.img')] 43 | _, version, builddate, buildtype, device = os.path.splitext(otapackage)[0].split('-') 44 | 45 | files = [] 46 | for file in (otapackage, *extra_imgs): 47 | file_path = os.path.join(build_dir, file) 48 | with open(file_path, "rb") as f: 49 | sha256 = hashlib.sha256() 50 | sha1 = hashlib.sha1() 51 | for buf in iter(lambda : f.read(128 * 1024), b''): 52 | sha256.update(buf) 53 | sha1.update(buf) 54 | size = os.path.getsize(file_path) 55 | 56 | files.append({ 57 | 'filename': file, 58 | 'filepath': os.path.join('/', PREFIX, device, build, file), 59 | 'sha1': sha1.hexdigest(), 60 | 'sha256': sha256.hexdigest(), 61 | 'size': size 62 | }) 63 | 64 | with open(os.path.join(build_dir, "metadata.json")) as build_metadata_file: 65 | build_metadata = json.load(build_metadata_file) 66 | 67 | BUILDS[device].append({ 68 | 'date': '{}-{}-{}'.format(builddate[0:4], builddate[4:6], builddate[6:8]), 69 | 'datetime': build_metadata['timestamp'], 70 | 'files': files, 71 | 'os_patch_level': build_metadata['os_patch_level'], 72 | 'type': buildtype.lower(), 73 | 'version': version 74 | }) 75 | 76 | print(json.dumps(BUILDS, indent=4)) 77 | -------------------------------------------------------------------------------- /lineage-build-targets: -------------------------------------------------------------------------------- 1 | # LineageOS build target list 2 | # 3 | 4 | # Weekly 23.0 5 | cupid userdebug lineage-23.0 W 6 | diting userdebug lineage-23.0 W 7 | marble userdebug lineage-23.0 W 8 | mayfly userdebug lineage-23.0 W 9 | mondrian userdebug lineage-23.0 W 10 | thor userdebug lineage-23.0 W 11 | unicorn userdebug lineage-23.0 W 12 | zeus userdebug lineage-23.0 W 13 | #ziyi userdebug lineage-23.0 W 14 | zizhan userdebug lineage-23.0 W 15 | --------------------------------------------------------------------------------