Compare commits

...

5 Commits

Author SHA1 Message Date
alexei.dolgolyov c2c9af3c60 chore: release v0.4.1
Build Release / create-release (push) Successful in 4s
Build Android APK / build-android (push) Failing after 1m41s
Build Release / build-linux (push) Successful in 3m3s
Build Release / build-docker (push) Successful in 4m13s
Lint & Test / test (push) Successful in 5m24s
Build Release / build-windows (push) Successful in 5m33s
2026-04-22 19:21:27 +03:00
alexei.dolgolyov 4f7794ccd4 fix(installer): bundle cryptography + just-playback, set TCL env, clean stale debug.bat
Lint & Test / test (push) Successful in 2m20s
Windows installer silently failed to launch because build-dist-windows.sh
maintained its own DEPS list that drifted from server/pyproject.toml and
was missing `cryptography` — ledgrab.utils.secret_box imports AESGCM at
module load, so pythonw.exe crashed before the tray icon appeared. Also
missing: just-playback (lazy import, silent until a sound triggers).

- Add cryptography + just-playback to DEPS with a sync-with-pyproject
  warning comment
- Extend the post-cleanup on-disk check to abort the build if
  cryptography / cffi / just_playback go missing again
- Launcher now exports TCL_LIBRARY / TK_LIBRARY so the screen-overlay
  tkinter thread stops logging "Can't find init.tcl" at startup
- Installer wipes stale debug.bat / debug.log on install and uninstall
  (leftovers from the pre-rename wled_controller era produced a
  misleading ModuleNotFoundError when users tried to diagnose launch
  failures)
2026-04-22 19:19:07 +03:00
alexei.dolgolyov a0d63a3663 docs(release): drop stale WLED-rename task, document android signing secrets
Lint & Test / test (push) Successful in 2m1s
- Remove the top-of-file "IMPORTANT: Remove WLED naming throughout the
  app" checklist. The effort was absorbed by the multi-backend refactor
  (BLE / USB-serial / ESP-NOW / MQTT / OpenRGB providers all shipped),
  and the remaining user-facing copy has been swept in separate commits.
- Add an "Android Signing Secrets (Gitea)" section covering the four
  secrets the release APK CI expects, the one-off `keytool` command to
  generate `release.jks`, the consequences of losing the keystore, and
  a checklist of the remaining setup steps before tagging v0.4.1.
2026-04-21 20:01:26 +03:00
alexei.dolgolyov 35b75a2ed8 ci(android): fix keystore env scoping, fail loudly on release without key
Lint & Test / test (push) Successful in 3m17s
Primary bug — step-level env is not visible in that same step's `if:`
expression. `Decode signing keystore` had
  if: env.ANDROID_KEYSTORE_BASE64 != ''
  env:
    ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
so the env context seen by the `if:` evaluator was empty regardless of
whether the secret was configured. The step was skipped, keystore.present
never became 'true', and every release tag silently fell back to
assembleDebug. Result: APKs named `LedGrab-0.4.0-android-debug.apk` that
can't upgrade a previously-release-signed install (signature mismatch).

Fix — move ANDROID_KEYSTORE_BASE64 to the job-level env block. It's now
resolvable in the if-expression of any step in the job, and the shell
inherits it exactly the same way as before.

