Three fixes: (1) check_ffmpeg() was called at import time causing startup crash if FFmpeg not installed; moved to lazy _ensure_ffmpeg() on first use. (2) _workflows_cache was never populated so filesystem was rescanned on every call; now caches after first scan. (3) list_tasks() was reading every metadata.json individually; now uses the existing index for O(1) performance.
Streamlit/Tornado switches the asyncio policy to WindowsSelectorEventLoopPolicy on Windows, which breaks Playwright subprocess creation. Fixed by using an explicit ProactorEventLoop on Windows, and tracking the event loop per browser instance to detect cross-loop reuse.
Dead ternary 'copy' if has_audio else 'copy' always specified acodec=copy, causing FFmpeg to fail on AI-generated videos with no audio stream. Now only adds acodec=copy when an audio stream is actually present.
PersistenceService had two delete_task definitions. The first (now removed) only deleted the directory without updating the index file, leaving stale entries. In Python the second definition overrides the first, so the first was dead code causing confusion.
playwright install was called outside the uv virtual environment during Docker build, causing 'playwright: not found'. Fixed by using uv run playwright install --with-deps chromium.
cancel_task was overwriting the status of already-completed, failed, or cancelled tasks. Calling DELETE on a completed task would silently change its status to CANCELLED. Now returns False early for terminal states.
asset_based.py was passing voice_id= to TTSService but the parameter is named voice=. The wrong kwarg was silently swallowed by **params, so user voice configuration was always ignored and the default voice was used instead.
Removes [project.scripts] section from pyproject.toml that pointed to pixelle_video.cli:main — a module that doesn't exist. Running the installed commands crashed with ModuleNotFoundError. The app is launched via streamlit run web/app.py.