AnasSarkiz/magnetic-shutter-remote-r8

A USB‑C rechargeable battery-powered ESP32‑C3 wireless controller with Li‑ion charging, protected 3.3‑V buck‑boost regulation, thermal/safety monitoring, status LEDs, buttons, programming UART, crystal clock, and 2.4‑GHz antenna matching network.

Version
0.4.0-prototype
License
unset
Stars
0

scripts/fetch-qualified-datasheets.py

"""Save the manufacturer's PDF linked by the public assembly listing."""
import html
import pathlib
import re
import urllib.request

PARTS = {
    'C2941005': 'YIYUAN-YTSPS22E58LM',
    'C136720': 'Korean_HropartsElec-SK_12E12G5',
    'C720477': 'XUNPU-TS_1088_AR02016',
    'C2286': 'Hubei_KENTO_Elec-KT0603R',
    'C8545': 'Jiangsu_Changjing_Electronics_Technology-2N7002',
    'C22844': '0603WAF1621T5E',
    'C282505': 'CCTC-TCC0603COG470J500CT',
    'C14663': 'YAGEO-CC0603KRX7R9BB104',
}
for part_number, slug in PARTS.items():
    destination = pathlib.Path('references') / f'{part_number}-manufacturer.pdf'
    if destination.exists():
        print(part_number, 'already saved')
        continue
    page_url = f'https://jlcpcb.com/partdetail/{slug}/{part_number}'
    page = urllib.request.urlopen(page_url).read().decode()
    links = re.findall(r'https[^\s"<>]+\.pdf[^\s"<>]*', page)
    errors = []
    for link in dict.fromkeys(links):
        link = html.unescape(link).replace('\\u0026', '&').replace('\\/', '/')
        try:
            content = urllib.request.urlopen(link).read()
        except Exception as error:
            errors.append(str(error))
            continue
        if content.startswith(b'%PDF'):
            destination.write_bytes(content)
            print(part_number, len(content), page_url)
            break
    else:
        print(part_number, 'FAILED', errors)