[codex] Improve quick creation and rebrand studio#1
Draft
MofaceJojo wants to merge 30 commits into
Draft
Conversation
- Fade concat now pads each clip's tail (frozen frame + silence) before crossfading, so transitions consume padding instead of narration: adjacent narrations no longer overlap and total duration stays equal to the sum of all segments (audio-driven duration is preserved) - Frame duration probe failures now fall back to the known audio duration instead of hardcoding 1.0s - OmniVoice TTS retries transient failures (connect errors, timeouts, 5xx) with backoff; 4xx errors still fail fast - ComfyUI TTS audio download uses an explicit generous timeout instead of httpx's 5s default - Un-ignore tests/test_*.py so regression tests are tracked - Add regression tests covering the audio-duration-driven chain and the retry behaviour Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SUxhmjs5aLcsjqWQCi6qXD
…apshot) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-sfta4i' into codex/quick-create-and-morpheus-rebrand # Conflicts: # morpheus_video_studio/services/tts_service.py # morpheus_video_studio/services/video.py
…nore rule Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….py split Shot pacing (fixes "frantic cuts" and "frozen frame"): - StoryboardConfig gains shot_min/max_seconds, shot_max_count, and a hard max-hold cap; plan_visual_shots can exceed max_shots (ceiling 8) so long narrations never hold one still image too long - Quick-create UI gains a pacing profile select (shorts fast / YouTube calm), defaulting to calm for 16:9 landscape - Empty motion-effect selection now falls back to gentle motion; fully static frames require an explicit "none" choice - create_video_from_images cycles stills when the plan needs more shots than images (a truncating zip desynced audio/video) Delivery hardening: - video_qa.py QA gate after concat: stream integrity, audio-driven duration drift, freezedetect (static picture), silencedetect (broken narration); warnings attached to VideoGenerationResult - subtitle_export.py writes final.srt beside final.mp4 from real per-narration audio durations, for manual platform uploads Refactor: - split 1804-line services/video.py into a package: probe / motion / concat / segments / bgm mixins + VideoService facade; import surface unchanged ComfyUI workflows: - rewrite image_flux.json for installed flux1-schnell Q3 GGUF (core nodes only, 4 steps; verified end-to-end) - archive image_qwen.json and video_wan2.1_fusionx.json (models not installed / exceed 17GB unified memory) - retarget 国风古风 / 儿童绘本 / 日系二次元 presets to local models (nano_banana was a paid API, violating the zero-cost goal) Hygiene: - GitHub Actions CI running pytest with ffmpeg - remove dead web/pages/1_🎬_Home.py (unreferenced since rebrand) - roadmap: distribution stays manual by user decision; AiToEarn shelved Tests: 50 passed (was 38 at takeover). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> (Note: CI workflow file committed separately due to OAuth workflow-scope limits.)
452d2cf to
859c1c4
Compare
- describe the software as it exists: three design goals (zero-cost, reliable output, manual publishing), workshop pages, real pipeline - fix badges and clone URLs (repo is MofaceJojo/media-studio) - drop prototype leftovers: upstream community QR codes, papers table, stale three-column UI walkthrough, dead Windows-package/tutorial links - keep AIDC-AI prototype attribution and reference projects - refresh update log with July 2026 work Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Design system generated with the ui-ux-pro-max skill (persisted to design-system/morpheus-video-studio/MASTER.md): OLED dark studio — violet primary #7C3AED, waveform-green accent #22C55E, midnight background #0F172A, Inter typography. - .streamlit/config.toml: native dark theme so built-in widgets match - studio_shell.py: rewrite injected CSS on semantic design tokens; unified dark surfaces (was light panels on dark chrome), violet interaction states across buttons/tabs/radio/checkbox/slider/tags, distinct primary CTA, 44px touch targets, visible focus rings, sidebar active-page highlight, tabular numerals for metrics, prefers-reduced-motion support; legacy --studio-* aliases kept for page-level CSS - History page: fallback video placeholder now uses theme tokens (was hardcoded light gray) Verified in live preview across Studio / Video Workshop / Settings; no console errors; 50 tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The repo launcher pointed at the outdated ~/Applications copy (June 2 code). Now targets /Volumes/MACDATA/morpheus-video-studio, keeps the NO_PROXY / Playwright env vars, and when port 8501 is held by an old streamlit instance of this app it shuts it down automatically instead of failing with 'Port 8501 is not available'. Desktop copy synced. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User found the OLED black+violet too harsh. Offered three calmer directions via the ui-ux-pro-max palette database; user chose navy professional light: - off-white #F8FAFC background, white surfaces, slate text - navy #1E3A5F primary (buttons, tags, sliders, focus rings) - confirm-green #059669 accent (metric bars); mint #34D399 on navy - deep-navy #16304D sidebar and hero kept dark as brand anchors, with explicit light text and green active-page indicator - streamlit base theme flipped to light so BaseWeb widgets match - MASTER.md updated with the chosen palette as the source of truth Verified in live preview (Studio + Video Workshop, 1280px), no console errors, 50 tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ures OpenRouter reasoning models (gpt-oss, deepseek-r1, o-series) reject requests that disable reasoning outright with 400 'Reasoning is mandatory for this endpoint'. The OpenRouter default now sends effort=low + exclude=true instead of effort=none: mandatory-reasoning endpoints accept it, think-text stays out of the output, and models without reasoning support ignore it. Also add backoff retry (3 attempts) around chat.completions.create for rate limits (429 — common on free-tier models), 5xx and connection drops; other 4xx still fail fast. Applied to both text and structured output paths. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The base topic prompt is tuned for viewpoint-sharing ('like chatting
with a friend', resonate→inspire), which made science/TCM/ranking/
medical topics drift into life-insight chatter. Recipes overlay a
vertical-specific structure with hard factual requirements:
- 科普知识: counter-intuitive hook, one hard fact per scene, myth
debunk, actionable close; feelings-talk forbidden
- 中药百科: identity → 性味归经/efficacy (sourced classics + modern
research) → usage → contraindications; mandatory 遵医嘱 disclaimer;
no efficacy promises or dosages
- 排名盘点: suspense open, countdown N→1 with one hard fact per entry,
champion twist + interaction close
- 医学健康: symptom → mechanism → normal-vs-see-a-doctor → advice;
mandatory not-a-diagnosis disclaimer; no prescriptions, no panic
- general: unchanged default
Wired end-to-end: prompt injection point, generate_narrations_from_topic,
standard pipeline param, quick-create UI selector + draft path.
LLM hardening (surfaced by free-tier testing):
- strip leaked <think> blocks from message content
- treat HTTP-200-with-empty-choices (OpenRouter provider hiccup) as
transient and retry
Tests: 61 passed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 'video' workflows generated batch_size independent stills (no temporal linking) and stitched them at 6fps — a strobing slideshow, another source of the reported frame-flicker. The installed AnimateDiff-Evolved module (v3_sd15_mm.ckpt) was never wired in. Rebuilt both workflows with ADE_AnimateDiffLoaderGen1 (autoselect beta schedule): 16 frames @8fps (standard) / 12 frames @12 steps (fast). Measured adjacent-frame difference dropped 62.0 → 5.8 (-91%) on the same ghibli-style prompt — output is now a coherent motion clip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pending push: requires 'gh auth refresh -h github.com -s workflow' to grant the workflow scope, then 'git push'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CI has fewer optional dependencies, so route count differs by environment; assert only the essential health/tts/video routers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
comfykit lives in the project venv / CI install, not in every local interpreter; importorskip keeps the CI signal without false local reds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On CI a site-packages top-level 'api' module shadowed the repo's api/ package, so the smoke test loaded a bare FastAPI app with no routers. Purge cached 'api' modules and rely on the repo-root sys.path entry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- empty content with finish_reason=length now retries once with a 4x budget before failing, and the final error names instruct-type models to switch to - narration generators raise max_tokens 2000→6000: reasoning tokens count against the budget on free reasoning models (tencent/hy3, nemotron), which truncated narration JSON mid-array Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e page Root cause: preset detection required base_url AND model to both match a preset's defaults. A custom model on a known provider (any OpenRouter :free model) failed the match, so returning to Settings fell back to 'Custom', dropped the saved model from the provider view, and refused to reuse the saved API key — then the next save silently skipped the LLM section while still showing an overall success message. - presets: add find_preset_by_base_url(); provider detected by base_url alone keeps the saved custom model in the form - saved API key applies whenever the provider is unchanged (or both saved & selected are Custom) - settings page reloads config from disk on render, so external edits are shown instead of a stale boot-time snapshot being written back - partial save now shows an explicit error naming the missing fields instead of a success toast Also includes LLM hardening from this session: empty-content+length retries once with 4x budget; narration generators 2000→6000 tokens (reasoning tokens count against the budget on free reasoning models). Verified via live UI drive: save → navigate away → return keeps preset, custom model, and saved-key state. 61 tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
pixelle_videopackage and remaining Pixelle/Piexle branding tomorpheus_video_studio/ Morpheus Video StudioWhy
This consolidates the most-used creation controls into the main workflow, simplifies the Quick Create layout, and makes project branding consistent throughout the repository.
Impact
The Python import package is now
morpheus_video_studio; external scripts importingpixelle_videomust update their imports.Validation
python -m compileall -q morpheus_video_studio api webgit diff --checkpytestreports no test files in the repository