- Bump version 1.0.0 → 1.1.0 (tauri.conf.json, Cargo.toml, Cargo.lock); the
build script now derives the DMG name from tauri.conf.json so it won't drift.
- RELEASE_NOTES.md + CHANGELOG.md: document v1.1.0 (zero-dependency desktop
install, end-to-end clip pipeline, black-screen / stuck-list / retry-spam /
stuck-pipeline fixes, opt-in faster-whisper, Gemini→google-genai, CI unify +
repo cleanup).
- Drop two stale doc links to files removed in the cleanup
(QUICK_START_GUIDE, SYSTEM_REBUILD_GUIDE).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Videos without embedded subtitles (e.g. B站 without AI字幕) need Whisper to
generate subtitles, but bundling it would bloat every install. Instead let
users install it on demand from Settings → 语音识别, and pick which model.
Backend uses faster-whisper (CTranslate2, no PyTorch, ~214MB installed, several
times faster than openai-whisper, cross-platform) — chosen over mlx-whisper,
which hard-depends on torch (~2-3GB).
- whisper_runtime.py (new): pip-install faster-whisper into a user-writable dir
(<data>/whisper-runtime) using the bundled Python; add to sys.path; status +
coarse progress; uninstall. Never writes into the signed .app bundle.
- whisper_model_manager.py: tiny→large-v3 from Systran/faster-whisper-*,
background download via huggingface_hub, real status; cache under
<data>/whisper-models.
- speech_recognizer.py: subtitle generation rewritten from the `whisper` CLI to
faster-whisper's WhisperModel API → SRT; availability = runtime installed.
- speech_recognition.py API: /whisper/install, /whisper/uninstall,
/whisper/runtime-status (+ existing /whisper-models*).
- SpeechRecognitionConfig.tsx: was a stub; now a full UI (install button +
progress + log, model list with download/delete/status) wired to a new
speechApi in services/api.ts.
- build_macos_arm.sh: allowlist faster_whisper/ctranslate2/huggingface_hub in
the dependency guard (they're installed at runtime, imported lazily).
Verified end-to-end: install runtime → download tiny model → transcribe a real
video into a valid SRT, all through the API/runtime.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
After the CI unification, the PyInstaller / prepare_resources route scripts
were fully orphaned (referenced only by each other and stale docs). Remove the
cluster:
build_backend.py, prepare_resources.py, check_bundle_size.py, smoke_api.py,
build_desktop.py, dev_desktop.py, test_desktop.py, quick_build_check.sh,
build_release.py
scripts/ now holds only what's live: build_macos_arm.sh (the one packaging
route), verify_desktop.sh (backend smoke), monitor_whisper.py (runtime).
Rewrite scripts/README.md and BUILD_GUIDE.md to describe the single PBS route
accurately (they previously documented the dead PyInstaller flow), and fix the
stale build command in RELEASE_CHECKLIST.md.
Also removed a 94M stale _autoclip-backend-pyinstaller-bak left in
src-tauri/resources/ (untracked build junk).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The installed app opened but the project list was stuck forever on
"正在加载项目列表...". Root cause: GET /api/v1/projects/ returned HTTP 500
with `ModuleNotFoundError: No module named 'pytz'`. The portable build only
installs requirements.txt, but the backend imported packages the dev venv had
that were never listed there.
A static scan of backend imports against the portable runtime found 4 missing:
- pytz (broke the project list — hot path)
- openai } LLM provider SDKs — the AI clipping pipeline. These
- google-generativeai } lived only in install_llm_dependencies.py, so the
- dashscope } bundle shipped without them and any provider failed.
Add all 4 to requirements.txt. Verified the rebuilt app returns 200 for
/api/v1/projects/ on a clean PATH.
Also add a build-time dependency-completeness check to build_macos_arm.sh:
after installing deps + copying the backend, it AST-scans every third-party
import and fails the build if any can't be resolved in the portable runtime.
This turns "works in dev, 500s in the bundle" into a hard build error.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The desktop build started the backend fine on the build machine but would
fail on any clean Mac: video processing needs ffmpeg/ffprobe and neither was
usable for distribution.
Three compounding bugs, all fixed:
1. backend_manager.rs never set AUTOCLIP_FFMPEG_PATH, so the backend fell
back to `shutil.which("ffmpeg")` — i.e. the build machine's homebrew
ffmpeg. Now the launcher exports AUTOCLIP_FFMPEG_PATH / AUTOCLIP_FFPROBE_PATH
pointing at the bundled binaries (resources/ffmpeg/{ffmpeg,ffprobe}).
2. The build bundled only ffmpeg, not ffprobe (the backend needs both).
3. The bundled ffmpeg was homebrew's dynamic build (412KB, 57 /opt/homebrew
dylib deps) — dead on any machine without homebrew. The build now downloads
the STATIC arm64 ffmpeg+ffprobe (48MB each, zero non-system deps) from
osxexperts.net, cached under build/ffmpeg-cache, with a build-time assert
that fails if any homebrew dep reappears.
Also exclude stray *.rdb from the bundled backend source.
Verified end-to-end: full build → App+DMG; app launches with /opt/homebrew
stripped from PATH (clean-machine sim), backend starts, HTTP server responds;
bundled ffmpeg/ffprobe run under an empty environment.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>