Skip to main content

Lenovo LMSA ROM Downloader — download firmware from official Lenovo servers

Project description

lmsadwl

Download firmware from official Lenovo servers (LMSA / Software Fix API).

pip install lmsadwl

Commands

lmsadwl login                      # OAuth2 login via Lenovo Passport
lmsadwl login --url URL            # complete login with redirect URL
lmsadwl login --token TOKEN        # save token directly

lmsadwl lookup --sn HA1CQ8SV      # firmware by serial number
lmsadwl lookup --imei 123456789012345 [--model-code X] [--ro-carrier Y]

lmsadwl search --model x606       # search ROMs by keyword
lmsadwl download --model TB-X606X [-o ./download]
lmsadwl batch --model x606 --limit 5

lmsadwl models [-f moto] [-r]     # list supported devices
lmsadwl device                    # show ADB device info
lmsadwl auto                      # detect device + find firmware
lmsadwl status                    # token info and expiry
lmsadwl shell                     # interactive menu

Python API

from lmsadwl import LMSAClient

client = LMSAClient()

# login
url, state = client.login_interactive()
print(url)
redirect = input("Paste redirect URL: ")
client.login_with_url(redirect)

# search
roms = client.search_roms("x606")
for rom in roms:
    print(rom.name, rom.uri)

# lookup by serial
result = client.lookup_by_sn("HA1CQ8SV")
if result.found:
    print(result.roms[0].name, result.roms[0].uri)

# auto-detect (requires adb)
device, roms = client.auto_detect()
if device:
    print(device.title, device.serial)

# models
models = client.get_models(keyword="moto", read_only=True)
for m in models:
    print(m.model_name, m.market_name)

# IMEI lookup
result = client.lookup_by_imei("123456789012345")

Auto-relogin

def relogin():
    url, _ = client.login_interactive()
    print(f"Open: {url}")
    redirect = input("Paste URL: ")
    return client.login_with_url(redirect)

client.set_relogin_callback(relogin)
# API calls will auto-relogin on 403/408/402

Models

from lmsadwl import LMSAClient, TokenManager, OAuth2Flow
from lmsadwl import DeviceInfo, ROMInfo
from lmsadwl import is_valid_sn, is_valid_imei
from lmsadwl import parse_jwt, jwt_is_expired, jwt_time_left

LMSAClient(token_dir=None, auto_relogin=True, max_retries=2)

Method Returns
login_interactive() (url, state)
login_with_url(redirect_url) bool
login_with_token(token) None
ensure_auth() str (token)
set_relogin_callback(fn) None
get_rom_list() list[ROMInfo]
search_roms(keyword) list[ROMInfo]
get_models(keyword="", read_only=False) list[ModelInfo]
lookup_by_sn(sn) LookupResult
lookup_by_imei(imei, model_code=None, carrier=None) LookupResult
auto_detect() (DeviceInfo, list[ROMInfo])
get_rom_match(model_name) dict | None

ROMInfo

Field Type
name str
uri str
md5 str
rom_type int
publish_date str
flash_flow str
rom_match_id str

LookupResult

Property Type
found bool
rescue_available bool
roms list[ROMInfo]
code str
desc str

ModelInfo

Field Type
category str
brand str
model_name str
market_name str
platform str
read_support bool

DeviceInfo

Field Type
serial str
model str
brand str
fingerprint str
incremental str
title str (property)

Utils

is_valid_sn(sn)          # bool — 8 alphanumeric chars, no I/O/L
is_valid_imei(imei)      # bool — 14-15 digits
parse_jwt(token)         # dict | None — decode JWT payload
jwt_is_expired(token, margin=300)  # bool
jwt_time_left(token)     # float — seconds until expiry

Token

Stored in ~/.lmsadwl/token.json. Auto-refreshes on API errors. Migrates from .lmsa_tokens.json.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lmsadwl-1.0.1.tar.gz (18.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lmsadwl-1.0.1-py3-none-any.whl (19.1 kB view details)

Uploaded Python 3

File details

Details for the file lmsadwl-1.0.1.tar.gz.

File metadata

  • Download URL: lmsadwl-1.0.1.tar.gz
  • Upload date:
  • Size: 18.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for lmsadwl-1.0.1.tar.gz
Algorithm Hash digest
SHA256 7265509f4a7135a45acbf6fef7ddbc70c99ae253758a12c57445126ee4ea8492
MD5 289f7c7efba432ce549a3fcf5f48203e
BLAKE2b-256 45b17b95a620fa82b75060ce1375ab14e1410761ca3dcce91abb086d6e614707

See more details on using hashes here.

File details

Details for the file lmsadwl-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: lmsadwl-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 19.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for lmsadwl-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 801015ba1b26adb8e74e28f76252ce9e056e19dd1d57deacba9e9edd2d5e288f
MD5 7cd643a683abcd304d149605b0a61cbc
BLAKE2b-256 0721080b47e126088fa97be7b07a167963bacd54eee15b407aa382f0080efd9c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page