Secondary — add a "Guard release tag against missing keystore" step that
fires between the decode attempt and the gradle build. If is_release=true
but keystore.present!='true', the job fails with a clear error directing
the operator to configure the four signing secrets. Previously a
misconfigured Gitea silently shipped debug APKs labeled as releases.
2026-04-21 19:55:55 +03:00
alexei.dolgolyov 4ed099d564 docs(release): drop WLED-specific language from auto-generated release notes
The "discover your WLED devices" line predates BLE / USB-serial / ESP-NOW /
MQTT / OpenRGB support and misrepresents what the app does. Replaced with
a generic "add your LED devices" — the device-add UI lists what's actually
supported, and INSTALLATION.md carries the long-form detail.
2026-04-21 19:55:55 +03:00
9 changed files with 112 additions and 111 deletions
+17 -3
View File
@@ -23,6 +23,12 @@ jobs:
ANDROID_SDK_PLATFORM: 'android-34'
ANDROID_BUILD_TOOLS: '34.0.0'
ANDROID_NDK_VERSION: '26.1.10909125'
# Surfaced at job level (not step level) so the `if: env.X != ''`
# check on the Decode step actually sees it — step-level env is
# NOT available in that step's own `if:` expression, which
# silently skipped the decode and produced debug-signed release
# APKs until it was noticed.
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -108,15 +114,23 @@ jobs:
- name: Decode signing keystore
id: keystore
if: ${{ env.ANDROID_KEYSTORE_BASE64 != '' }}
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
if: env.ANDROID_KEYSTORE_BASE64 != ''
run: |
set -euo pipefail
mkdir -p android/keystore
echo "$ANDROID_KEYSTORE_BASE64" | base64 -d > android/keystore/release.jks
echo "path=$(pwd)/android/keystore/release.jks" >> "$GITHUB_OUTPUT"
echo "present=true" >> "$GITHUB_OUTPUT"
- name: Guard release tag against missing keystore
# Release tags MUST produce a release-signed APK, otherwise existing
# installs can't upgrade (signature mismatch). Fail loudly instead
# of silently falling back to the debug signing config.
if: ${{ steps.label.outputs.is_release == 'true' && steps.keystore.outputs.present != 'true' }}
run: |
echo "::error::Release tag ${{ gitea.ref_name }} requires ANDROID_KEYSTORE_BASE64 (plus KEYSTORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD) to be configured in Gitea → Settings → Secrets."
exit 1
- name: Build APK
working-directory: android
env:
+3 -3
View File
@@ -90,9 +90,9 @@ jobs:
### First-time setup
1. Change the default API key in config/default_config.yaml
2. Open http://localhost:8080 and discover your WLED devices
3. See INSTALLATION.md for detailed configuration
1. Change the default API key in `config/default_config.yaml`.
2. Open http://localhost:8080 and add your LED devices.
3. See `INSTALLATION.md` for detailed configuration.
''').strip())
print(json.dumps('\n\n'.join(sections)))
+14 -89
View File
@@ -1,104 +1,29 @@
# v0.4.0 (2026-04-21)
## v0.4.1 (2026-04-22)
This release introduces a full **Android TV app** that embeds the Python server via Chaquopy, with boot-time autostart, root-based screen capture, and a watchdog. New device support includes **BLE LED controllers** (SP110E, Triones, Zengge, Govee), **Android USB-serial** Adalight/AmbiLED controllers, and a **Group** device type for combining multiple devices. Metrics now include battery and thermal-zone readings with a dashboard temperature chart. Devices get a new per-provider typed configuration model, and the project has been renamed from `led-grab` to **LedGrab** with the Home Assistant integration split into a separate repository.
## Features
### Android TV App
- Android TV app embedding Python server via Chaquopy ([8574424](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/8574424))
- Boot-time autostart, capture watchdog, versionCode derived from git ([b3775b2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/b3775b2))
- Root-based screen capture bypassing MediaProjection ([5fcb9f8](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/5fcb9f8))
### Devices
- BLE LED controller support — SP110E, Triones, Zengge, Govee ([2b5dac2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/2b5dac2))
- Android USB-serial support for Adalight/AmbiLED controllers ([7fcb8dd](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/7fcb8dd))
- **Group** device type for combining multiple devices ([4940007](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4940007))
- Per-provider typed device configs (phases 14) ([d3a6416](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/d3a6416))
### Metrics
- Battery + thermal-zone readings with dashboard temperature chart ([ecae05d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/ecae05d))
### Sources
- Support nesting for composite color strip sources ([cc9900d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/cc9900d))
### Project
- Rename project to **LedGrab**; split Home Assistant integration into a separate repository ([02cd9d5](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/02cd9d5))
## Bug Fixes
- SP110E vendor handshake + Windows/bleak robustness ([45f93fd](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/45f93fd))
- Coerce `BindableFloat` fps to int when snapshotting scenes ([580bd69](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/580bd69))
- Add `autocomplete` attributes to credential inputs ([488df98](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/488df98))
- Register pattern-templates API route; responsive toolbar overflow menu ([38f73ba](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/38f73ba))
- HA Light Target cards no longer flicker on every poll cycle ([83ceaed](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/83ceaed))
- `EntitySelect` now shows the selected value in weather/processed CSS editors ([d3cd48e](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/d3cd48e))
- Bundle `bettercam`/`dxcam`/`windows-capture` in the Windows installer ([92585e7](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/92585e7))
- Launcher: set `TCL_LIBRARY`/`TK_LIBRARY` for embedded Python ([0e09eaf](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/0e09eaf))
- Comprehensive security, stability, and code quality audit ([123da1b](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/123da1b))
### Bug Fixes
- Installer now bundles `cryptography` and `just-playback`, sets the `TCL` environment for Tk, and removes the stale `debug.bat` shim ([4f7794c](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4f7794c))
---
## Development / Internal
### Development / Internal
### CI/Build
#### CI/Build
- Scope the Android keystore env correctly and fail loudly when a release build is attempted without a signing key ([35b75a2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/35b75a2))
- Android multi-ABI APK pipeline + `pydantic-core` wheel rebuild ([151cea3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/151cea3))
- Add Android APK row to release downloads table ([2477e00](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/2477e00))
- Decouple Android release attach; add `workflow_dispatch` to `release.yml` ([524e422](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/524e422))
- Android: fix wheels find-links URL on Linux CI ([5d6310f](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/5d6310f))
- Android: fix missing python symlink parent; restrict to release tags ([7ef17c1](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/7ef17c1))
### Refactoring
- Route ESP-NOW client through `SerialTransport` ([928d626](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/928d626))
- `MetricsProvider` abstraction with Android `/proc` backend ([546b24d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/546b24d))
- Move build scripts to `build/` directory ([a0b65e3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/a0b65e3))
### Documentation
- Update TODO and frontend context docs ([e678e55](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/e678e55))
#### Documentation
- Drop the stale WLED-rename task and document the Android signing secrets ([a0d63a3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/a0d63a3))
- Remove WLED-specific language from the auto-generated release notes template ([4ed099d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4ed099d))
---
<!-- markdownlint-disable MD033 -->
<details>
<summary>All Commits</summary>
| Hash | Message | Author |
| ---- | ------- | ------ |
| [524e422](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/524e422) | ci: decouple android release attach, add workflow_dispatch to release.yml | alexei.dolgolyov |
| [5d6310f](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/5d6310f) | fix(android): make wheels find-links URL work on Linux CI | alexei.dolgolyov |
| [7ef17c1](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/7ef17c1) | ci(android): fix missing python symlink parent, restrict to release tags | alexei.dolgolyov |
| [b3775b2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/b3775b2) | feat(android): boot-time autostart, capture watchdog, versionCode from git | alexei.dolgolyov |
| [45f93fd](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/45f93fd) | fix(devices): SP110E vendor handshake + Windows/bleak robustness | alexei.dolgolyov |
| [2b5dac2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/2b5dac2) | feat(devices): BLE LED controller support (SP110E/Triones/Zengge/Govee) | alexei.dolgolyov |
| [d3a6416](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/d3a6416) | refactor(devices): per-provider typed configs (phases 1-4) | alexei.dolgolyov |
| [123da1b](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/123da1b) | fix: comprehensive security, stability, and code quality audit | alexei.dolgolyov |
| [5fcb9f8](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/5fcb9f8) | feat(android): root-based screen capture bypassing MediaProjection | alexei.dolgolyov |
| [928d626](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/928d626) | refactor(devices): route ESP-NOW client through SerialTransport | alexei.dolgolyov |
| [580bd69](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/580bd69) | fix(scenes): coerce BindableFloat fps to int when snapshotting | alexei.dolgolyov |
| [7fcb8dd](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/7fcb8dd) | feat(devices): Android USB-serial support for Adalight/AmbiLED controllers | alexei.dolgolyov |
| [ecae05d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/ecae05d) | feat(metrics): battery + thermal-zone readings with dashboard temp chart | alexei.dolgolyov |
| [546b24d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/546b24d) | refactor(metrics): MetricsProvider abstraction with Android /proc backend | alexei.dolgolyov |
| [488df98](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/488df98) | fix(frontend): add autocomplete attrs to credential inputs | alexei.dolgolyov |
| [2477e00](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/2477e00) | ci: add Android APK row to release downloads table | alexei.dolgolyov |
| [151cea3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/151cea3) | ci: Android multi-ABI APK pipeline + pydantic-core wheel rebuild | alexei.dolgolyov |
| [8574424](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/8574424) | feat: Android TV app embedding Python server via Chaquopy | alexei.dolgolyov |
| [a0b65e3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/a0b65e3) | refactor: move build scripts to build/ directory | alexei.dolgolyov |
| [02cd9d5](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/02cd9d5) | refactor: rename project to LedGrab, split HA integration into separate repo | alexei.dolgolyov |
| [38f73ba](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/38f73ba) | fix: register pattern-templates API route; add responsive toolbar overflow menu | alexei.dolgolyov |
| [e678e55](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/e678e55) | docs: update TODO and frontend context docs | alexei.dolgolyov |
| [83ceaed](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/83ceaed) | fix: HA Light Target cards flickering on every poll cycle | alexei.dolgolyov |
| [d3cd48e](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/d3cd48e) | fix: EntitySelect not showing selected value in weather/processed CSS editors | alexei.dolgolyov |
| [cc9900d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/cc9900d) | feat: support nesting for composite color strip sources | alexei.dolgolyov |
| [4940007](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4940007) | feat: add Group device type for combining multiple devices | alexei.dolgolyov |
| [92585e7](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/92585e7) | fix(build): bundle bettercam/dxcam/windows-capture in installer | alexei.dolgolyov |
| [0e09eaf](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/0e09eaf) | fix(launcher): set TCL_LIBRARY/TK_LIBRARY for embedded Python | alexei.dolgolyov |
|------|---------|--------|
| [4f7794c](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4f7794c) | fix(installer): bundle cryptography + just-playback, set TCL env, clean stale debug.bat | alexei.dolgolyov |
| [a0d63a3](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/a0d63a3) | docs(release): drop stale WLED-rename task, document android signing secrets | alexei.dolgolyov |
| [35b75a2](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/35b75a2) | ci(android): fix keystore env scoping, fail loudly on release without key | alexei.dolgolyov |
| [4ed099d](https://git.dolgolyov-family.by/alexei.dolgolyov/ledgrab/commit/4ed099d) | docs(release): drop WLED-specific language from auto-generated release notes | alexei.dolgolyov |
</details>
<!-- markdownlint-enable MD033 -->
+45 -11
View File
@@ -1,16 +1,5 @@
# TODO
## IMPORTANT: Remove WLED naming throughout the app
- [ ] Rename all references to "WLED" in user-facing strings, class names, module names, config keys, file paths, and documentation
- [ ] The app is **LedGrab** — not tied to WLED specifically. WLED is just one of many supported output protocols
- [ ] Audit: i18n keys, page titles, tray labels, installer text, pyproject.toml description, README, CLAUDE.md, context files, API docs
- [ ] Rename `ledgrab` package → decide on new package name (e.g. `ledgrab`)
- [ ] Update import paths, entry points, config references, build scripts, Docker, CI/CD
- [ ] **Migration required** if renaming storage paths or config keys (see data migration policy in CLAUDE.md)
---
## Donation / Open-Source Banner
- [x] Add a persistent but dismissible banner or notification in the dashboard UI informing users that the project is open-source and under active development, and that donations are highly appreciated
@@ -18,3 +7,48 @@
- [x] Remember dismissal in localStorage so it doesn't reappear every session
- [x] Add i18n keys for the banner text (`en.json`, `ru.json`, `zh.json`)
- [ ] Configure `DONATE_URL` and `REPO_URL` constants in `donation.ts` once platform is chosen
## Android Signing Secrets (Gitea)
The CI workflow `build-android.yml` produces a signed release APK **only** when all four secrets below are configured in Gitea → Settings → Secrets. When any one is missing, the "Guard release tag against missing keystore" step hard-fails a `v*` tag build — previously we silently shipped a debug-signed APK labeled as release.
| Secret | Contents |
| --- | --- |
| `ANDROID_KEYSTORE_BASE64` | Output of `base64 -w0 release.jks` — the whole keystore as one line |
| `ANDROID_KEYSTORE_PASSWORD` | Keystore password (the `-storepass` passed to `keytool`) |
| `ANDROID_KEY_ALIAS` | Key alias (e.g. `ledgrab-release`) |
| `ANDROID_KEY_PASSWORD` | Key password (can be the same as keystore password) |
### Generate the keystore (one-time, ~2 min)
```bash
keytool -genkeypair -v \
-storetype JKS \
-keystore release.jks \
-alias ledgrab-release \
-keyalg RSA -keysize 4096 \
-validity 9125 \
-dname "CN=LedGrab, O=Dolgolyov, C=BY"
base64 -w0 release.jks > release.jks.b64 # Linux / Git Bash
# Windows alternative:
# certutil -encode release.jks release.jks.b64
# (strip the -----BEGIN/END CERTIFICATE----- header/footer lines)
```
### Critical — back up `release.jks` outside the repo
- 1Password attachment, encrypted USB stick, or printed hex + password written down somewhere physical.
- Losing the keystore = every existing sideloaded install is permanently unable to upgrade. The only workaround is uninstall-then-reinstall, which wipes user data.
- The `release.jks` file itself must **never** be committed to git. Only the base64 string lives in Gitea secrets.
### Why it matters even without Play Store
Android's package manager refuses to install an upgrade whose signature differs from the currently-installed APK's signature — enforced by the OS, not Play. So once users install a build signed by key X, every future build they can upgrade to must also be signed by key X.
### Current state
- [ ] Generate `release.jks` with `keytool` (above) and back it up
- [ ] Upload the four secrets to Gitea
- [ ] Tag a throwaway `v0.4.1-test` to verify signed release APK is produced (then delete the tag + release)
- [ ] Note: any existing `v0.4.0` debug-signed install cannot upgrade to a release-signed v0.4.1 — users must uninstall first
+1 -1
View File
@@ -40,7 +40,7 @@ android {
// in CI). See ledgrabVersionCode above. Was stuck at 1 before —
// sideload updates silently refused to install.
versionCode = ledgrabVersionCode
versionName = "0.4.0"
versionName = "0.4.1"
ndk {
// All three ABIs: arm64-v8a (real TV hardware), x86_64 (modern
+17 -3
View File
@@ -178,10 +178,16 @@ echo "[6/9] Downloading Windows dependencies..."
WHEEL_DIR="$BUILD_DIR/win-wheels"
mkdir -p "$WHEEL_DIR"
# Core dependencies (cross-platform, should have win_amd64 wheels)
# Core dependencies (cross-platform, should have win_amd64 wheels).
# KEEP IN SYNC with server/pyproject.toml [project.dependencies] — this
# list duplicates it because cross-build on Linux can't invoke `pip install
# <path>` against pyproject.toml with a Windows target. Missing entries
# ship a broken installer that silently fails under pythonw.exe (no
# traceback visible to the user). Audit after every pyproject.toml edit.
DEPS=(
"fastapi>=0.115.0"
"uvicorn[standard]>=0.32.0"
"cryptography>=42.0.0"
"httpx>=0.27.2"
"mss>=9.0.2"
"numpy>=2.1.3"
@@ -201,6 +207,7 @@ DEPS=(
"aiomqtt>=2.0.0"
"openrgb-python>=0.2.15"
"opencv-python-headless>=4.8.0"
"just-playback>=0.1.7"
)
# Windows-only deps
@@ -291,9 +298,10 @@ compile_and_strip_sources "$SITE_PACKAGES" "python"
echo " Verifying required submodules exist after cleanup..."
for required in \
"numpy/linalg" "numpy/lib" "numpy/matrixlib" "numpy/ma" \
"zeroconf/_services"; do
"zeroconf/_services" \
"cryptography" "cffi" "just_playback"; do
if [ ! -d "$SITE_PACKAGES/$required" ] && [ ! -f "$SITE_PACKAGES/$required.py" ] && [ ! -f "$SITE_PACKAGES/$required.pyc" ]; then
echo " ERROR: $required missing from site-packages — cleanup_site_packages removed something required. Aborting."
echo " ERROR: $required missing from site-packages — either cleanup_site_packages removed something required, or DEPS is out of sync with pyproject.toml. Aborting."
exit 1
fi
done
@@ -328,6 +336,12 @@ cd /d "%~dp0"
set PYTHONPATH=%~dp0app\src
set LEDGRAB_CONFIG_PATH=%~dp0app\config\default_config.yaml
:: Tcl/Tk ship under python\ but Tk's default search path is
:: <python.exe>\..\lib\tcl8.6. Point it at the right location so
:: the screen-overlay feature (tkinter) can start without errors.
set TCL_LIBRARY=%~dp0python\tcl8.6
set TK_LIBRARY=%~dp0python\tk8.6
:: Create data directory if missing
if not exist "%~dp0data" mkdir "%~dp0data"
if not exist "%~dp0logs" mkdir "%~dp0logs"
+6
View File
@@ -208,6 +208,12 @@ cd /d "%~dp0"
set PYTHONPATH=%~dp0app\src
set LEDGRAB_CONFIG_PATH=%~dp0app\config\default_config.yaml
:: Tcl/Tk ship under python\ but Tk's default search path is
:: <python.exe>\..\lib\tcl8.6. Point it at the right location so
:: the screen-overlay feature (tkinter) can start without errors.
set TCL_LIBRARY=%~dp0python\tcl8.6
set TK_LIBRARY=%~dp0python\tk8.6
:: Create data directory if missing
if not exist "%~dp0data" mkdir "%~dp0data"
if not exist "%~dp0logs" mkdir "%~dp0logs"
+8
View File
@@ -98,6 +98,12 @@ Section "!${APPNAME} (required)" SecCore
RMDir /r "$INSTDIR\app"
RMDir /r "$INSTDIR\scripts"
Delete "$INSTDIR\LedGrab.bat"
; Legacy leftovers from the wled_controller-era install. The current
; build does not ship debug.bat, but upgrades from older versions left
; one behind with a stale `-m wled_controller` command that gives a
; misleading ModuleNotFoundError when run. Remove it on upgrade.
Delete "$INSTDIR\debug.bat"
Delete "$INSTDIR\debug.log"
; Copy the entire portable build
File /r "LedGrab\python"
@@ -187,6 +193,8 @@ Section "Uninstall"
RMDir /r "$INSTDIR\app"
RMDir /r "$INSTDIR\scripts"
Delete "$INSTDIR\LedGrab.bat"
Delete "$INSTDIR\debug.bat"
Delete "$INSTDIR\debug.log"
Delete "$INSTDIR\uninstall.exe"
; Remove logs (but keep data/)
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "ledgrab"
version = "0.4.0"
version = "0.4.1"
description = "Ambient lighting system that captures screen content and drives LED strips in real time"
authors = [
{name = "Alexei Dolgolyov", email = "dolgolyov.alexei@gmail.com"}