20 Commits

Author SHA1 Message Date
3f30621630 feat(assets): probe-first resolver + SPOT for IMAGE_NAME/PORT + README screenshot
Probe-first asset resolution (regression fix)
---------------------------------------------

cache_manager.cache_file() returned either a relative cache path
(success) or None (failure). The previous app.py fallback
asset['cache'] = cached or asset['source'] mixed both types into
one field, which the template wrapped in url_for('static', ...)
regardless — producing broken
/static/https://file.infinito.nexus/.../logo.png URLs whenever the
source couldn't be downloaded.

- New app/utils/asset_resolver.py: HEAD-probes the URL (3 s
  timeout, image/* content type). On hit, embed directly via a
  new external_url field — no download required. On miss, fall
  back to cache_manager.cache_file. If that also fails, expose
  the source URL via external_url so the browser shows the alt
  text instead of an empty src.
- app.py exposes an asset_src(asset) context processor that
  picks external_url first, then url_for('static', cache),
  so the template never wraps an absolute URL in a static prefix.
- Templates (base, navigation, card) switch to asset_src(...) and
  gate the card image branch on cache or external_url.
- 16 unit tests cover every probe/cache/fallback branch; one live
  integration test exercises the canonical
  https://file.infinito.nexus/assets/img/logo.png to prove the
  probe-first path works end-to-end (cache dir stays empty).
- config.sample.yaml: new Infinito.Nexus card driven by the same
  canonical asset URL.

Single source of truth for IMAGE_NAME and PORT
----------------------------------------------

- env.example is now the only place the literal values live.
- Makefile and docker-compose.yml reference \$(IMAGE_NAME) /
  \${IMAGE_NAME:?…} (same for PORT); no defaults, no silent
  fallbacks.
- New make env / make config bootstrap .env / app/config.yaml
  from their checked-in templates. Idempotent.
- All container-using targets depend on the two bootstrap targets
  so a fresh checkout runs in a single invocation.
- Recipes source .env at recipe-execution time so they pick up a
  freshly bootstrapped .env in the same make invocation.

README
------

- Screenshot added under the title.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 12:19:15 +02:00
252b50d2a7 feat: migrate to pyproject.toml, add test suites, split CI workflows
- Replace requirements.txt with pyproject.toml for modern Python packaging
- Add unit, integration, lint and security test suites under tests/
- Add utils/export_runtime_requirements.py and utils/check_hadolint_sarif.py
- Split monolithic CI into reusable lint.yml, security.yml and tests.yml
- Refactor ci.yml to orchestrate reusable workflows; publish on semver tag only
- Modernize Dockerfile: pin python:3.12-slim, install via pyproject.toml
- Expand Makefile with lint, security, test and CI targets
- Add test-e2e via act with portfolio container stop/start around run
- Fix navbar_logo_visibility.spec.js: win.fullscreen() → win.enterFullscreen()
- Set use_reloader=False in app.run() to prevent double-start in CI
- Add app/core.* and build artifacts to .gitignore
- Fix apt-get → sudo apt-get in tests.yml e2e job
- Fix pip install --ignore-installed to handle stale act cache

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 23:03:09 +02:00
a47a5babce chore: remove unused imports 2026-03-28 19:08:57 +01:00
430ea4a120 Solved loading bug 2025-07-07 13:19:49 +02:00
9ada9acb3a Implemented SVG handling 2025-07-07 12:40:25 +02:00
a0c7a7e8ca Added exception for debugging 2025-04-10 14:01:53 +02:00
ae775916b0 Replaced German by English comments 2025-03-18 14:27:07 +01:00
45969feaed Refactored card logic 2025-03-18 14:10:30 +01:00
e03e740149 Solved bug 2025-01-17 10:56:45 +01:00
dc11dc799b Optimized path mapping 2025-01-17 02:14:48 +01:00
ef0d98cdd1 Optimized video channels 2025-01-15 02:49:10 +01:00
8ad3ca54cc Optimized language credentials 2025-01-15 02:08:49 +01:00
9ff356ba70 Refactored code and implemented new childrens loading 2025-01-15 01:35:50 +01:00
ced25bdf3b Refactored to accounts 2025-01-10 14:17:26 +01:00
28cd3e1f2f Solved link bug with subitems 2025-01-10 13:56:37 +01:00
bbc9abc7b9 Pulled app/utils/cache_manager.py 2025-01-10 11:48:09 +01:00
d8ec067675 Refactored App.py 2025-01-09 14:27:07 +01:00
c87c1df10a Finished implementation of configuration resolver 2025-01-09 14:20:59 +01:00
8fb0cecfbe Added detailled debug infos 2025-01-09 13:56:29 +01:00
61af45e837 Added conf resv base 2025-01-09 13:53:56 +01:00